您的位置:首页 > 数据库

PL/SQL函数的传入参数名称要规范,不能和函数内使用到的表的字段名称一样,否则会出错(带例子)

2016-10-26 12:16 495 查看
CREATE OR REPLACE FUNCTION pf_limit_ldlc_test(companyid IN NUMBER ,doctype IN NUMBER) RETURN NUMBER IS
cnt NUMBER;
BEGIN
cnt := 0;

IF doctype = 1 THEN
SELECT COUNT(l.companyid) INTO cnt FROM zx_limit_ldlc_company  l WHERE l.companyid = companyid AND l.companytype = 1;
IF cnt > 0 THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END IF;

RETURN 1;

END;

函数pf_limit_ldlc_test用了两个传入参数,用于判断传入的单位ID(companyid)是否存在于表zx_limit_ldlc_company中,存在返回1,否则返回0。

但是问题出现了,即使传入的companyid的值(12345)不存在于表zx_limit_ldlc_company的companyid列中,函数都返回1。

SQL> SELECT pf_limit_ldlc_test(12345,1) FROM  dual  ;
PF_LIMIT_LDLC_TEST(12345,1)
---------------------------
1
经调试函数发现,无论传入的companyid的值怎么变化,变量cnt获取的值(记录数)都>0,且为17。

刚好等于SELECT COUNT(l.companyid)  FROM zx_limit_ldlc_company   l WHERE  l.companytype = 1的记录数,

也就是select的限定条件l.companyid = companyid没有发挥作用。推测可能是传入参数companyid与表zx_limit_ldlc_company的字段companyid同名,导致PLSQL无法识别companyid是表的字段还是传入参数导致的。

表zx_limit_ldlc_company的结构:

SQL> desc zx_limit_ldlc_company;
Name          Type          Nullable Default Comments
------------- ------------- -------- ------- ------------
COMPANYID     NUMBER(10)
COMPANYNAME   VARCHAR2(100) Y
COMPANYTYPE   NUMBER(1)     Y                1代表客户 2代表供应商
COMPANYOPCODE VARCHAR2(40)  Y


下面修改了传入参数的名称函数就正确实现了。

CREATE OR REPLACE FUNCTION pf_limit_ldlc_test(l_companyid IN NUMBER ,doctype IN NUMBER) RETURN NUMBER IS
cnt NUMBER;
BEGIN
CNT := 0;

IF doctype = 1 THEN
SELECT COUNT(l.companyid) INTO cnt FROM zx_limit_ldlc_company    l WHERE l.companyid = l_companyid AND l.companytype = 1;
IF cnt > 0 THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END IF;

RETURN 1;

END;


测试新的函数:

SQL> SELECT pf_limit_ldlc_test(12345,1) FROM  dual  ;
PF_LIMIT_LDLC_TEST(12345,1)
---------------------------
0
输出正确了。

结论:函数的传入参数名称一定不能和函数中引用过的表的字段重名,否则会出错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐