ORA-00907缺失右括号错误:自定义Checker函数问题咨询
PL/SQL函数Checker错误分析与修正
错误原因
Oracle不支持
LIMIT语法
Oracle数据库没有LIMIT关键字,要获取排序后的第一行,需使用FETCH FIRST 1 ROW ONLY(Oracle 12c及以上版本)或ROWNUM过滤。动态SQL的
INTO位置错误SELECT ... INTO ...是PL/SQL的本地语法,不能嵌入到动态SQL字符串中,正确做法是将INTO result作为EXECUTE IMMEDIATE的子句。SQL注入风险(优化点)
直接拼接参数names会引发SQL注入问题,应使用绑定变量传递参数;表名无法用绑定变量,需确保传入的表名合法。
修正后的函数代码
适用于Oracle 12c及以上版本
CREATE OR REPLACE FUNCTION Checker(table_name VARCHAR, names VARCHAR) RETURN VARCHAR AS result VARCHAR2(255); sql_query VARCHAR2(32767); BEGIN sql_query := 'SELECT StringType FROM ( SELECT StringType, COUNT(*) as num_occurrences FROM ' || table_name || ' WHERE titre = :p_names GROUP BY StringType ORDER BY num_occurrences DESC ) FETCH FIRST 1 ROW ONLY'; EXECUTE IMMEDIATE sql_query INTO result USING names; RETURN result; END; /
兼容Oracle 11g及更早版本(使用ROWNUM)
CREATE OR REPLACE FUNCTION Checker(table_name VARCHAR, names VARCHAR) RETURN VARCHAR AS result VARCHAR2(255); sql_query VARCHAR2(32767); BEGIN sql_query := 'SELECT StringType FROM ( SELECT StringType, COUNT(*) as num_occurrences FROM ' || table_name || ' WHERE titre = :p_names GROUP BY StringType ORDER BY num_occurrences DESC ) WHERE ROWNUM = 1'; EXECUTE IMMEDIATE sql_query INTO result USING names; RETURN result; END; /
调用验证
执行原调用语句即可正常返回结果:
select Checker('Table_Name', 'WantedName') as blabla from dual;
内容的提问来源于stack exchange,提问作者TourEiffel
相关产品推荐
相关产品推荐

