当no_data_found异常引发时如何继续?

时间:2016-05-06 11:42:22

标签: oracle plsql

我有一个值,我不知道它插入哪个列。我可以确定,因为这个表列被命名为C1 .... C99。我将使用以下代码找到该列。 但是当没有数据发现异常被调用时,我无法再次启动循环。

clear = lambda : os.system('cls')

3 个答案:

答案 0 :(得分:3)

我认为将你的try catch移动到循环内部会为你做到这一点。

DECLARE
   i number:=1;
   k boolean := true;
   output number;
   stmt varchar(500);
BEGIN
  <<repeat>>
  while(k)
  loop
    DBMS_OUTPUT.PUT_LINE( 'c column -->'||i );
    begin
       EXECUTE IMMEDIATE 'select 1 from X_TAB t where t.c'||i||'= ''FISCAL_NOTE_NFE''' into output;
    exception when no_data_found then
          dbms_output.put_line('no data found.');
    end;
     IF output = 1 then
        DBMS_OUTPUT.PUT_LINE( 'c column'||i );
        k:=false;
     END IF;
     i:=i+1;
     IF i = 100 then
        k:=false;
     END IF;
END LOOP;
END;
/

答案 1 :(得分:1)

您可以使用:

SELECT CASE
       WHEN EXISTS (
              SELECT 1
              FROM   X_TAB
              WHERE  dynamic_column_name = 'FISCAL_NOTE_NFE'
            )
       THEN 1
       ELSE 0
       END
FROM   DUAL

它永远不会抛出异常,因为它总是会返回一行。

您可以像以下一样使用它:

DECLARE
  i      INT := 0;
  output INT;
BEGIN
  FOR k IN 1 .. 100 LOOP
    DBMS_OUTPUT.PUT_LINE( 'c column -->'||k );
    EXECUTE IMMEDIATE 'SELECT CASE WHEN EXISTS(SELECT 1 FROM X_TAB WHERE  c'||k||' = ''FISCAL_NOTE_NFE'') THEN 1 ELSE 0 END FROM DUAL'
      INTO output;
    IF output = 1 THEN
      DBMS_OUTPUT.PUT_LINE( 'c column'||k );
      i := k;
      EXIT;
    END IF;
  END LOOP;
  -- Do something with i
END;
/

答案 2 :(得分:1)

您也可以使用 select count(1) from X_TAB