oracle中開發人員寫自己的sql function時,入口參數名不要與select中table的欄位名重複,否則雖然編譯能正常通過,但啟動並執行結果往往是錯誤的。
樣本:
1 CREATE OR REPLACE FUNCTION S_GET_EMP_NAME(EMPNO nvarchar2) return nvarchar2 is 2 ENAME nvarchar2(100); 3 begin 4 SELECT E.ENAME 5 INTO ENAME 6 FROM EMP E 7 WHERE E.EMPNO = EMPNO 8 AND ROWNUM = 1; 9 RETURN ENAME;10 end;
代碼很簡單,通過員工號EMPNO,得到員工姓名ENAME。
測試代碼如下:
SELECT S_GET_EMP_NAME(7654) FROM DUAL;
返回結果:SMITH
但是這不是期望的值,EMP中的資料如下:
SELECT EMPNO,ENAME FROM EMP;
----------------------------------------------------
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
----------------------------------------------------
顯然,7654對應不是SMITH,問題在哪呢?
WHERE E.EMPNO = EMPNO
這一行條件中,因為變數名EMPNO與表中的欄位EMPNO重名了,sql在執行時,認為是 EMPNO這一列在跟自身比較,所以永遠是TRUE,最終只有ROWNUM=1起了作用,僅返回了第一行。
解決辦法:
把function中的入口參數改名,比如加個首碼 “IN_”,變成"IN_EMPNO"就行了