这个带参数的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便能得到正确结果。结果如下图: