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输出正确了。
结论:函数的传入参数名称一定不能和函数中引用过的表的字段重名,否则会出错。
相关文章推荐
- mysql存储过程的参数名不能和表字段名一样,否则不执行条件
- 使用jstl,session.setAttribute不能设置名称为“userinfo”,否则获取不到
- DLL模块例1:使用.def模块导出函数,规范修饰名称,显示连接调用dll中函数
- C语言 编写一个函数,将参数字符串中的字符反向排列。要求:不能使用C函数库中的字符串操作函数,
- mybatis从dao传入多个参数到sqlmap时dao中要使用map或实例对象(如:user)作为参数传入, 否则报错找不到属性getter方法
- C语言 编写一个函数reverse_string(char * string) 实现:将参数字符串中的字符反向排列。 要求:不能使用C函数库中的字符串操作函数。
- java的PreparedStatement.setString(1, "");后一个参数不能为空,否则出错
- 【c语言】编写一个函数reverse_string(char * string) 实现:将参数字符串中的字符反向排列。 要求:不能使用C函数库中的字符串操作函数
- C语言通过函数参数不能带出动态内存的例子。
- 【C语言】编写一个函数reverse_string(char * string) 实现:将参数字符串中的字符反向排列。要求:不能使用C函数库中的字符串操作函数。
- VC控制台程序中函数的传入参数首字母不能为下划线
- mysql外键使用错误字段名称,不能删除或修改字段名
- 为什么不能够 向接受 const char ** 参数的函数,传入 char ** 参数?
- 在函数中改变传入的参数值:引用参数的使用
- 需要DLL函数输出的结果信息,尽量使用传入参数做为输出变量~!
- 用mask掩码处理图片,Mat::copyTo函数第一个用于输出的传入参数不能是原图片
- dll导出中函数中使用CString类型的参数引发的ESP出错
- CreateRemoteThread函数多参数传入使用方法
- 编写一个函数reverse_string(char * string) 实现:将参数字符串中的字符反向排列。 要求:不能使用C函数库中的字符串操作函数
- 函数调用参数时不能使用表达式