【发布时间】:2017-02-08 08:48:46
【问题描述】:
我有以下过程,编译不正确,因为它引用了不存在的对象(表不存在) 这里只是代码的一部分(我使用了表和列的通用名称):
DECLARE
C INTEGER := 0;
BEGIN
SELECT COUNT(1) INTO C FROM USER_TABLES WHERE TABLE_NAME = 'MY_TABLE';
IF C > 0 THEN
DECLARE
CURSOR c_maps IS SELECT COLUM_NAME1, COLUM_NAME2 FROM MY_TABLE WHERE ACTIVE = 1;
BEGIN
FOR prec IN c_maps LOOP
some code...;
END LOOP;
EXECUTE IMMEDIATE 'some code..';
END;
END IF;
END;
/
我不知道如何动态写这个语句,因为表“MY_TABLE”不存在:
CURSOR c_maps IS SELECT COLUM_NAME1, COLUM_NAME2 FROM MY_TABLE WHERE ACTIVE =1;
我也试过这样写:
CURSOR c_maps IS SELECT COLUM_NAME1, COLUM_NAME2 FROM (Select 'MY_TABLE' from dual) WHERE ACTIVE = 1;
但是,它指的是在编译时也不存在的列“ACTIVE”......可以在“立即执行”中编写整个过程 - 块?我尝试了不同的变体,但没有成功
【问题讨论】:
-
构建列列表的游标必须是动态执行的一部分。嵌套的两层动态执行......理解和调试的噩梦。真的没有办法针对现有架构进行编码吗?