2016-05-24 81 views
0

我来到有趣的错误,我不知道如何解决它的最佳方式。给出以下块:PLSQL忽略编译错误,这不是错误

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:循环变量 '项' 使用无效

任何想法如何摆脱这个错误?数据库中不存在列NODES.CONNECTIONDESCRIPTION时会出现问题,但在这种情况下for循环不会在运行时执行。我需要禁用这些错误,但还没有找到任何方法来做到这一点。我曾尝试使用ALTER SESSION SET PLSQL_WARNINGS='DISABLE:00904',但它没有效果。

由于

+2

动态查询?你已经有一个立即执行,为什么不添加另一个。或条件编译,如果在你的情况下可能的话 – micklesh

+3

而不是禁用错误,为什么你不确定列实际上在表中,或者你有明确的SELECT授予该表? – ruudvan

+0

@micklesh谢谢你的回复,我已经找到了一个和你的建议一样的方法。另一个动态查询批量收集到一个数组,然后循环通过数组 –

回答

0

正确的做法是使用其中通过散装这个阵列收集项数组,然后循环的另一个动态查询。