Oracle 当未发现数据时,如何继续引发异常?

Oracle 当未发现数据时,如何继续引发异常?,oracle,plsql,Oracle,Plsql,我有一个值,我不知道它被插入到哪个列中。我可以确定,因为这个表的列被命名为C1…C99。我将使用以下代码查找该列但是当调用“未找到数据”异常时,我无法再次启动循环。 DECLARE i number:=1; k boolean := true; output number; stmt varchar(500); BEGIN <<repeat>> while(k) loop DBMS_OUTPUT.PUT_LINE( 'c col

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

DECLARE
   i number:=1;
   k boolean := true;
   output number;
   stmt varchar(500);
BEGIN
  <<repeat>>
  while(k)
  loop
    DBMS_OUTPUT.PUT_LINE( 'c column -->'||i );
   EXECUTE IMMEDIATE 'select 1 from X_TAB t where t.c'||i||'= ''NOTE_NFE'''

     into output;
     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;
EXCEPTION 
     when no_data_found then
       i:=i+1;
       if i = 100 then
          k:=false;
       end if;
       goto repeat;
END;
/
声明
i编号:=1;
k布尔值:=真;
输出数;
stmt-varchar(500);
开始
while(k)
环
DBMS|u OUTPUT.PUT|u行('c column-->'| i);
执行立即“从X|U选项卡t中选择1,其中t.c'| | i | |'”=“注意”
投入产出;
如果输出=1,则
DBMS|u OUTPUT.PUT|u行('c column'| i);
k:=假;
如果结束;
i:=i+1;
如果i=100,那么
k:=假;
如果结束;
端环;
例外情况
当找不到数据时
i:=i+1;
如果i=100,那么
k:=假;
如果结束;
转到重复;
结束;
/

我认为,将试捕器移动到回路内部将为您带来好处

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
          output := 0; --set a default value
          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;
/
声明
i编号:=1;
k布尔值:=真;
输出数;
stmt-varchar(500);
开始
while(k)
环
DBMS|u OUTPUT.PUT|u行('c column-->'| i);
开始
执行立即“从X|U选项卡t中选择1,其中t.c'| | i | | |'=“财政票据”进入输出;
未找到数据时出现异常
输出:=0--设置默认值
dbms_output.put_行('未找到数据');
结束;
如果输出=1,则
DBMS|u OUTPUT.PUT|u行('c column'| i);
k:=假;
如果结束;
i:=i+1;
如果i=100,那么
k:=假;
如果结束;
端环;
结束;
/

我认为,将试捕器移动到回路内部将为您带来好处

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
          output := 0; --set a default value
          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;
/
声明
i编号:=1;
k布尔值:=真;
输出数;
stmt-varchar(500);
开始
while(k)
环
DBMS|u OUTPUT.PUT|u行('c column-->'| i);
开始
执行立即“从X|U选项卡t中选择1,其中t.c'| | i | | |'=“财政票据”进入输出;
未找到数据时出现异常
输出:=0--设置默认值
dbms_output.put_行('未找到数据');
结束;
如果输出=1,则
DBMS|u OUTPUT.PUT|u行('c column'| i);
k:=假;
如果结束;
i:=i+1;
如果i=100,那么
k:=假;
如果结束;
端环;
结束;
/
您可以使用:

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;
/
您可以使用:

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;
/
你也可以使用
从X_选项卡中选择计数(1)

您也可以使用
从X_选项卡中选择count(1)

希望这是一个练习,可以准确地向您演示为什么像在表中一样重复列是一个非常糟糕的主意。如果返回的行数超过1行,则也会出现异常。我想您需要选择计数(1)而不是选择1。还有,该死的表模式,哇。希望这是一个练习,可以向您确切地演示为什么像在表中一样有重复的列是一个非常糟糕的主意。如果返回的行超过1行,您也会有一个异常。我想您需要选择计数(1)而不是选择1。还有,该死的表模式,哇。只有一个问题:如果没有找到任何数据,它以前的
output
值将被保留。您需要在异常处理程序中重置
output
。只有一个问题:如果未找到任何数据,则将保留以前的
output
值。您需要在异常处理程序中重置
输出