【问题标题】:PL SQL How to handle no rows foundPL SQL 如何处理未找到的行
【发布时间】:2012-11-26 18:48:28
【问题描述】:
SQL - Cursor if no records not working

CREATE OR REPLACE procedure verify_data
IS
cursor c1 is 
select 
  e.name 
from 
  table3 e 
where 
  id IN (select id from table1)
  and id in (select id from table2);
BEGIN
if c1%notfound then
DBMS_OUTPUT.PUT_LINE('no records found');
end if;

FOR eData in c1
   LOOP

      DBMS_OUTPUT.PUT_LINE(eData.name);
   END LOOP;

END;
/

如果有记录,我的结果将被输出。但是如果没有找到记录,则不会显示任何内容。如果选择语句中没有记录,是否有任何异常处理或我可以做的事情来使我的输出“未找到记录”显示出来。

更新:

我在后面加了

结束循环

EXCEPTION
WHEN NO_DATA_FOUND THEN 
DBMS_OUTPUT.PUT_LINE('no records found');

在END之前;

SQL> 执行 verify_data();

PL/SQL 过程成功完成。

也不显示..

【问题讨论】:

    标签: mysql sql oracle


    【解决方案1】:

    结束前;添加以下代码 WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('no records found');

    【讨论】:

    • @user1587149 你遇到了什么问题?
    • 我面临的问题是,当有记录时它可以显示结果,但问题是当没有记录时,我希望 dbms 输出打印找不到记录并且它不工作。如果我使用你的代码,它不会打印任何东西,只是说 pl/sql 执行成功。
    • 由于您使用 for 循环从游标中获取数据,因此您无需担心找不到数据,因为 oracle 会在内部处理此问题。更好的是你应该去打开游标然后获取它并且在接收处理中没有找到数据这是一种方法。
    • 解决方法是在 for 循环之前设置一个 bool 变量,将其设置为 true,在 for 循环中将其设置为 false。如果 bool 变量为真,则外部循环写入条件然后 DBMS_OUTPUT.PUT_LINE('no records found')
    【解决方案2】:

    请检查以下步骤

      CREATE OR REPLACE procedure verify_data
        IS
        cursor c1 is 
        select 
          e.name 
        from 
          table3 e 
        where 
          id IN (select id from table1)
          and id in (select id from table2);
        BEGIN
        loop
        FETCH c1 INTO eData;
        EXIT WHEN c1%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(eData.name);
        end loop;
        exception 
        when no_data_found then
            dbms_output.put_line('*** Exc: no data');
    
        END;
        /
    

    【讨论】:

      【解决方案3】:

      试试这个代码:

      CREATE OR REPLACE procedure verify_data
      IS
      no_result exception;
      cursor c1 is 
      select 
      e.name 
      from 
      table3 e 
      where 
      id IN (select id from table1)
      and id in (select id from table2);
      BEGIN
      FOR eData in c1
      LOOP
        DBMS_OUTPUT.PUT_LINE(eData.name);
        if c1%notfound then
         raise no_result;
        end if;
      END LOOP;
      EXCEPTION
      WHEN no_result THEN 
      DBMS_OUTPUT.PUT_LINE('no records found');
      END; 
      /
      

      【讨论】:

        【解决方案4】:

        你不能在游标/循环中处理 NO_DATA_FOUND

        试试下面的例子

        CREATE OR REPLACE PROCEDURE verify_data
        IS
        CURSOR c1 is 
        SELECT 
          e.name 
        FROM 
          table3 e 
        WHERE 
          id IN (SELECT ID FROM table1)
          AND id in (SELECT ID FROM table2);
        
        eData   table3.name%TYPE ; 
        
        no_data EXCEPTION ;
        BEGIN
        OPEN c1 ;
        LOOP
        FETCH c1 INTO eData;
        
        IF c1%NOTFOUND THEN
          RAISE no_data ;
        ELSE
         DBMS_OUTPUT.PUT_LINE(eData);
         EXIT ;
        END IF;
        END LOOP ;
        CLOSE c1;
        EXCEPTION 
        WHEN no_data THEN
            DBMS_OUTPUT.PUT_LINE('*** Exc: no data');
        
        END;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-29
          • 2015-04-04
          • 2013-07-23
          • 1970-01-01
          • 2015-08-09
          • 2016-01-26
          • 1970-01-01
          相关资源
          最近更新 更多