请教高手关于动态游标的问题?

cmaboy 2003-10-17 12:49:40
帮我看看,这个给怎么改?
create or replace function f_db_s_getmodifydata(as_tabname varchar2,ai_dbtid integer) return integer is
/***********************************************
*功能描述:根据传入的后台数据表的名称和标示,将其中需要报送的数据,生成动态SQL语句
* 保存到临时数据表中
*传入参数:as_tabname varchar2 后台数据表名称
* ai_dbtaid integer 后台数据表的标示
*返回值:成功,返回需要上报的数据行数,否则,出现异常,返回-1
***********************************************/
v_rownum integer; --返回数据行数
v_rowid varchar2(50); --数据记录的行标示
v_dy_sql_cur varchar2(300); --声明动态游标的字符串
cur_dy_find cursor;
begin
--取得记录数
v_dy_sql_cur :='select count(*) from'||as_tabname||' where bsflag=''1'' or bsflag=''2'' ';
execute immediate v_dy_sql_cur into v_rownum ;
--声明动态游标, 取得rowid
v_dy_sql_cur :=' select rowid from '||as_tabname||' where bsflag=''1'' or bsflag=''2'' ';
open cur_dy_find for v_dy_dql_cur;
loop
fetch cur_dy_find into v_rowid;
exit when cur_dy_find%notfound;
f_db_s_getmodifydata_sava(as_tabname ,ai_dbtid ,v_rowid);
end loop;
close cur_dy_find;
 return v_rownum;
EXCEPTION
  WHEN OTHERS THEN
  RETURN -1;--例外处理
end f_db_s_getmodifydata;
...全文
40 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cmaboy 2003-10-17
  • 打赏
  • 举报
回复
谢谢,搞定了
beckhambobo 2003-10-17
  • 打赏
  • 举报
回复
报什么错?把出错信息贴出来
beckhambobo 2003-10-17
  • 打赏
  • 举报
回复
cur_dy_find cursor;
修改为:
type t_sor is ref cursor;
cur_dy_find t_sor;
cmaboy 2003-10-17
  • 打赏
  • 举报
回复
我改了
create or replace function f_db_s_getmodifydata(as_tabname varchar2,ai_dbtid integer) return integer is
/***********************************************
*功能描述:根据传入的后台数据表的名称和标示,将其中需要报送的数据,生成动态SQL语句
* 保存到临时数据表中
*传入参数:as_tabname varchar2 后台数据表名称
* ai_dbtaid integer 后台数据表的标示
*返回值:成功,返回需要上报的数据行数,否则,出现异常,返回-1
*作者:陈敏
***********************************************/
v_rownum integer; --返回数据行数
v_fun_test integer; --程序执行判断
v_rowid varchar2(50); --数据记录的行标示
v_dy_sql_cur varchar2(300); --声明动态游标的字符串
cur_dy_find cursor;

begin
begin
--取得记录数
/*v_dy_sql_cur :='select count(*) from'||as_tabname||' where bsflag=''1'' or bsflag=''2'' ';*/
execute immediate v_dy_sql_cur into v_rownum ;
--删除其他数据表生成的纪录
execute immediate 'delete from temp_sendtable; commit;';
exception
when others then
return -1;
end;

--声明动态游标, 取得rowid
v_dy_sql_cur :=' select rowid from '||as_tabname||' where bsflag=''1'' or bsflag=''2'' ';
open cur_dy_find for v_dy_sql_cur;

fetch cur_dy_find into v_rowid;
while cur_dy_find%found loop
v_fun_test := f_db_s_getmodifydata_sava(as_tabname,ai_dbtid,v_rowid);
fetch cur_dy_find into v_rowid;
end loop;
close cur_dy_find;
return v_rownum;
exception
when others then
return -1;--例外处理
end f_db_s_getmodifydata;

还是不能通过编译,出现如下的提示:
Compilation errors for FUNCTION KDCERP2.F_DB_S_GETMODIFYDATA
Error: PLS-00201: 必须说明标识符 'CURSOR'
Line: 14
Text: cur_dy_find cursor;

Error: PL/SQL: Item ignored
Line: 14
Text: cur_dy_find cursor;

Error: PLS-00320: 此表达式的类型说明不完整或格式错误
Line: 30
Text: open cur_dy_find for v_dy_sql_cur;

Error: PL/SQL: Statement ignored
Line: 30
Text: open cur_dy_find for v_dy_sql_cur;

Error: PLS-00320: 此表达式的类型说明不完整或格式错误
Line: 32
Text: fetch cur_dy_find into v_rowid;

Error: PL/SQL: SQL Statement ignored
Line: 32
Text: fetch cur_dy_find into v_rowid;

Error: PLS-00320: 此表达式的类型说明不完整或格式错误
Line: 33
Text: while cur_dy_find%found loop

Error: PL/SQL: Statement ignored
Line: 33
Text: while cur_dy_find%found loop

Error: PLS-00320: 此表达式的类型说明不完整或格式错误
Line: 37
Text: close cur_dy_find;

Error: PL/SQL: SQL Statement ignored
Line: 37
Text: close cur_dy_find;
cmaboy 2003-10-17
  • 打赏
  • 举报
回复
不管在什么地方,发生异常肯定退出
beckhambobo 2003-10-17
  • 打赏
  • 举报
回复
begin
begin
--取得记录数
v_dy_sql_cur :='select count(*) from'||as_tabname||' where bsflag=''1'' or bsflag=''2'' ';
execute immediate v_dy_sql_cur into v_rownum ;
EXCEPTION
  WHEN OTHERS THEN
  RETURN -1;--例外处理
end;
--声明动态游标, 取得rowid
v_dy_sql_cur :=' select rowid from '||as_tabname||' where bsflag=''1'' or bsflag=''2'' ';
open cur_dy_find for v_dy_dql_cur;
loop
fetch cur_dy_find into v_rowid;
exit when cur_dy_find%notfound;
f_db_s_getmodifydata_sava(as_tabname ,ai_dbtid ,v_rowid);
end loop;
close cur_dy_find;
 return v_rownum;

end f_db_s_getmodifydata;

楼主是否发生例外事件后,也一定要执行f_db_s_getmodifydata_sava(as_tabname ,ai_dbtid ,v_rowid); 此过程?

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧