首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态SQL循环

动态SQL循环
EN

Stack Overflow用户
提问于 2014-01-13 19:55:22
回答 1查看 24.6K关注 0票数 2

动态SQL不是我的朋友,基本上我的想法是,我可以使用带有"p_in_table“参数的过程来获取表中包含的行数。

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE how_many_rows(p_in_table VARCHAR2)
IS
  TYPE cur_cur IS REF CURSOR;
  v_cur_cur  cur_cur;
  v_rowcount NUMBER(28);
  v_cur_txt  VARCHAR2(299);    
  BEGIN
    v_cur_txt := 'SELECT * FROM ' || p_in_table;

    OPEN v_cur_cur FOR v_cur_txt;

    LOOP
      v_rowcount := v_cur_cur%ROWCOUNT;
      EXIT WHEN v_cur_cur%NOTFOUND;
    END LOOP;

    CLOSE v_cur_cur;

    dbms_output.put_line(v_rowcount);
  END;

如果有人告诉我我做错了什么,我会很感激的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-13 20:14:00

问题是你没有遍历游标-没有fetch语句或类似的东西,所以,基本上,你有一个无限循环。为了避免这种情况,你需要这样做:

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE how_many_rows
   (p_in_table VARCHAR2) IS
   TYPE cur_cur IS REF CURSOR;
   v_cur_cur cur_cur;
   v_rowcount NUMBER(28);
   v_cur_txt VARCHAR2(299);
   v_row SOME_TABLE%ROWTYPE; --add row variable
BEGIN
   v_cur_txt := 'SELECT * FROM '|| p_in_table;

OPEN v_cur_cur FOR v_cur_txt;
   LOOP
      v_rowcount := v_cur_cur%ROWCOUNT;
      FETCH v_cur_cur INTO v_row; --fetch a row in it
         EXIT WHEN v_cur_cur%NOTFOUND;
   END LOOP;
CLOSE v_cur_cur;

DBMS_OUTPUT.PUT_LINE(v_rowcount);
END;

但是,正如您所看到的,要做到这一点,您需要知道查询的是哪个表,所以这不是通用的解决方案。也许可以解决这个问题,但我建议您使用更简单有效的方法,例如使用EXECUTE IMMEDIATE:

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE HOW_MANY_ROWS(p_in_table VARCHAR2)
       IS
v_tmp NUMBER;
BEGIN

EXECUTE IMMEDIATE 'SELECT COUNT(1) FROM ' || p_in_table INTO v_tmp;
DBMS_OUTPUT.PUT_LINE(v_tmp);

END;

好的,我考虑了如何使用你的方法来实现这一点,这是我最终得到的结果--只需从你的表中获取ROWNUM,每个表都有它,并且你知道它是type - NUMBER。所以这个过程在一般情况下是有效的:

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE how_many_rows
   (p_in_table VARCHAR2) IS
   TYPE cur_cur IS REF CURSOR;
   v_cur_cur cur_cur;
   v_rowcount NUMBER(28);
   v_cur_txt VARCHAR2(299);
   v_row NUMBER; --add rownum variable
BEGIN
   v_cur_txt := 'SELECT ROWNUM FROM '|| p_in_table; --select only rownum from target table

OPEN v_cur_cur FOR v_cur_txt;
   LOOP
      v_rowcount := v_cur_cur%ROWCOUNT;
      FETCH v_cur_cur INTO v_row; --fetch rownum in it
         EXIT WHEN v_cur_cur%NOTFOUND;
   END LOOP;
CLOSE v_cur_cur;

DBMS_OUTPUT.PUT_LINE(v_rowcount);
END;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21090673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档