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

Oracle21.3/Apex20.1/ORDS21.4下每秒检查表状态列并触发消息方案咨询

实现方案

基于你的Oracle 21.3、Apex 20.1及ORDS 21.4环境,提供三种不同场景的实现方案:

方案一:Oracle后台定时任务(无前端交互,自动执行)

适合不需要用户操作,后台自动检测并发送消息的场景。

1. 编写检测并发送消息的存储过程

CREATE OR REPLACE PROCEDURE CHECK_STATUS_SEND_NOTICE
IS
    CURSOR c_target_records IS
        SELECT id, status FROM your_table WHERE status IN (1,2); -- 替换为你的表名
    v_notice_content VARCHAR2(300);
BEGIN
    FOR rec IN c_target_records LOOP
        -- 根据状态生成不同消息
        IF rec.status = 1 THEN
            v_notice_content := '记录ID: ' || rec.id || ' | 当前状态为1,触发常规通知';
            -- 示例:发送邮件(需提前配置Oracle邮件服务器)
            UTL_MAIL.SEND(
                sender => 'system@your-domain.com',
                recipients => 'user@your-domain.com',
                subject => '状态通知',
                message => v_notice_content
            );
        ELSIF rec.status = 2 THEN
            v_notice_content := '记录ID: ' || rec.id || ' | 当前状态为2,触发告警通知';
            UTL_MAIL.SEND(
                sender => 'system@your-domain.com',
                recipients => 'admin@your-domain.com',
                subject => '状态告警',
                message => v_notice_content
            );
        END IF;
        
        -- 更新状态避免重复发送(根据业务需求可选)
        UPDATE your_table SET status = 0 WHERE id = rec.id;
    END LOOP;
    COMMIT;
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        -- 记录错误日志
        INSERT INTO system_error_log (log_time, error_info) 
        VALUES (SYSTIMESTAMP, '检测任务出错: ' || SQLERRM);
        COMMIT;
END;
/

2. 创建每秒执行的调度任务

BEGIN
    DBMS_SCHEDULER.CREATE_JOB(
        job_name => 'STATUS_CHECK_JOB',
        job_type => 'STORED_PROCEDURE',
        job_action => 'CHECK_STATUS_SEND_NOTICE',
        start_date => SYSTIMESTAMP,
        repeat_interval => 'FREQ=SECONDLY;INTERVAL=1', -- 每秒执行一次
        enabled => TRUE,
        auto_drop => FALSE
    );
END;
/

补充说明

  • 若需发送Apex内部用户通知,可替换UTL_MAIL为Apex内置API:
    APEX_NOTIFICATIONS.ADD_NOTIFICATION(
        p_user => 'TARGET_USER',
        p_subject => '状态通知',
        p_message => v_notice_content
    );
    
  • 需确保当前用户拥有UTL_MAIL或APEX_NOTIFICATIONS的执行权限。

方案二:Apex页面实时检测(前端页面触发)

适合用户在Apex页面操作时,实时显示状态对应的消息。

1. 页面配置

  • 创建一个Apex页面,添加静态文本区域,设置静态ID为status_notice_area。
  • 添加隐藏项P1_LATEST_STATUS_MSG,用于存储检测到的消息内容。

2. 创建动态动作

  1. 新建动态动作,触发条件选择定时器,间隔设置为1000毫秒(即1秒)。
  2. 添加执行PL/SQL代码动作,代码如下:
    DECLARE
        v_current_status NUMBER;
        v_msg VARCHAR2(300);
    BEGIN
        -- 替换为你的查询逻辑,比如根据当前页面记录ID查询
        SELECT status INTO v_current_status FROM your_table WHERE id = :P1_RECORD_ID;
        
        IF v_current_status = 1 THEN
            v_msg := '当前状态:1 - 常规通知';
        ELSIF v_current_status = 2 THEN
            v_msg := '当前状态:2 - 告警通知';
        ELSE
            v_msg := '';
        END IF;
        :P1_LATEST_STATUS_MSG := v_msg;
    END;
    
  3. 添加设置值动作,将P1_LATEST_STATUS_MSG的值设置到静态区域:
    • 选择jQuery选择器,值为#status_notice_area。

方案三:ORDS REST接口 + 外部定时调用

适合需要外部系统触发检测逻辑的场景。

1. 创建ORDS REST服务

  1. 通过SQL Developer或Apex SQL Workshop,创建RESTful服务:
    • 服务名称:status-check-service
    • 添加GET类型的处理程序,PL/SQL代码逻辑同方案一的存储过程。
  2. 发布服务后,获取REST端点URL(示例:http://your-ords-server/ords/your-schema/status-check-service)。

2. 配置外部定时任务

  • Linux系统:使用watch命令实现每秒调用(或编写shell脚本后台运行)
    watch -n 1 curl -X GET http://your-ords-server/ords/your-schema/status-check-service
    
  • Windows系统:通过「任务计划程序」创建任务,每秒执行curl命令调用REST端点。

内容的提问来源于stack exchange,提问作者user22817983

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:35:56