今天闲来没事练习自定义函数,突然发现一个神奇的问题,大概情况如下,我想弄个自定义函数把emp表里 部门20改换成部门100,这就涉及到转换用decode函数了;
流程是先写出:
SELECT DECODE (deptno ,20,100) FROM emp ; 返回结果如图所示
![5af304ab63016731983906cd79fb045e.png](https://img-blog.csdnimg.cn/img_convert/5af304ab63016731983906cd79fb045e.png)
开始编写函数,随便拿了个mgr做参数:
CREATE OR REPLACE FUNCTION f_k(fk_mgr VARCHAR2) RETURN NUMBER
IS
x NUMBER(10);
BEGIN
SELECT DECODE (deptno ,20,100) INTO x FROM emp WHERE mgr= fk_mgr;
RETURN x;
END;
然后t使用函数:
SELECT f_k(mgr ) FROM emp ;
![03eb47761e50ff698b841eebedb222cc.png](https://img-blog.csdnimg.cn/img_convert/03eb47761e50ff698b841eebedb222cc.png)
然后就报错了,
一开始我不理解,后来发现
SELECT mgr , deptno FROM emp;
![33daaf9e176165146b8205e91152bfae.png](https://img-blog.csdnimg.cn/img_convert/33daaf9e176165146b8205e91152bfae.png)
一个mgr会返回多个行的数据相关,所以才会导致报错,所以用唯一对应值的主键做参数,就不会出现这样的情况,
CREATE OR REPLACE FUNCTION f_k(fk_empno NUMBER) RETURN NUMBER
IS
x NUMBER(10);
BEGIN
SELECT DECODE (deptno ,20,100) INTO x FROM emp WHERE empno= fk_empno;
RETURN x;
END;
用这个empno主键做参数来处理就完美解决了
SELECT f_k(empno ) FROM emp ;
一用就成功了
![6fd97a8a49e844fb893549a93de83943.png](https://img-blog.csdnimg.cn/img_convert/6fd97a8a49e844fb893549a93de83943.png)
完美收官,以后自定义函数选用参数处理的时候一定要想好用什么做参数,否则容易掉坑。
其他需要分享指教的请留言。