从 PowerBuilder 执行 Oracle 函数
Execute Oracle function from 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_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 函数 - Google 知道,例如 PowerBuilder: Calling Oracle Stored Procedures and Functions,说
... a good approach is to first declare it as an external function and
then invoke it based on that declaration.
我不喜欢 copy/pasting 这里的内容,因为它很可能是错误的(正如我所说,我不使用该软件产品)。
但是,我对您发布的代码有一些异议。如果出现 off-topic.
,我深表歉意
"Some relevant code" - 这行不通 就像那样;您在该功能中执行什么 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_TRANSACTION 和 COMMIT DML(尽管 COMMIT 已经存在,所以可能还有 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>
AskTom 说这样的事情是 邪恶的 ,所以 - 考虑改用带有 OUT 参数的过程。
此外,您是否意识到这样的异常处理程序对最终用户没有用?他们永远看不到 DBMS_OUTPUT.PUT_LINE 结果。另一方面,看到 "v_debug_line" 建议您将它用于调试目的 - 在这种情况下,我对此没有异议。
但实际上,尽量不要在函数中使用 DML。
再次抱歉,如果它无关紧要并且您坚持保持原样。
在此示例中,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;
将存储过程声明为用户对象的外部函数:
在用户对象画笔的脚本视图中,第一个列表中的 select [声明] 和第二个列表中的本地外部函数。
将光标置于“声明本地外部函数”视图中。
从 pop-up 菜单或“编辑”菜单,select 选择性粘贴>SQL>远程存储过程。
PowerBuilder 从您的数据库加载存储过程并显示“远程存储过程”对话框。
Select 一个或多个要声明为用户对象函数的存储过程的名称,然后单击“确定”。
PowerBuilder 从数据库中检索存储过程声明并将每个声明粘贴到视图中。
例如,以下是当您 select F_VALIDATION:
时显示在一行上的声明
function double F_VALIDATION(datetime F_DATE) RPCFUNC ALIAS FOR "F_VALIDATION"
假设:
您的 SQLCA 连接到编译 F_VALIDATION 的同一架构。
PowerBuilder 代码存在于您声明 F_VALIDATION 的对象中。
下面是如何调用该函数的示例。
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
我有一个只有一个参数的 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 函数 - Google 知道,例如 PowerBuilder: Calling Oracle Stored Procedures and Functions,说
... a good approach is to first declare it as an external function and then invoke it based on that declaration.
我不喜欢 copy/pasting 这里的内容,因为它很可能是错误的(正如我所说,我不使用该软件产品)。
但是,我对您发布的代码有一些异议。如果出现 off-topic.
,我深表歉意"Some relevant code" - 这行不通 就像那样;您在该功能中执行什么 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_TRANSACTION 和 COMMIT DML(尽管 COMMIT 已经存在,所以可能还有 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>
AskTom 说这样的事情是 邪恶的 ,所以 - 考虑改用带有 OUT 参数的过程。
此外,您是否意识到这样的异常处理程序对最终用户没有用?他们永远看不到 DBMS_OUTPUT.PUT_LINE 结果。另一方面,看到 "v_debug_line" 建议您将它用于调试目的 - 在这种情况下,我对此没有异议。
但实际上,尽量不要在函数中使用 DML。
再次抱歉,如果它无关紧要并且您坚持保持原样。
在此示例中,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;
将存储过程声明为用户对象的外部函数:
在用户对象画笔的脚本视图中,第一个列表中的 select [声明] 和第二个列表中的本地外部函数。
将光标置于“声明本地外部函数”视图中。 从 pop-up 菜单或“编辑”菜单,select 选择性粘贴>SQL>远程存储过程。
PowerBuilder 从您的数据库加载存储过程并显示“远程存储过程”对话框。
Select 一个或多个要声明为用户对象函数的存储过程的名称,然后单击“确定”。
PowerBuilder 从数据库中检索存储过程声明并将每个声明粘贴到视图中。
例如,以下是当您 select F_VALIDATION:
时显示在一行上的声明function double F_VALIDATION(datetime F_DATE) RPCFUNC ALIAS FOR "F_VALIDATION"
假设:
您的 SQLCA 连接到编译 F_VALIDATION 的同一架构。
PowerBuilder 代码存在于您声明 F_VALIDATION 的对象中。
下面是如何调用该函数的示例。
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