You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ORA-00907缺失右括号错误:自定义Checker函数问题咨询

PL/SQL函数Checker错误分析与修正

错误原因

  1. Oracle不支持LIMIT语法
    Oracle数据库没有LIMIT关键字,要获取排序后的第一行,需使用FETCH FIRST 1 ROW ONLY(Oracle 12c及以上版本)或ROWNUM过滤。

  2. 动态SQL的INTO位置错误
    SELECT ... INTO ...是PL/SQL的本地语法,不能嵌入到动态SQL字符串中,正确做法是将INTO result作为EXECUTE IMMEDIATE的子句。

  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:15:51