1. 程式人生 > >PL/SQL函式的傳入引數名稱要規範,不能和函式內使用到的表的欄位名稱一樣,否則會出錯(帶例子)

PL/SQL函式的傳入引數名稱要規範,不能和函式內使用到的表的欄位名稱一樣,否則會出錯(帶例子)

CREATE OR REPLACE FUNCTION pf_limit_ldlc_test(companyid IN NUMBER ,doctype IN NUMBER) RETURN NUMBER IS
cnt NUMBER;
BEGIN
cnt := 0;

IF doctype = 1 THEN
  SELECT COUNT(l.companyid) INTO cnt FROM zx_limit_ldlc_company  l WHERE l.companyid = companyid AND l.companytype = 1; 
  IF cnt > 0 THEN
    RETURN 1;
  ELSE
    RETURN 0;
  END IF;
END IF;

RETURN 1;

END;

函式pf_limit_ldlc_test用了兩個傳入引數,用於判斷傳入的單位ID(companyid)是否存在於表zx_limit_ldlc_company中,存在返回1,否則返回0。

但是問題出現了,即使傳入的companyid的值(12345)不存在於表zx_limit_ldlc_company的companyid列中,函式都返回1。

SQL> SELECT pf_limit_ldlc_test(12345,1) FROM  dual  ; 
PF_LIMIT_LDLC_TEST(12345,1)
---------------------------
                          1
經除錯函式發現,無論傳入的companyid的值怎麼變化,變數cnt獲取的值(記錄數)都>0,且為17。

剛好等於SELECT COUNT(l.companyid)  FROM zx_limit_ldlc_company   l WHERE  l.companytype = 1的記錄數,

也就是select的限定條件l.companyid = companyid沒有發揮作用。推測可能是傳入引數companyid與表zx_limit_ldlc_company的欄位companyid同名,導致PLSQL無法識別companyid是表的欄位還是傳入引數導致的。

表zx_limit_ldlc_company的結構:

SQL> desc zx_limit_ldlc_company;
Name          Type          Nullable Default Comments     
------------- ------------- -------- ------- ------------ 
COMPANYID     NUMBER(10)                                  
COMPANYNAME   VARCHAR2(100) Y                             
COMPANYTYPE   NUMBER(1)     Y                1代表客戶 2代表供應商 
COMPANYOPCODE VARCHAR2(40)  Y  

下面修改了傳入引數的名稱函式就正確實現了。

CREATE OR REPLACE FUNCTION pf_limit_ldlc_test(l_companyid IN NUMBER ,doctype IN NUMBER) RETURN NUMBER IS
cnt NUMBER;
BEGIN
CNT := 0;

IF doctype = 1 THEN
  SELECT COUNT(l.companyid) INTO cnt FROM zx_limit_ldlc_company    l WHERE l.companyid = l_companyid AND l.companytype = 1; 
  IF cnt > 0 THEN
    RETURN 1;
  ELSE
    RETURN 0;
  END IF;
END IF;

RETURN 1;

END;

測試新的函式:

SQL> SELECT pf_limit_ldlc_test(12345,1) FROM  dual  ; 
PF_LIMIT_LDLC_TEST(12345,1)
---------------------------
                          0
輸出正確了。

結論:函式的傳入引數名稱一定不能和函式中引用過的表的欄位重名,否則會出錯。