10

我只是想知道为什么这段代码不起作用。id=1我的桌子上没有任何供应商。

DECLARE
    VAR SUPP_NM VARCHAR(100);
    VAR_SUPP_ID  NUMBER := 1;
    WHILE_VAR CHAR := 'Y';
BEGIN
    SELECT SUPP_NM
    INTO VAR_SUPP_NM
    FROM TEST.SUPPLIER
    WHERE SUPP_ID = VAR_SUPP_ID;
        
    IF SQL%NOTFOUND THEN
        DBMS_OUTPUT.PUT_LINE('SQL DATA NOT FOUND');
    ELSIF SQL%FOUND THEN
        DBMS_OUTPUT.PUT_LINE('DATA FOUND');
    END IF;    
END;

我在 Toad 中收到 01403 错误,但未处理为sql%notfound.

为什么不sql%notfound工作?

4

3 回答 3

19

要捕获异常,请通过添加部分NO_DATA_FOUND重写代码,如下所示:exception

DECLARE
    VAR_SUPP_NM VARCHAR2(100);
    VAR_SUPP_ID  NUMBER := 1;
    WHILE_VAR CHAR := 'Y';
BEGIN
  SELECT SUPP_NM
    INTO VAR_SUPP_NM
    FROM TEST.SUPPLIER
   WHERE SUPP_ID = VAR_SUPP_ID;

 DBMS_OUTPUT.PUT_LINE('DATA FOUND');

exception
  when no_data_found 
  then DBMS_OUTPUT.PUT_LINE('SQL DATA NOT FOUND');

END;

在语句的情况下检查SQL%FOUNDSQL%NOTFOUND没有意义select into,因为如果 select 语句没有返回任何行,它总是会引发no_data_found异常,除非该 select 语句调用聚合函数,如果没有选择任何行,它将总是返回数据或 null。

不要使用varchar数据类型,varchar2而是使用数据类型。

于 2012-10-25T19:19:16.403 回答
7

如果你想使用 Nicholas 的答案就是你想要的SELECT INTO。但是,如果您能够使用%FOUNDor更重要,请%NOTFOUND考虑使用FETCH游标代替:

DECLARE
    VAR SUPP_NM VARCHAR2(100);
    VAR_SUPP_ID  NUMBER := 1;
    WHILE_VAR CHAR := 'Y';
    CURSOR c1 IS
        SELECT SUPP_NM
        FROM TEST.SUPPLIER
        WHERE SUPP_ID = VAR_SUPP_ID;
BEGIN
    OPEN c1;
    FETCH c1 INTO VAR_SUPP_NM;

    IF c1%NOTFOUND THEN
            DBMS_OUTPUT.PUT_LINE('SQL DATA NOT FOUND');
    ELSIF c1%FOUND THEN
            DBMS_OUTPUT.PUT_LINE('DATA FOUND');
    END IF;

    CLOSE c1;
END;
于 2015-09-18T19:32:27.740 回答
4

尼克的回答是正确的。

然而,在 oracle 文档中,它表示SQL%NOTFOUND可以使用SELECT INTO 但在检查SQL%NOTFOUND为 TRUE 之前会生成一个错误,称为no_data_found.

所以使用SQL%NOTFOUND一个首先需要处理no_data_found错误。

DECLARE
    VAR SUPP_NM VARCHAR(100);
    VAR_SUPP_ID  NUMBER := 1;
    WHILE_VAR CHAR := 'Y';
BEGIN
    BEGIN
        SELECT SUPP_NM
        INTO VAR_SUPP_NM
        FROM TEST.SUPPLIER
        WHERE SUPP_ID = VAR_SUPP_ID;

        EXCEPTION 
            WHEN NO_DATA_FOUND THEN
                null; -- or write something here if u want.
    END;
    IF SQL%NOTFOUND THEN
        DBMS_OUTPUT.PUT_LINE('SQL DATA NOT FOUND');
    ELSIF SQL%FOUND THEN
        DBMS_OUTPUT.PUT_LINE('DATA FOUND');
    END IF;    
END;

所以我所做的是添加一个包含生成异常BEGIN-END的语句的内部块。之后,您可以检查 的值。SELECTno_data_foundSQL%NOTFOUND

You can read more about this in oracle docs. Start from this active link in mytime : https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/errors.htm#LNPLS00703

于 2020-12-08T07:14:16.450 回答