oracle plsql 动态循环

Posted

技术标签:

【中文标题】oracle plsql 动态循环【英文标题】:oracle plsql dynamic loop 【发布时间】:2017-03-17 11:44:42 【问题描述】:

我正在尝试重写以下代码,以避免 ORA-00942 错误(表或视图不存在)。这是因为在我的代码编译过程中,表(MY_TABLE_NAME)仍然不存在,因此我需要将其动态化。

这是代码(使用通用名称)

DECLARE
  C INTEGER := 0;
BEGIN
 SELECT COUNT(1) INTO C FROM USER_TABLES WHERE TABLE_NAME = 'MY_TABLE_NAME';
 IF C > 0 THEN
      DECLARE     
       CURSOR c_var IS SELECT COLUMN_1, COLUMN_2 FROM MY_TABLE_NAME WHERE ACTIVE = 1;
        v_id NUMBER(15);
      BEGIN
        FOR prec IN c_var LOOP
          ......testcode
        END LOOP;
        EXECUTE IMMEDIATE 'testcode';
      END;
 END IF;
END;
/

没有必要使用游标..所以我尝试重写它并使用正常的 for 循环,因为我认为使代码更具动态性更容易,但是我仍在努力

【问题讨论】:

你到底想用MY_TABLE_NAME做什么?选择一行,几行,插入,更新,删除? 看看here。为什么这个问题如此不同? @Aleksej 好吧..它不像我之前的一篇文章那么容易..我无法通过立即执行来解决这个问题,或者至少我尝试过但失败了,因为这里的代码更复杂 @ammoq 我的光标选择了行并在开始/结束语句中进行了更新..但为什么它相关?我的代码由于以下行而失败:CURSOR c_var IS SELECT COLUMN_1, COLUMN_2 FROM MY_TABLE_NAME WHERE ACTIVE = 1;...它无法编译此行,因为“MY_TABLE_NAME”尚不存在 @NoName123 显然,您必须重写那部分,但是当我不知道您要归档什么时,就不可能说改写什么。 【参考方案1】:

假设你只想让光标工作:

DECLARE
  C INTEGER := 0;
  TYPE MyCurTyp  IS REF CURSOR;
  v_my_cursor    MyCurTyp;
  v_col1      varchar2(20); -- replace varchar2(20) with correct data type
  v_col2      varchar2(20); -- replace varchar2(20) with correct data type
BEGIN
 SELECT COUNT(1) INTO C FROM USER_TABLES WHERE TABLE_NAME = 'MY_TABLE_NAME';
 IF C > 0 THEN
     OPEN v_my_cursor FOR 'SELECT COLUMN_1, COLUMN_2 FROM MY_TABLE_NAME WHERE ACTIVE = 1';
     LOOP
        FETCH v_my_cursor into v_col1, v_col2;
        EXIT WHEN v_my_cursor%notfound;

        -- prepare testcode from v_col1, v_col2

        EXECUTE IMMEDIATE 'testcode';
      END LOOP;
      close v_my_cursor;
 END IF;
END;
/

【讨论】:

以上是关于oracle plsql 动态循环的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 PLSQL/Oracle 中动态创建外部表

『ORACLE』 PLSQL动态游标的使用(11g)

如何在动态 sql (ORACLE PLSQL) 中获取局部临时变量中的计数 (*) 值

使用 Oracle PLSQL 从动态选择的表中合并唯一值的更有效方法

Oracle [存储过程] 执行动态拼接SQL语句并返回结果??

在运行时访问 Oracle PLSQL 记录类型的元素