从PowerBuilder执行Oracle函数

从PowerBuilder执行Oracle函数,oracle,function,plsql,call,powerbuilder,Oracle,Function,Plsql,Call,Powerbuilder,我有一个带一个参数的Oracle函数。我需要从PowerBuilder调用它。这可能吗?如果是,怎么做?谢谢 我的职能: CREATE OR REPLACE FUNCTION OPEN.F_VALIDATION (f_date DATE) RETURN NUMBER IS v_an number; v_debug_line varchar2(20); BEGIN /*some relevant code - delete, selects, updates, inserts*/ DBMS

我有一个带一个参数的Oracle函数。我需要从PowerBuilder调用它。这可能吗?如果是,怎么做?谢谢

我的职能:

CREATE OR REPLACE FUNCTION OPEN.F_VALIDATION (f_date DATE)
   RETURN NUMBER
IS
v_an number;
v_debug_line varchar2(20);
BEGIN
/*some relevant code - delete, selects, updates, inserts*/

DBMS_OUTPUT.put_line ('OK');
   COMMIT;
   RETURN v_an;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line ('v_debug_line: ' || v_debug_line);
      DBMS_OUTPUT.put_line (
         'ERROR: ' || SQLERRM);
      ROLLBACK;

      DBMS_OUTPUT.put_line ('ERROR');
      RETURN v_an;
END F_VALIDATION ;

我不知道如何从PowerBuilder中调用Oracle函数——例如,谷歌知道这样说

。。。一个好方法是首先将其声明为外部函数,然后 然后根据该声明调用它

我不想在这里复制/粘贴这些内容,因为它很可能是错误的(正如我所说,我不使用那个软件产品)

然而,我对你发布的代码有一些异议。如果偏离主题,我道歉

“一些相关代码”-这不会像那样工作;您在该功能中执行什么DML(以及为什么执行)

SQL> create or replace function f_test
  2    return number
  3  is
  4  begin
  5    insert into dept (deptno, dname) values (99, 'test');
  6    return 1;
  7  end;
  8  /

Function created.

SQL> select f_test from dual;
select f_test from dual
       *
ERROR at line 1:
ORA-14551: cannot perform a DML operation inside a query
ORA-06512: at "SCOTT.F_TEST", line 5
如果您想在函数中执行DML,您将错过PRAGMA AUTONOMOUS_事务并提交DML(虽然,提交已经存在,所以可能存在PRAGMA ass),但这可能不是一个好主意

SQL> create or replace function f_test
  2    return number
  3  is
  4    pragma autonomous_transaction;
  5  begin
  6    insert into dept (deptno, dname) values (99, 'test');
  7    commit;
  8    return 1;
  9  end;
 10  /

Function created.

SQL> select f_test from dual;

    F_TEST
----------
         1

SQL>

表示这样的事情是邪恶的,所以-考虑使用一个带有out参数的过程。 此外,您是否意识到这样的异常处理程序对最终用户没有任何用处?他们永远看不到DBMS_OUTPUT.PUT_行结果。另一方面,看到“v_debug_line”表明您将其用于调试目的——在这种情况下,我对此没有异议

但实际上,尽量不要在函数中使用DML

double ld_result
ad_date = datetime( today(), now() )

ld_result = F_VALIDATION( ad_date )

if sqlca.sqlcode = -1 then
    //Some error handling
    //messagebox("Unexpected error", "Error calling F_VALIDATION. database error message=" + sqlca.sqlerrtext )
    ld_result = -1
end if

再一次,如果它是不相关的,请道歉&您坚持让它保持原样。

我不知道如何从PowerBuilder调用Oracle函数,例如,谷歌知道这样说

。。。一个好方法是首先将其声明为外部函数,然后 然后根据该声明调用它

我不想在这里复制/粘贴这些内容,因为它很可能是错误的(正如我所说,我不使用那个软件产品)

然而,我对你发布的代码有一些异议。如果偏离主题,我道歉

“一些相关代码”-这不会像那样工作;您在该功能中执行什么DML(以及为什么执行)

SQL> create or replace function f_test
  2    return number
  3  is
  4  begin
  5    insert into dept (deptno, dname) values (99, 'test');
  6    return 1;
  7  end;
  8  /

Function created.

SQL> select f_test from dual;
select f_test from dual
       *
ERROR at line 1:
ORA-14551: cannot perform a DML operation inside a query
ORA-06512: at "SCOTT.F_TEST", line 5
如果您想在函数中执行DML,您将错过PRAGMA AUTONOMOUS_事务并提交DML(虽然,提交已经存在,所以可能存在PRAGMA ass),但这可能不是一个好主意

SQL> create or replace function f_test
  2    return number
  3  is
  4    pragma autonomous_transaction;
  5  begin
  6    insert into dept (deptno, dname) values (99, 'test');
  7    commit;
  8    return 1;
  9  end;
 10  /

Function created.

SQL> select f_test from dual;

    F_TEST
----------
         1

SQL>

表示这样的事情是邪恶的,所以-考虑使用一个带有out参数的过程。 此外,您是否意识到这样的异常处理程序对最终用户没有任何用处?他们永远看不到DBMS_OUTPUT.PUT_行结果。另一方面,看到“v_debug_line”表明您将其用于调试目的——在这种情况下,我对此没有异议

但实际上,尽量不要在函数中使用DML

double ld_result
ad_date = datetime( today(), now() )

ld_result = F_VALIDATION( ad_date )

if sqlca.sqlcode = -1 then
    //Some error handling
    //messagebox("Unexpected error", "Error calling F_VALIDATION. database error message=" + sqlca.sqlerrtext )
    ld_result = -1
end if

再一次,如果与此无关,请道歉&您坚持保持原样。

在本例中,Oracle函数在应用程序连接的同一架构中声明

CREATE OR REPLACE FUNCTION F_VALIDATION(f_date DATE) RETURN NUMBER IS
  v_an number;
begin

  /* If f_date is today then 1 else 0 */
  select decode(to_date(sysdate), f_date, 1, 0) into v_an from dual;
  RETURN v_an;

EXCEPTION
  WHEN OTHERS THEN
    /* This will never happen */
    v_an := -1;
    RETURN v_an;
END F_VALIDATION;
要将存储过程声明为用户对象的外部函数,请执行以下操作:

  • 在User Object painter的脚本视图中,从第一个列表中选择[Declare],从第二个列表中选择Local External Functions

  • 将光标放在“声明本地外部函数”视图中。 从弹出菜单或编辑菜单中,选择“粘贴特殊”>“SQL”>“远程存储过程”

  • PowerBuilder从数据库加载存储过程,并显示“远程存储过程”对话框

  • 选择要声明为用户对象函数的一个或多个存储过程的名称,然后单击“确定”

  • PowerBuilder从数据库中检索存储过程声明,并将每个声明粘贴到视图中

  • 例如,以下是选择F_VALIDATION时在一行显示的声明:

    “F_验证”的函数双F_验证(日期时间F_日期)RPCFUNC别名

假设:

  • SQLCA连接到编译F_验证的同一架构

  • PowerBuilder代码存在于您声明F_验证的对象中

下面是一个如何调用函数的示例

double ld_result
ad_date = datetime( today(), now() )

ld_result = F_VALIDATION( ad_date )

if sqlca.sqlcode = -1 then
    //Some error handling
    //messagebox("Unexpected error", "Error calling F_VALIDATION. database error message=" + sqlca.sqlerrtext )
    ld_result = -1
end if

在本例中,Oracle函数在应用程序连接的同一架构中声明

CREATE OR REPLACE FUNCTION F_VALIDATION(f_date DATE) RETURN NUMBER IS
  v_an number;
begin

  /* If f_date is today then 1 else 0 */
  select decode(to_date(sysdate), f_date, 1, 0) into v_an from dual;
  RETURN v_an;

EXCEPTION
  WHEN OTHERS THEN
    /* This will never happen */
    v_an := -1;
    RETURN v_an;
END F_VALIDATION;
要将存储过程声明为用户对象的外部函数,请执行以下操作:

  • 在User Object painter的脚本视图中,从第一个列表中选择[Declare],从第二个列表中选择Local External Functions

  • 将光标放在“声明本地外部函数”视图中。 从弹出菜单或编辑菜单中,选择“粘贴特殊”>“SQL”>“远程存储过程”

  • PowerBuilder从数据库加载存储过程,并显示“远程存储过程”对话框

  • 选择要声明为用户对象函数的一个或多个存储过程的名称,然后单击“确定”

  • PowerBuilder从数据库中检索存储过程声明,并将每个声明粘贴到视图中

  • 例如,以下是选择F_VALIDATION时在一行显示的声明:

    “F_验证”的函数双F_验证(日期时间F_日期)RPCFUNC别名

假设:

  • SQLCA连接到编译F_验证的同一架构

  • PowerBuilder代码存在于您声明F_验证的对象中

下面是一个如何调用函数的示例

double ld_result
ad_date = datetime( today(), now() )

ld_result = F_VALIDATION( ad_date )

if sqlca.sqlcode = -1 then
    //Some error handling
    //messagebox("Unexpected error", "Error calling F_VALIDATION. database error message=" + sqlca.sqlerrtext )
    ld_result = -1
end if

在PowerBuilder中调用Oracle函数的另一种方法,假设您的应用程序已连接到数据库:

long l_rc
date d_date = today()

SELECT open.f_validation( :d_date )
INTO :l_rc
FROM dual;

if sqlca.sqlcode <> 0 then
    messagebox( "Exception", "Unable to validate:~r~n" + sqlca.sqlerrtext )
end if
long l\u rc
日期d_日期=今天()
选择打开。f_验证(:d_日期)
进入:l_rc
来自双重;
如果sqlca.sqlcode为0,则
messagebox(“异常”,“无法验证:~r~n”+sqlca.sqlerrtext)
如果结束

调用Oracle函数的另一种方法