使用一个引用游标处理两个不同的查询

Posted

技术标签:

【中文标题】使用一个引用游标处理两个不同的查询【英文标题】:Handle two different queries with one ref cursor 【发布时间】:2013-07-31 13:27:37 【问题描述】:

我有两个选择查询,我想 为他们俩打开光标?


v_str1:='SELECT ROWID FROM ' || p_tblname|| 'WHERE '|| p_cname||'='''||
       p_cvalue || '''';

v_str2:='SELECT COUNT ( * ) INTO v_cnt FROM ' || p_tblname|| 'WHERE '|| p_cname||' = '''||p_cvalue||'''';

.....

OPEN ref_cur_name FOR v_str1 LOOP

  IF v_cnt = 1
  THEN
     EXIT;
  ELSE

    EXECUTE IMMEDIATE 'DELETE FROM '||  p_tblname||
           'WHERE   ROWID = REC.ROWID';
  END IF;

  v_cnt := v_cnt - 1;

END LOOP;

第一个查询是一个 select 语句,其他的只是将计数放入 v_cnt 。现在我需要执行这两个查询。现在有没有办法同时使用这两个查询?

OPEN 语句后也有语法错误,即在循环。

【问题讨论】:

请分享错误信息? ` 找到 'LOOP',期待: ;使用-或- || -or- / -or- ** -or- (+) -or- % 。 [ -or- : @CASE CONNECT_BY_ROOT 十进制数 EXISTS FALSE float integer NEW PRIOR SQL TRUE -or- ( * + - AT CONTINUE CURSOR DAY identifier MOD MODEL MULTISET NOT NULL REM string THE WHEN YEAR` 我在打开后缺少分号。 我找到了解决方案。问题是分号; 【参考方案1】:

使用立即执行

EXECUTE IMMEDIATE 'SELECT   COUNT ( * )
 INTO   v_cnt
 FROM  '                                                                                                            ||
  p_tblname||
'WHERE  '|| p_cname||' = '''||p_cvalue||'''';

【讨论】:

以上是关于使用一个引用游标处理两个不同的查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle游标和游标变量的区别

MySQL存储过程,处理多个游标和查询结果

在其他两个游标中找到游标时如何从表中删除

SQL Server游标

REF CURSOR 总结

MYSQL 游标学习及使用实例