执行存储过程报ORA-00933错误,动态SQL拼接varchar2类型p_CODE异常
错误根因
你遇到的ORA-00933报错由字符串类型变量拼接时缺少单引号转义导致:
你当前代码中AND thlt.CODE = ' || p_CODE|| '的拼接逻辑,最终生成的动态SQL会变成类似AND thlt.CODE = 实际CODE值的格式,而CODE是varchar2类型,查询条件里字符串值必须被单引号包裹,不符合语法规则就会触发报错。
修复方案
方案1:修改单引号拼接逻辑(快速修复)
在拼接p_CODE的位置补充转义后的单引号,动态SQL里两个连续单引号代表一个实际生效的单引号,修改后的对应行代码如下:
AND thlt.CODE = ''' || p_CODE|| '''
拼接后最终生成的SQL会符合varchar2类型的查询语法:AND thlt.CODE = '实际CODE值'
方案2:使用绑定变量(更推荐)
直接拼接变量存在SQL注入风险,也容易出现引号转义错误,建议改用绑定变量传值,修改后的完整动态SQL如下:
OPEN v_cursor FOR ' SELECT thltCt.A_ID A_ID, Sum( ' || v_expression || ' ) "VALUE" FROM tableA thlt join tableB thltCt on thlt.ID = thltCt.THLT_ID WHERE thlt.LS IS NOT NULL AND thlt.CODE = :p_code AND thltCt.A_ID IN (' || P_A_Ids || ' ) GROUP BY thltCt.A_ID' USING p_CODE;
注意:
v_expression是动态拼接的聚合字段,无法使用绑定变量,保持原有拼接逻辑即可;P_A_Ids是多ID拼接的字符串,只要确保内容为合法的数字逗号分隔格式(如'1,2,3')就可以正常运行。
内容的提问来源于stack exchange,提问作者conal
相关产品推荐
相关产品推荐

