Oracle APEX交互式网格自定义PL/SQL过程无法返回主键问题咨询
解决Oracle APEX交互式网格主键返回报错问题
问题背景
使用自定义PL/SQL过程处理APEX交互式网格(IG)的CRUD操作,禁用了原有的主键生成触发器,改为在过程中手动获取序列值插入。更新、删除操作正常,但插入时returning ID into :ID语句报错;若改用触发器+原生IG保存流程,勾选“Insert后返回主键”,仅当ID列设为Hidden类型时正常,列可见则触发报错。
方案一:修复自定义PL/SQL过程的主键返回问题
1. 调整绑定变量方向
在APEX的自定义PL/SQL处理配置中,找到:ID绑定变量,将其方向设置为IN OUT(输入输出)。默认情况下,来自IG列的绑定变量为输入类型,无法接收返回值,必须修改为双向绑定才能让returning语句生效。
2. 优化PL/SQL代码(可选)
无需提前查询序列值,直接在INSERT语句中调用序列,减少不必要的DUAL表查询:
declare begin case :APEX$ROW_STATUS when 'D' then -- 删除记录 delete from T_DQ_RULE_CONFIG where ID = :ID; when 'U' then -- 更新记录 update T_DQ_RULE_CONFIG set dq005_sapphire_outcome = :DQ005_SAPPHIRE_OUTCOME, dq005_alias_term = :DQ005_ALIAS_TERM where ID = :ID; when 'C' then -- 插入新记录并返回主键 INSERT INTO t_dq_rule_config ( ID, RULE_ID, DQ005_SAPPHIRE_OUTCOME, DQ005_ALIAS_TERM ) VALUES ( DQ_RULE_CONFIG_SEQ.nextval, 81, :DQ005_SAPPHIRE_OUTCOME, :DQ005_ALIAS_TERM ) returning ID into :ID; end case; end;
3. 配置IG列属性
在IG的ID列属性中,确保:
- 源类型设为“数据库列”
- 保存时属性设置为“返回值”,让IG明确需要接收插入后生成的主键值。
方案二:使用触发器+原生IG保存,实现ID列可见且正常工作
若倾向于使用触发器生成主键,可按以下步骤解决ID列可见时的报错问题:
1. 恢复主键生成触发器
创建或启用行级前置插入触发器,自动生成主键:
create or replace trigger TRG_DQ_RULE_CONFIG_INS before insert on T_DQ_RULE_CONFIG for each row begin if :new.ID is null then :new.ID := DQ_RULE_CONFIG_SEQ.nextval; end if; end;
2. 配置IG保存选项
在IG的属性→高级→保存选项中,勾选“插入后返回主键”。
3. 设置ID列为只读
将ID列的编辑类型设为“只读”,并在列属性→高级中启用“序列缓存”。
- 核心原因:若ID列可见且可编辑,APEX会尝试将用户输入的空值传递给数据库,即使触发器会覆盖该值,APEX原生保存逻辑会因传入值与返回值不一致报错。设为只读后,APEX不会传递ID的输入值,仅接收返回的主键,避免冲突。
内容的提问来源于stack exchange,提问作者smackenzie
相关产品推荐
相关产品推荐

