PL/SQL函数FIUCIRCUITO返回值异常,请求排查错误原因
问题原因及解决方案
这个问题的核心是参数名与表列名完全重复,导致PL/SQL的标识符解析逻辑出了问题!
你定义的函数参数circuito、anio、mes,恰好和EVENTOS表的列名CIRCUITO、AÑO、MES一一对应。在PL/SQL中,当局部变量/参数名与列名同名时,解析器会优先把标识符当作列名,而不是你传入的参数值。
所以你的函数里的WHERE条件实际上变成了:
WHERE MES = MES AND AÑO = AÑO AND CIRCUITO = CIRCUITO
这三个条件永远为真,相当于没有任何过滤,统计的是整个EVENTOS表的总行数(也就是你看到的1546),而不是符合你指定条件的行数。
解决方法有两种,选其一即可:
方法1:给参数加前缀,避免命名冲突
这是最常用的规范,比如给参数加上p_前缀,明确区分参数和列名:
create or replace FUNCTION FIUCIRCUITO(p_circuito IN EVENTOS.CIRCUITO%TYPE, p_anio IN EVENTOS.AÑO%TYPE, p_mes IN EVENTOS.MES%TYPE) RETURN NUMBER IS fiu NUMBER(8,2); BEGIN SELECT COUNT(*) INTO fiu FROM EVENTOS WHERE MES = p_mes AND AÑO = p_anio AND CIRCUITO = p_circuito; RETURN fiu; END FIUCIRCUITO;
方法2:用函数名限定参数,明确指定引用的是函数参数
如果不想修改参数名,可以在参数前加上函数名,告诉PL/SQL你要引用的是函数的输入参数:
create or replace FUNCTION FIUCIRCUITO(circuito IN EVENTOS.CIRCUITO%TYPE, anio IN EVENTOS.AÑO%TYPE, mes IN EVENTOS.MES%TYPE) RETURN NUMBER IS fiu NUMBER(8,2); BEGIN SELECT COUNT(*) INTO fiu FROM EVENTOS WHERE MES = FIUCIRCUITO.mes AND AÑO = FIUCIRCUITO.anio AND CIRCUITO = FIUCIRCUITO.circuito; RETURN fiu; END FIUCIRCUITO;
修改完成后,再执行你的调用语句:
select FIUCIRCUITO('AEREOPUERTO 1', 2019, 05) from dual;
就能得到正确的结果8了。
另外提一句:你单独执行的SQL里写的是CIRCUITO = 'AEROPUERTO 1',而函数调用传的是'AEREOPUERTO 1'(多了一个字母E),如果这不是笔误的话,后续也要注意这个拼写一致性哦。
内容的提问来源于stack exchange,提问作者Angela Ochoa
相关产品推荐
相关产品推荐

