【发布时间】:2016-05-24 20:56:52
【问题描述】:
我遇到了一个有趣的错误,我不确定如何修复它的最佳方法。给定以下块:
DECLARE
v_column_exists number := 0;
host_column_exists number := 0;
i number;
BEGIN
Select count(*) into v_column_exists from user_tab_cols where column_name = 'CONNECTIONDESCRIPTION' and table_name = 'NODES';
if (v_column_exists = 1) then
Select count(*) into host_column_exists from user_tab_cols where column_name = 'HOST' and table_name = 'NODES';
if (host_column_exists = 0) then
execute immediate 'alter table NODES add (Host varchar2(255))';
for item in (select connectiondescription, code from nodes) loop
... LOOP STUFF ...
end loop;
end if;
end if;
END;
我得到以下结果:
PL/SQL:ORA-00904:“CONNECTIONDESCRIPTION”:标识符无效
ORA-06550:第 40 行,第 20 列:PL/SQL:忽略 SQL 语句
ORA-06550:第 41 行,第 20 列:PLS-00364:循环索引变量 'ITEM' 使用无效
任何想法如何摆脱这个错误?当数据库中不存在列NODES.CONNECTIONDESCRIPTION 时会出现问题,但是在这种情况下,for 循环不会在运行时执行。我需要禁用这些错误,但还没有找到任何方法来做到这一点。我试过使用ALTER SESSION SET PLSQL_WARNINGS='DISABLE:00904',但没有效果。
谢谢
【问题讨论】:
-
动态查询?您已经立即执行了一个,所以为什么不添加另一个。或者条件编译,如果可能的话
-
您为什么不确保该列实际上在表中,或者您对该表有明确的 SELECT 授权,而不是禁用错误?
-
@micklesh 感谢您的回复,我已经找到了一种实际上与您的建议相同的方法。另一个动态查询,它批量收集到一个数组,然后循环遍历数组
-
@ruudvan:可能的解决方法,但是添加您需要处理的列只是为了摆脱编译错误似乎不是正确的做法
-
我明白你的意思了。这个问题有点模棱两可。我的错。动态查询绝对是你需要的。
标签: oracle for-loop plsql compiler-warnings