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 动态循环的主要内容,如果未能解决你的问题,请参考以下文章
如何在动态 sql (ORACLE PLSQL) 中获取局部临时变量中的计数 (*) 值
使用 Oracle PLSQL 从动态选择的表中合并唯一值的更有效方法