我最近的项目中,要使用proc来写一个动态调用存储过程的代码。问题描述:
其中存储过程名以及参数全部由外界传进来,存储过程返回一个游标(cursor)。存储过程的格式大概如下所示:
先是一个包头,里面就定义一些游标create or replace package ctsh_integration as TYPE intexternal_tp IS REF CURSOR;
TYPE intproduct_tp IS REF CURSOR;
TYPE payprepaid_tp IS REF CURSOR;
TYPE intsbucontrast_tp IS REF CURSOR;
TYPE intwaivedcontrast_tp IS REF CURSOR;其中一个存储过程如下:
create or replace procedure ctsh_inexidconfind_proc(
v_service_internal_id in NUMBER,
v_service_internal_id_resets in NUMBER,
v_crm_integration_id in VARCHAR2,
ctsh_inexidconfind_proc_cv IN OUT ctsh_integration.intexternal_tp
/*这里是存储过程中唯一的返回——游标*/
)
is
这里:存储过程ctsh_inexidconfind_proc首先插入一条数据,然后再返回一个游标。其它的存储过程也都只返回一个游标。我在网络上找到了一种用动态方法3实现的方法,如下:
/*定义变量*/
exec sql begin declare section;
long int service_internal_i=222;
long int service_internal_id_resets=0;
char crm_integration_id[]="AAASSZZ";
char *test = "begin ctsh_inexidconfind_proc(:v1,:v2,:v3,:v4); end;";
sql_cursor data;
exec sql end declare section; EXEC SQL ALLOCATE :data;EXEC SQL PREPARE S FROM :test;
EXEC SQL EXECUTE S USING :service_internal_i,:service_internal_id_resets,:crm_integration_id,:data;如果我使用EXEC SQL FETCH data INTO ......
则报错:游标未定义,同时不插入数据。
如果我不尝试访问data游标,则不报错,同时可以插入数据。
我怀疑查询结果已经返回了,只是访问方法出错。
请问其中的data游标如何访问?
还是说不能用这种方法动态访问存储过程?
如果不能还望指点一下如何实现。谢谢。注:需要任何信息,可以给我留言,我会尽快提供的。
其中存储过程名以及参数全部由外界传进来,存储过程返回一个游标(cursor)。存储过程的格式大概如下所示:
先是一个包头,里面就定义一些游标create or replace package ctsh_integration as TYPE intexternal_tp IS REF CURSOR;
TYPE intproduct_tp IS REF CURSOR;
TYPE payprepaid_tp IS REF CURSOR;
TYPE intsbucontrast_tp IS REF CURSOR;
TYPE intwaivedcontrast_tp IS REF CURSOR;其中一个存储过程如下:
create or replace procedure ctsh_inexidconfind_proc(
v_service_internal_id in NUMBER,
v_service_internal_id_resets in NUMBER,
v_crm_integration_id in VARCHAR2,
ctsh_inexidconfind_proc_cv IN OUT ctsh_integration.intexternal_tp
/*这里是存储过程中唯一的返回——游标*/
)
is
这里:存储过程ctsh_inexidconfind_proc首先插入一条数据,然后再返回一个游标。其它的存储过程也都只返回一个游标。我在网络上找到了一种用动态方法3实现的方法,如下:
/*定义变量*/
exec sql begin declare section;
long int service_internal_i=222;
long int service_internal_id_resets=0;
char crm_integration_id[]="AAASSZZ";
char *test = "begin ctsh_inexidconfind_proc(:v1,:v2,:v3,:v4); end;";
sql_cursor data;
exec sql end declare section; EXEC SQL ALLOCATE :data;EXEC SQL PREPARE S FROM :test;
EXEC SQL EXECUTE S USING :service_internal_i,:service_internal_id_resets,:crm_integration_id,:data;如果我使用EXEC SQL FETCH data INTO ......
则报错:游标未定义,同时不插入数据。
如果我不尝试访问data游标,则不报错,同时可以插入数据。
我怀疑查询结果已经返回了,只是访问方法出错。
请问其中的data游标如何访问?
还是说不能用这种方法动态访问存储过程?
如果不能还望指点一下如何实现。谢谢。注:需要任何信息,可以给我留言,我会尽快提供的。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货