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. 创建动态动作
- 新建动态动作,触发条件选择定时器,间隔设置为
1000毫秒(即1秒)。 - 添加执行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; - 添加设置值动作,将
P1_LATEST_STATUS_MSG的值设置到静态区域:- 选择jQuery选择器,值为
#status_notice_area。
- 选择jQuery选择器,值为
方案三:ORDS REST接口 + 外部定时调用
适合需要外部系统触发检测逻辑的场景。
1. 创建ORDS REST服务
- 通过SQL Developer或Apex SQL Workshop,创建RESTful服务:
- 服务名称:
status-check-service - 添加GET类型的处理程序,PL/SQL代码逻辑同方案一的存储过程。
- 服务名称:
- 发布服务后,获取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
相关产品推荐
相关产品推荐

