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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:06:54