Oracle中如何在触发器查询内使用页面项值 解决P23_ID绑定变量报错
错误原因
你遇到的bad bind variable 'P23_ID'错误根源是::Pxx_ITEM格式的绑定变量是Oracle APEX引擎层面才能识别的页面项变量,纯数据库端的PL/SQL触发器运行时默认没有APEX上下文,无法直接解析这类绑定变量。
另外你写的触发器还有一个致命逻辑问题:在my_table的BEFORE INSERT行级触发器中,又对my_table执行INSERT操作,会触发递归调用,直接抛出**变易表(mutating table)**错误,完全不需要写二次插入语句——行级触发器里直接修改:new伪记录的字段值,就会直接作用到当前待插入的行上。
正确实现方案
方案1:触发器内调用APEX内置方法取页面项值(无需修改前端逻辑)
只要触发器执行时处于APEX页面提交的会话上下文中,就可以通过APEX官方提供的工具包函数读取页面项值,修正后的代码如下:
Create or replace trigger "newTRG" Before Insert on "my_table" For each row Begin If :new."ID" is null then -- 读取APEX会话中P23_ID页面项的值,直接赋值给新记录的ID字段 :new."ID" := apex_util.get_session_state('P23_ID'); end if; End; /
如果是低版本APEX,也可以用通用的v()函数取值,效果完全一致:
:new."ID" := v('P23_ID');
方案2:解耦前端与数据库逻辑(架构层面推荐使用)
不建议在数据库触发器里硬耦合APEX页面项,会导致触发器脱离APEX环境就失效。更合理的做法是直接在APEX页面的提交逻辑、插入数据源配置中,给ID字段设置默认值为:P23_ID,插入时直接把值传入表中,不需要额外写触发器处理。
内容的提问来源于stack exchange,提问作者Arifullah
相关产品推荐
相关产品推荐

