我希望創建一個在資料庫中查找給定客戶 ID 的程序。如果客戶存在,則將找到的變數設定為 1。否則,將找到的變數設定為 0。但是,我的呼叫代碼塊不提供結果。我錯過了什么還是我的 SELECT 陳述句應該是別的東西?謝謝你。
CREATE OR REPLACE PROCEDURE find_customer(CUST_ID IN NUMBER, found OUT NUMBER) AS
CUSTID NUMBER := CUST_ID;
BEGIN
SELECT CUSTOMER_ID INTO CUSTID
FROM CUSTOMERS
WHERE CUSTOMER_ID = CUST_ID;
IF CUST_ID = NULL THEN
found := 1;
END IF;
EXCEPTION
WHEN no_data_found THEN
found := 0;
END;
/
DECLARE
CUSTOMER_ID NUMBER := 1;
found NUMBER;
BEGIN
find_customer(1,found);
DBMS_OUTPUT.PUT_LINE (found);
END;
uj5u.com熱心網友回復:
我認為除了下面的部分之外沒有任何其他內容。在您給定的示例中,不可能從中獲取空值,因為任何空 id 都可能意味著該專案不存在。這意味著它不會回傳一行,這會觸發NO_DATA_FOUND您捕獲的例外。
這是你寫的:
IF CUST_ID = NULL THEN
found := 1;
END IF;
這可能是你的意思:
IF CUST_ID IS NOT NULL THEN
found := 1;
END IF;
uj5u.com熱心網友回復:
我會重寫它以便
- 您將引數與區域變數與列名區分開來
- 使用表別名
- 修復找到某些內容時會發生的情況(
is not null第 11 行) - 測驗時,使用您宣告的變數,而不是常量 (
1)
所以:
SQL> CREATE OR REPLACE PROCEDURE find_customer (par_cust_id IN NUMBER,
2 par_found OUT NUMBER)
3 AS
4 l_custid NUMBER;
5 BEGIN
6 SELECT c.customer_id
7 INTO l_custid
8 FROM customers c
9 WHERE c.customer_id = par_cust_id;
10
11 IF l_custid IS NOT NULL
12 THEN
13 par_found := 1;
14 END IF;
15 EXCEPTION
16 WHEN NO_DATA_FOUND
17 THEN
18 par_found := 0;
19 END;
20 /
Procedure created.
測驗:
SQL> SET SERVEROUTPUT ON
SQL> SELECT * FROM customers;
CUSTOMER_ID
-----------
100
SQL> DECLARE
2 l_customer_id NUMBER := 1;
3 l_found NUMBER;
4 BEGIN
5 find_customer (l_customer_id, l_found);
6 DBMS_OUTPUT.put_line (l_found);
7 END;
8 /
0
PL/SQL procedure successfully completed.
SQL> DECLARE
2 l_customer_id NUMBER := 100;
3 l_found NUMBER;
4 BEGIN
5 find_customer (l_customer_id, l_found);
6 DBMS_OUTPUT.put_line (l_found);
7 END;
8 /
1
PL/SQL procedure successfully completed.
SQL>
uj5u.com熱心網友回復:
您可以將其簡化為:
CREATE OR REPLACE PROCEDURE find_customer(
p_cust_id IN CUSTOMERS.CUSTOMER_ID%TYPE,
p_found OUT NUMBER
) AS
BEGIN
SELECT 1
INTO p_found
FROM CUSTOMERS
WHERE CUSTOMER_ID = p_cust_id;
EXCEPTION
WHEN no_data_found THEN
p_found := 0;
END;
/
CUSTOMER_ID = p_cust_id如果任何一方都匹配,則該行將不匹配,NULL因此您無需進一步檢查。
然后你可以使用以下方法呼叫它:
DECLARE
v_found NUMBER;
BEGIN
find_customer(1,v_found);
DBMS_OUTPUT.PUT_LINE (v_found);
END;
/
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/373084.html
