Oracle APEX execute immediate含用户查询报ORA-00900如何解决
报错原因
ORA-00900由两个写法错误导致:
q'[...]'是Oracle的原生字符串转义语法,方括号包裹的内容才是实际要执行的SQL文本,你在左方括号后多写了一个多余单引号,导致传入execute immediate的文本开头带无效单引号,本身就不符合SQL语法规范。- 即使去掉多余单引号,直接把
v('APP_USER')硬编码在动态SQL文本中,既存在SQL注入风险,若执行上下文脱离APEX会话环境,还会出现v()函数无法识别、取值为空的问题。
正确实现方案
优先使用绑定变量传参,性能更优、安全性更高,无需在动态SQL内部依赖APEX环境函数:
declare l_login_email varchar2(255); begin -- 外层提前获取当前登录用户的小写邮箱 l_login_email := lower(v('APP_USER')); -- 通过绑定变量传入参数执行删除 execute immediate 'delete from MY_TABLE where USER_EMAIL = :1' using l_login_email; end; /
如果确定代码只会在APEX会话上下文(页面进程、APEX触发的业务逻辑)中执行,也可以直接修正q字符串的写法,注意不要额外加多余单引号:
begin execute immediate q'[delete from MY_TABLE where USER_EMAIL = lower(v('APP_USER'))]'; end; /
提示:第二种写法不推荐在脱离APEX环境的数据库存储过程、定时任务中使用,会因为缺失APEX会话上下文导致取值失败。
内容的提问来源于stack exchange,提问作者JB999
相关产品推荐
相关产品推荐

