如何在插入前为Interactive Grid列自动赋值?遇ORA-01400错误
Oracle APEX Interactive Grid 插入前设置隐藏列值问题排查
你当前的设置方式不正确,直接在前置流程中给页面项赋值的逻辑,无法将值同步到Interactive Grid(IG)的待插入行数据中,这就是为什么会出现ORA-01400空值插入错误——IG提交的行里HOSPITAL_NO依然是空的。
正确的实现方式有两种:
1. 前端JavaScript初始化新增行
通过IG的行初始化事件,在用户新增行时自动填充隐藏列值:
- 进入IG的属性面板,找到「Advanced > JavaScript Initialization Code」
- 填入以下代码:
function(config) { config.initNewRow = function(row) { // 从页面项获取值并赋值给新增行的对应字段 row.HOSPITAL_NO = apex.item('P0_HOSPITAL_NO').getValue(); row.CREATING_DATE = apex.server.formatDate(new Date(), 'YYYY-MM-DD HH24:MI:SS'); row.CREATING_USER = apex.item('P0_USERNAME').getValue(); row.USER_ID = apex.item('P33_USERNAME').getValue(); }; return config; }
这样用户点击新增行时,隐藏列会自动被赋值,提交保存时这些值会随行数据一起传递到后台。
2. 数据库触发器自动填充
如果更倾向于后端控制,可以在目标表上创建BEFORE INSERT触发器:
CREATE OR REPLACE TRIGGER TRG_SYS_CLINIC_USERS_INS BEFORE INSERT ON SYS_CLINIC_USERS FOR EACH ROW BEGIN -- 从APEX会话中获取页面项值,填充到新行 :NEW.HOSPITAL_NO := V('P0_HOSPITAL_NO'); :NEW.CREATING_DATE := SYSDATE; :NEW.CREATING_USER := V('P0_USERNAME'); :NEW.USER_ID := V('P33_USERNAME'); END; /
触发器会在插入操作执行前自动给字段赋值,无需前端额外处理。
内容的提问来源于stack exchange,提问作者Ziad Adnan
相关产品推荐
相关产品推荐

