Oracle APEX表单提交后如何自动更新关联泊位状态值
方案总览
别用纯前端动态动作实现核心状态逻辑,前端校验可以被跳过(比如篡改提交参数、直接后台写数据),很容易出现泊位重复占用的脏数据。所有状态变更逻辑下沉到数据库层实现,可靠性最高,APEX端只需要保留原有LOV过滤逻辑即可,不需要额外写复杂的页面处理。
1. 提交预约自动占用泊位实现
给BROD表创建AFTER INSERT行级触发器,只要有新预约记录插入(不管是APEX表单提交、后台SQL录入还是其他接口写入),自动把关联泊位状态更新为TAKEN:
CREATE OR REPLACE TRIGGER TRG_BROD_LOCK_VEZ AFTER INSERT ON BROD FOR EACH ROW BEGIN UPDATE VEZ SET VEZ_STATUS = 'TAKEN' WHERE ID_VEZ = :NEW.ID_VEZ_FK; END; /
记得给
BROD.ID_VEZ_FK字段创建外键约束关联VEZ.ID_VEZ,避免提交不存在的泊位ID导致无效更新。
2. 泊位自动释放实现
分两种场景处理,覆盖删除预约、预约过期两个触发条件:
场景1:删除预约记录时释放泊位
给BROD表创建AFTER DELETE行级触发器,删除预约时先检查该泊位有没有其他未到期的有效预约,没有的话自动把状态改回FREE:
CREATE OR REPLACE TRIGGER TRG_BROD_RELEASE_VEZ_ON_DEL AFTER DELETE ON BROD FOR EACH ROW DECLARE V_EXIST_VALID_BOOK NUMBER; BEGIN SELECT COUNT(1) INTO V_EXIST_VALID_BOOK FROM BROD WHERE ID_VEZ_FK = :OLD.ID_VEZ_FK AND DATE_OD_DEPARTURE >= TRUNC(SYSDATE); IF V_EXIST_VALID_BOOK = 0 THEN UPDATE VEZ SET VEZ_STATUS = 'FREE' WHERE ID_VEZ = :OLD.ID_VEZ_FK; END IF; END; /
场景2:预约到期自动释放
用Oracle内置的DBMS_SCHEDULER创建每日定时任务,凌晨低峰期批量扫描所有到期预约,把没有后续有效预约的泊位重置为空闲,不需要依赖用户访问页面触发:
-- 第一步:创建到期泊位释放存储过程 CREATE OR REPLACE PROCEDURE PROC_RELEASE_EXPIRED_VEZ IS BEGIN UPDATE VEZ V SET V.VEZ_STATUS = 'FREE' WHERE V.VEZ_STATUS = 'TAKEN' AND NOT EXISTS ( SELECT 1 FROM BROD B WHERE B.ID_VEZ_FK = V.ID_VEZ AND B.DATE_OD_DEPARTURE >= TRUNC(SYSDATE) ); COMMIT; END; / -- 第二步:创建每日凌晨2点执行的定时任务 BEGIN DBMS_SCHEDULER.CREATE_JOB( JOB_NAME => 'JOB_DAILY_RELEASE_VEZ', JOB_TYPE => 'STORED_PROCEDURE', JOB_ACTION => 'PROC_RELEASE_EXPIRED_VEZ', START_DATE => SYSTIMESTAMP, REPEAT_INTERVAL => 'FREQ=DAILY;BYHOUR=2;BYMINUTE=0;BYSECOND=0', ENABLED => TRUE ); END; /
可选前端体验优化
原有LOV只展示VEZ_STATUS='FREE'泊位的逻辑可以保留,额外可以做两个小优化提升使用体验:
- 给BROD表加表级CHECK约束:
CHECK (DATE_OD_DEPARTURE > DATE_OF_ARRIVAL),从数据库层拦截离港日期早于到港日期的非法数据 - 调整LOV的SQL,增加泊位长度匹配规则,只展示能容纳当前船舶长度的空闲泊位,减少用户选错概率:
SELECT '泊位' || VEZ_NUMBER || '(最大靠泊长度' || VEZ_MAX_LENGTH || 'm)' AS DISPLAY_VALUE, ID_VEZ AS RETURN_VALUE FROM VEZ WHERE VEZ_STATUS = 'FREE' AND VEZ_MAX_LENGTH >= :PXX_SHIP_LENGTH -- 替换为页面上填写船舶长度的项名 ORDER BY VEZ_NUMBER
内容的提问来源于stack exchange,提问作者Fiki
相关产品推荐
相关产品推荐

