Stored-Procedures
如何檢查過程中是否存在參數值?
以下是使用 2 個參數的過程:
customer_code
和pay_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()
如果您在沒有行的結果集上使用聚合,您將得到零,而不是空值。如果 a
SELECT
沒有找到任何東西,則會引發異常 ( ),並且您需要在塊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
避免了第三次選擇的需要並將更新的值直接抓取到局部變數中。