oracle中開發人員寫自己的sql function時,入口參數名不要與select中table的字段名重複,否則雖然編譯能正常通過,但運作的結果往往是錯誤的。
示例:
代碼很簡單,通過員工号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"就行了