Oracle动态SQL执行UPDATE语句报ORA-00933错误如何解决
错误原因
- 动态SQL拼接时缺少必要空格:第一个字符串
'UPDATE TABLE1'结尾没有空格,和后续的'SET INC = '拼接后会生成UPDATE TABLE1SET的非法SQL片段,不符合语法规则。 - 动态SQL末尾多余分号:
EXECUTE IMMEDIATE执行的原生SQL语句不允许携带结尾的分号,分号是PL/SQL或数据库客户端的语句结束标识,不属于SQL语法本身。 - 补充:原代码的异常输出JSON格式不完整,缺少结尾的
"},会导致输出的JSON结构非法。
修复方案
快速修复原有拼接写法
直接修正空格和多余分号即可:
sqlStmt:= 'UPDATE TABLE1 ' -- 结尾新增空格 || 'SET INC = ' || '(select INC from TABLE2 ' || 'WHERE KEY = ''' || v_key_value || ''' ' || 'FETCH FIRST 1 ROW ONLY)'; -- 移除结尾的分号 BEGIN EXECUTE IMMEDIATE sqlStmt; EXCEPTION WHEN OTHERS THEN dbms_output.put_line('{"errorcode":"' || SQLERRM || '"}'); -- 补全JSON闭合符号 ROLLBACK; END;
更推荐的绑定变量写法
避免字符串拼接带来的SQL注入风险、引号转义错误问题,性能也更优:
sqlStmt:= 'UPDATE TABLE1 ' || 'SET INC = ' || '(select INC from TABLE2 ' || 'WHERE KEY = :key_val ' || 'FETCH FIRST 1 ROW ONLY)'; BEGIN EXECUTE IMMEDIATE sqlStmt USING v_key_value; -- 通过USING子句传入变量,无需手动转义引号 EXCEPTION WHEN OTHERS THEN dbms_output.put_line('{"errorcode":"' || SQLERRM || '"}'); ROLLBACK; END;
内容的提问来源于stack exchange,提问作者SirLancillotto
相关产品推荐
相关产品推荐

