2017-10-13 250 views
0

我創建Oracle中的存儲過程 - 見下文Oracle存儲過程與參數問題

create or replace PROCEDURE REMOVE_CUSTOMER 
 
(
 
    cus_id IN NUMBER 
 
) 
 
AS 
 
BEGIN 
 
    DELETE FROM CUSTOMER WHERE CUSTOMER.CUS_ID = cus_id; 
 
END;

我執行它像下面。

DECLARE 
 
    CUS_ID NUMBER; 
 
BEGIN 
 
    CUS_ID := 192981; 
 
    REMOVE_CUSTOMER(CUS_ID => CUS_ID); 
 
END;

它設刪除客戶192981只。但是,表中的所有客戶都被刪除了。有人可以告訴我pl/sql有什麼問題嗎?

回答

1

過程中的語句:

DELETE FROM CUSTOMER WHERE CUSTOMER.CUS_ID = cus_id; 

查詢分析器必須確定什麼cus_id是在右手邊。如果表格中有這個名稱的列,那麼這是首選。這就是爲什麼一切都被刪除; RHS解釋爲customer.cus_id

如果表中不存在這樣的列,則猜測將是過程中定義的變量。但這只是第二選擇,而不是第一選擇。

最佳做法是對過程變量使用不同的名稱,或許在列名前添加p_(用於參數)或i_(用於輸入):p_cus_id

您可以使用相同的名稱爲您的過程變量,但你必須完全限定它的SQL語句:

where customer.cus_id = remove_customer.cus_id 

其實你並不需要在 - 手側出線;這將工作:

where cus_id = remove_customer.cus_id 

相比之下,你在匿名塊做(在調用程序)什麼不會造成問題。使用列名作爲匿名塊中聲明的變量的名稱仍然是一種不好的做法,但是當您從匿名塊調用存儲過程時,不會混淆哪個CUS_ID是存儲的輸入程序;它不能是來自表格的列名稱,也不能是來自SP的變量(僅在SP中「在作用域內」,對於調用者而言是不可見的 - 匿名塊)。