0
  1. 当找不到 ITEM_ID 时,我需要跳出循环或不执行循环:

    BEGIN
    FOR item IN(SELECT ITEM.ITEM_ID,
    ITEM.ITEM_DESC,
    INVENTORY.INV_PRICE
    FROM ITEM
    INNER JOIN INVENTORY
    ON ITEM.ITEM_ID    = INVENTORY.ITEM_ID
    WHERE ITEM.ITEM_ID = '1'
    ORDER BY ITEM.ITEM_ID,
    INVENTORY.INV_PRICE)
    LOOP
    DBMS_OUTPUT.PUT_LINE(
    item.ITEM_ID||' '||item.ITEM_DESC||' ' ||item.INV_PRICE);
    END LOOP;
    END;
    

另外,我需要打印出类似的东西DBMS_OUTPUT.PUT_LINE('Item not found!');

4

2 回答 2

2

没有必要break out of the loop when an item is not found

FOR record IN ( select-query ) LOOP statement(s) END LOOP
是 Oracle 术语中的FOR LOOP 游标,这里是文档:http

://docs.oracle.com/cd/E18283_01/appdev.112/e17126/cursor_for_loop_statement.htm游标 for 循环首先执行查询,然后为返回的每条记录通过查询,它执行 LOOP...END LOOP 之间的语句。

当查询没有返回任何行时,则根本不执行循环代码。

如果我们需要检测游标 for 循环中的查询是否返回一些行,那么最简单的方法是声明一个布尔变量并在 LOOP..END LOOP 块中赋值:

DECLARE
  rows_found BOOLEAN := false;
BEGIN
  FOR record IN ( select-query )
  LOOP
     rows_found := true;
     ... do something else ....
  END LOOP:
  IF NOT rows_found THEN
     DBMS_OUTPUT.PUT_LINE('Item not found!');
  END IF;
END;
于 2013-11-02T09:54:19.110 回答
0

问:那么我可以在检查两个表的情况下进行吗?或者如果查询没有返回任何内容来显示消息?

答:也许 FULL JOIN 可以解决问题。尝试让我们知道。

BEGIN
    FOR item IN(SELECT ITEM.ITEM_ID,
                ITEM.ITEM_DESC,
                INVENTORY.INV_PRICE
                FROM ITEM
                FULL JOIN INVENTORY
                ON ITEM.ITEM_ID    = INVENTORY.ITEM_ID
                WHERE ITEM.ITEM_ID = '1')
    LOOP
        IF ITEM.ITEM_ID IS NULL OR INVENTORY.ITEM_ID IS NULL THEN
            EXIT;
        ELSE
            DBMS_OUTPUT.PUT_LINE(item.ITEM_ID||' '||item.ITEM_DESC||' ' ||item.INV_PRICE);
        END IF;
    END LOOP;
-- in PLSQL if query doesn’t return anything exception is raised
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND');
END;
于 2013-11-04T09:22:24.443 回答