這個帶參數的Oracle函數為何傳不進參數?——真相終於浮出“水面”


在我的Oracle數據庫中有這樣兩張表,一張叫做emp(員工表),另一張叫做dept(部門表),表結構如下:

Emp表如下:  

                                 

dept表如下:

在emp表中有員工編號(empno)、員工姓名(ename)、員工工作(job)、員工薪水(salary)、

員工獎金(bonus)、入職日期(hiredate)、員工領導(mgr)、部門編號(deptno)。

在dept表中有部門編號(deptno)、部門名稱(dname)、部門所在地(location)。

寫了這樣一個函數,目的是為了傳入部門名稱(dname),返回該部門員工的平均薪水,需求雖很簡單,但是寫好后結果卻非預期所想,返回值為null。函數及執行結果如下圖:

原因分析:

1、沒有developer這個部門嗎?查詢dept表結果如下,證明並非沒有這個部門,如下圖:

2、由上圖可知developer部門編號為10,那么是不是沒有員工屬於部門編號為10的developer部門呢?查詢emp表結果如下,證明有4位員工屬於developer部門並且他們的薪水分別為10000、8000、9000、5000,如下圖:

3、是不是函數中關鍵的SQL語句的錯了呢?我將SQL語句單獨執行,結果證明不僅SQL語句正確而且結果和實際一致為(10000+8000+9000+5000)/4=8000,如下圖:

經過查閱書籍,我發現書中的函數如果有傳入參數,有這樣一種寫法,對該例而言可以改成v_dname  dept.dname%type,意思是傳入的參數名為v_dname,參數類型為dept表中dname字段的類型,而這次結果查出的也是8000,為正解。這回終於恍然大悟,之前之所以傳入的參數沒有獲取到原因是參數的類型與dept表中dname不一致。由於自己憑借感覺認為部門名稱屬於字符串就將傳入的參數定義為v_dname  in  varchar2,而自己建的表中dname字段的類型為char(20),類型不一致導致查出的結果為null。將傳入參數類型改為  dept.dname%type便能得到正確結果。結果如下圖:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM