免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3761 | 回复: 7
打印 上一主题 下一主题

存储过程中 动态sql的 问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-30 01:54 |只看该作者 |倒序浏览
PREPARE <CURSORNAME>; FOR <CURSORSQLSTATMENT>; ;
OPEN <CURSORNAME>;;
....
FETCH ....
ls_stmt = 'DELETE FROM ' || ls_TABLENAME || ' WHERE CURRENT OF <CURSORNAME>;' ;
EXECUTE IMMEDIATE ls_stmt; -- 此处运行时报错

建立时没有报错。但在运行时说 <CURSORNAME>; 未定义。。之前已经定义并成功FETCH了。!
难道DELTE FROM ...WHERE CURRENT OF ... 的语法不能用于动态SQL ?
请赐教 THX

论坛徽章:
0
2 [报告]
发表于 2005-08-30 18:37 |只看该作者

存储过程中 动态sql的 问题

我这里测试了一下没有问题的,应该是你游标定义有不对吧。

论坛徽章:
0
3 [报告]
发表于 2005-08-30 21:51 |只看该作者

存储过程中 动态sql的 问题

声明应该没有 问题啊 。 能正常 FETCH  和 用静态的 WHERE CURRENT OF 删除。但一用到 动态sql 就 出现 ‘游标未定义的错误’ 了

论坛徽章:
0
4 [报告]
发表于 2005-08-31 08:52 |只看该作者

存储过程中 动态sql的 问题

你能说说你的coding吗? 我的大概 是这个样子 的

DECLARE CUR CURCOR FOR CC;
SET ls_CUR = '...'
PREPARE CUR  FOR ls_CUR ;
OPEN CUR
FETCH ...
-- DELETE FROM XXX WHERE CURRENT OF  CUR ; (成功)
ls_stmt = 'DELETE FROM ' || ls_TABLENAME || ' WHERE CURRENT OF <CURSORNAME>;' ;
EXECUTE IMMEDIATE ls_stmt;  (失败)

论坛徽章:
0
5 [报告]
发表于 2005-08-31 11:00 |只看该作者

存储过程中 动态sql的 问题

你定义的游标的表与delete的表不是同一个吧?

论坛徽章:
0
6 [报告]
发表于 2005-08-31 23:21 |只看该作者

存储过程中 动态sql的 问题

是同一个  
其实就想实现一个 分段提交的 删除表的 存储过程

。。

论坛徽章:
0
7 [报告]
发表于 2005-09-06 10:46 |只看该作者

存储过程中 动态sql的 问题

顶一下

我的代码, 建立成功, 运行时报错EL_CUR 未定义
  1. DROP PROCEDURE sp_DelTable@
  2. CREATE PROCEDURE sp_DelTable(IN as_TableName VARCHAR(128) ,
  3.                                                          IN as_Condition VARCHAR(1024) ,                                       
  4.                                                          IN abi_CommitCount BIGINT,
  5.                                                          OUT SV_RTNTEXT VARCHAR(128))
  6. LANGUAGE SQL
  7. BEGIN
  8.         DECLARE         sm_End                         SMALLINT  DEFAULT 0;       
  9.         DECLARE         retcode                         INTEGER DEFAULT 0;        
  10.         DECLARE  SQLCODE                           INTEGER DEFAULT 0;
  11.         DECLARE         ls_TableName                 VARCHAR(128);          
  12.         DECLARE         ls_IntactStmt                 VARCHAR(1308);   
  13.         DECLARE  ls_DelStmt                        VARCHAR(128);          
  14.         DECLARE  ls_Stmt                        VARCHAR(128);          
  15.         DECLARE  CC                        VARCHAR(128);
  16.         DECLARE         lbi_CommitCount        BIGINT;                 
  17.         DECLARE  li_tmp                                INTEGER;                                
  18.         DECLARE  DEL_CUR Cursor For CC;
  19.        
  20.         DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
  21.         BEGIN                                          
  22.                 SET sm_End = 1;
  23.                 SET retcode = SQLCODE;       
  24.                 SET SV_RTNTEXT = 'retcode = '||char(retcode) ;
  25.                 RESIGNAL;                   --给调用者发出原错误信息       
  26.         END;
  27.         --DECLARE  DEL_CUR Cursor For CC;

  28.         SET ls_IntactStmt = 'SELECT 1 FROM ' || as_TableName || ' WHERE ' || as_Condition ;
  29.         PREPARE CC FROM ls_IntactStmt;       
  30.         OPEN DEL_CUR;
  31.        
  32.         SET ls_DelStmt = 'DELETE FROM tb_lane WHERE CURRENT OF DEL_CUR';
  33.         --PREPARE ls_Stmt from ls_DelStmt;
  34.                
  35.         -- del all data loop.
  36.         Del_Loop:                                                                 
  37.         Loop
  38.                 -- when reach the commit count then commit/       
  39.                 SET lbi_CommitCount = 0 ;       
  40.                
  41.                 Commit_Loop:
  42.                 Loop
  43.                         Fetch DEL_CUR INTO  li_tmp ;       
  44.                        
  45.                         If (sm_End = 1) Then                                
  46.                                 -- has del all data , go to end                                
  47.                                 SET sm_End = 0 ;
  48.                                 Leave Del_Loop ;
  49.                         End If ;                                       
  50.                         EXECUTE immediate ls_DelStmt ;                        
  51.                        
  52.                         Set lbi_CommitCount = lbi_CommitCount + 1 ;                                                                                                                                                       
  53.                                 If (lbi_CommitCount = abi_CommitCount) Then
  54.                                 -- has reached the commit count                                                                                                                                        
  55.                                 Leave Commit_Loop;
  56.                         End If ;         
  57.                 End Loop Commit_Loop;       
  58.                 COMMIT;       
  59.         End Loop Del_Loop;       
  60.         COMMIT;                                                  
  61.        
  62.         CLOSE DEL_CUR;
  63.         set SV_RTNTEXT=ls_DelStmt;
  64. END@
复制代码

论坛徽章:
0
8 [报告]
发表于 2005-09-17 11:17 |只看该作者

存储过程中 动态sql的 问题

没有人知道吗 ?? 如果动态sql 不支持 current cursor of  也应该有个定论吧.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP