Stored-Procedures

如何檢查過程中是否存在參數值?

  • November 25, 2012

以下是使用 2 個參數的過程:customer_codepay_amount。該過程按預期工作,但是當我輸入錯誤時,cus_code我收到此錯誤,而不是我的自定義檢查:

ORA-01403: no data found
ORA-06512: at "XXXXX.CUST_PAY", line 19
ORA-06512: at line 2

程序,流程:

CREATE OR REPLACE PROCEDURE cust_pay (temp_ccode IN NUMBER, pay_amount IN NUMBER)AS
BEGIN
   DECLARE 
     Value_check NUMBER;
     cbalance NUMBER;
   BEGIN
       SELECT Count(cus_code) 
       INTO value_check
       FROM customer
       WHERE cus_code = temp_ccode;

       IF value_check IS NULL THEN
           Dbms_Output.put_line('the value was not FOUND');
       ELSE
           UPDATE customer
           SET cus_balance = cus_balance - pay_amount
           WHERE cus_code = temp_ccode;

           SELECT cus_balance 
           INTO cbalance
           FROM customer
           WHERE cus_code = temp_ccode;

           IF cbalance < 0 THEN
               Dbms_Output.put_line('The client owes us ' || cbalance);
           ELSE
               Dbms_Output.put_line('Customer new balance is ' || cbalance);
           END IF;
       END IF;
   END;
END;

我做錯了什麼?我想我需要在 I 之前檢查值SELECT,對吧?

count()如果您在沒有行的結果集上使用聚合,您將得到零,而不是空值。

如果 aSELECT沒有找到任何東西,則會引發異常 ( ),並且您需要在塊NO_DATA_FOUND中擷取該異常。EXCEPTIONS

exceptions
 when no_data_found:
   dbms_output.put_line('ooups');
end;

在您的情況下,第二個選擇引發了異常-由於零不為空,if因此不會採用您的第一個分支。(update如果不更新任何內容,則不會引發異常。)

不過,您的程序通常已經太複雜了。您可以直接在過程“標題”中聲明變數,刪除兩個選擇 - 您想要的所有資訊都可以從單個update.

create or replace
procedure cust_pay(temp_code number, pay_amount number)
as
 new_balance number;
begin
 update customer
 set cbalance = cbalance - pay_amount
 where cust_code = temp_code
 returning cbalance into new_balance;

 if sql%rowcount = 0 then
   dbms_output.put_line('No such customer: ' || temp_code);
 elsif new_balance < 0 then
   dbms_output.put_line('Negative: ' || new_balance);
 else
   dbms_output.put_line('Positive: ' || new_balance);
 end if;
end;

(假設這cust_code是唯一的。)

如果更新沒有做任何事情,sql%rowcount將為零,它告訴您該客戶是否存在(相當於您的第一個select)。更新本身與您的程式碼沒有變化,只是returning ... into避免了第三次選擇的需要並將更新的值直接抓取到局部變數中。

引用自:https://dba.stackexchange.com/questions/29240