You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 16:40:26