怎樣動態調用有輸出參數的ORACLE 存儲過程?注意是動態調用!解决方案
怎樣動態調用有輸出參數的ORACLE 存儲過程?注意是動態調用!!
oracle 存儲過程如下:
create or replace procedure CLT_INV_R001_PRO(
p_dummy1 out varchar2,
p_dummy2 out varchar2,
p_inv_org_id in number,
p_phy_inv_id in number) is
。。。。。。。。
在PB中怎樣動態調用?
我的代碼如下,當沒有p_dummy1 ,p_dummy2 兩個參數的時候,下面的代碼能夠正確執行,但是如果有這個輸出參數的話,下面的代碼在執行【EXECUTE DYNAMIC p2 USING :B,A: DESCRIPTOR sqlda 】完后,發生錯誤
sqlca.sqlerrtext為:ORA-06550: 第 1 行, 第 15 個欄位:
PLS-00703: 清單中有具名參數的多個執行處理
ORA-06550: 第 1 行, 第 15 個欄位:
PL/SQL: Statement ignored
。。。。
PB代碼如下:
ls_sql="execute clt_inv_r001_pro(?,?)"
DECLARE p2 DYNAMIC PROCEDURE FOR SQLSA;
PREPARE SQLSA FROM :ls_sql;
DESCRIBE SQLSA INTO sqlda ;
int a,b
// SetDynamicParm(SQLDA,3,a)
// SetDynamicParm(SQLDA,4,b)
EXECUTE DYNAMIC p2 USING DESCRIPTOR sqlda ;
if sqlca.sqlcode<0 then
ss=sqlca.sqlerrtext
CLOSE p2 ;
end if
------解决方案--------------------
oracle 存儲過程如下:
create or replace procedure CLT_INV_R001_PRO(
p_dummy1 out varchar2,
p_dummy2 out varchar2,
p_inv_org_id in number,
p_phy_inv_id in number) is
。。。。。。。。
在PB中怎樣動態調用?
我的代碼如下,當沒有p_dummy1 ,p_dummy2 兩個參數的時候,下面的代碼能夠正確執行,但是如果有這個輸出參數的話,下面的代碼在執行【EXECUTE DYNAMIC p2 USING :B,A: DESCRIPTOR sqlda 】完后,發生錯誤
sqlca.sqlerrtext為:ORA-06550: 第 1 行, 第 15 個欄位:
PLS-00703: 清單中有具名參數的多個執行處理
ORA-06550: 第 1 行, 第 15 個欄位:
PL/SQL: Statement ignored
。。。。
PB代碼如下:
ls_sql="execute clt_inv_r001_pro(?,?)"
DECLARE p2 DYNAMIC PROCEDURE FOR SQLSA;
PREPARE SQLSA FROM :ls_sql;
DESCRIBE SQLSA INTO sqlda ;
int a,b
// SetDynamicParm(SQLDA,3,a)
// SetDynamicParm(SQLDA,4,b)
EXECUTE DYNAMIC p2 USING DESCRIPTOR sqlda ;
if sqlca.sqlcode<0 then
ss=sqlca.sqlerrtext
CLOSE p2 ;
end if
------解决方案--------------------
- C/C++ code
Example 3 Given this procedure: CREATE OR REPLACE PROCEDURE spu_edt_object( o_id_object OUT NUMBER, o_message OUT VARCHAR2, a_id_object NUMBER, a_param VARCHAR2 := NULL, a_value VARCHAR2 := NULL ) as begin o_id_object := 12345; o_message := 'Hello World'; end; The DECLARE statement must use named notation because output parameters are defined to the left of input parameters: dec{0} o_id_object, id_obiect = 54321 string o_message, param = 'Test' DECLARE proc_update PROCEDURE FOR spu_edt_object ( a_id_object => :id_object, a_param => :param ) USING SQLCA; EXECUTE proc_update; if SQLCA.SqlCode 0 then SQLCA.f_out_error() RETURN -1 end if FETCH proc_update INTO :o_id_object, o_message; if SQLCA.SqlCode 0 then SQLCA.f_out_error() CLOSE proc_update; RETURN -1 end if --PB帮助例子参考
------解决方案--------------------
改成用数据窗口去做吧,输出一个结果集,这样好些;
也可以试试在定义的时候把输出参数放在后面;