Oracle中如何使用DBMS_SCHEDULER并发执行多个存储过程?

轻辰君_4225

轻辰君_4225

2026-10-29

664人浏览

原创

不能直接并发执行p1/p2/p3,因单个job内BEGIN p1; p2; p3; END仍为串行;真并发需三个独立job,用DBMS_SCHEDULER.GENERATE_JOB_NAME确保唯一性,start_date设SYSTIMESTAMP并enabled=>TRUE,通过USER_SCHEDULER_RUNNING_JOBS验证session_id不同即可确认并行。

oracle中如何使用dbms_scheduler并发执行多个存储过程?

不能直接“并发执行”,但能通过创建多个独立 job 实现逻辑并发——关键在 job_name 唯一性、start_date 一致、不互相阻塞。

为什么不能用单个 job 并发跑 p1/p2/p3?

DBMS_SCHEDULER 的每个 job 是串行执行单元:写 BEGIN p1; p2; p3; END; 仍是顺序调用,耗时叠加。真并发必须让三个过程在不同会话中同时运行,而唯一可靠路径就是启动三个彼此无关的 job。

  • job 之间默认无依赖、无锁竞争(除非存储过程内部显式加锁或争抢同资源)
  • 所有 job 都设 start_date => SYSTIMESTAMP,Oracle 会尽力在毫秒级内触发,效果接近并发
  • 别用 auto_drop => TRUE 除非确认过程极快且无需查日志;失败时 job 会被禁用,但保留记录可查

怎么写三个并行 job?用 generate_job_name 最省事

手动拼 job_name 容易重复报 ORA-27477,DBMS_SCHEDULER.GENERATE_JOB_NAME 自动产出唯一名,适合临时/批量场景:

BEGIN
  DBMS_SCHEDULER.CREATE_JOB(
    job_name      => DBMS_SCHEDULER.GENERATE_JOB_NAME('P1_'),
    job_type      => 'PLSQL_BLOCK',
    job_action    => 'BEGIN p1; END;',
    start_date    => SYSTIMESTAMP,
    enabled       => TRUE,
    auto_drop     => FALSE
  );
  DBMS_SCHEDULER.CREATE_JOB(
    job_name      => DBMS_SCHEDULER.GENERATE_JOB_NAME('P2_'),
    job_type      => 'PLSQL_BLOCK',
    job_action    => 'BEGIN p2; END;',
    start_date    => SYSTIMESTAMP,
    enabled       => TRUE,
    auto_drop     => FALSE
  );
  DBMS_SCHEDULER.CREATE_JOB(
    job_name      => DBMS_SCHEDULER.GENERATE_JOB_NAME('P3_'),
    job_type      => 'PLSQL_BLOCK',
    job_action    => 'BEGIN p3; END;',
    start_date    => SYSTIMESTAMP,
    enabled       => TRUE,
    auto_drop     => FALSE
  );
END;
  • 前缀 'P1_' 确保生成名可读,比如 P1_1234567890
  • 必须显式写 auto_drop => FALSE(默认是 FALSE,但显式写更安全)
  • 别漏 enabled => TRUE,否则 job 创建后是 DISABLED 状态,不会跑

并发后怎么确认它们真在同时跑?

查 USER_SCHEDULER_RUNNING_JOBS 视图,不是 USER_SCHEDULER_JOBS —— 后者只存定义,前者才反映实时会话:

QuantOracle
QuantOracle

63个确定性量化金融计算器 + 10个通过MCP的复合工作流。期权定价、Greeks、奇异衍生品、风险指标、投资组合优化……

下载
SELECT job_name, session_id, running_instance, elapsed_time 
FROM USER_SCHEDULER_RUNNING_JOBS 
WHERE job_name LIKE 'P%';
  • 只要返回三行,且 session_id 不同,就说明三个会话正在并行执行
  • elapsed_time 接近说明启动时间一致;若某一个明显滞后,可能是该过程内部有锁等待或资源争用
  • 如果只看到一行,检查是否某个 job 因异常被自动禁用(查 USER_SCHEDULER_JOB_LOG 的 STATUS = 'FAILED')

带参数的存储过程怎么并行?必须用 PLSQL_BLOCK 包裹

想并发跑 proc_sync('20261025') 和 proc_sync('20261026')?STORED_PROCEDURE 类型不支持传参,硬写会报 ORA-27469。唯一办法是:

  • 每个 job 单独用 PLSQL_BLOCK,把参数写死或用函数动态生成
  • 例如:job_action => 'BEGIN proc_sync(''20261025''); END;'(注意单引号要双写)
  • 如果参数需每次计算(如取昨天日期),写成:'BEGIN proc_sync(TO_CHAR(SYSDATE-1, ''YYYYMMDD'')); END;' —— 这个表达式在每次 job 执行时重算,不是建 job 时快照
  • 别试图复用同一个 job 改参数:SET_JOB_ARGUMENT_VALUE 只对 PROGRAM 类型生效,不适用于直接 CREATE_JOB

真正要注意的是资源上限——Oracle 默认并发 job 数受 job_queue_processes 参数限制(通常为 1000),但实际并发度还取决于系统 CPU、PGA 和存储过程自身是否主动 sleep 或锁表。跑之前先看 V$RESOURCE_LIMIT 里 jobs 的 CURRENT_UTILIZATION,别堆到临界点再排查超时。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

oracle 存储过程

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
oracle清空表数据
oracle清空表数据

当表中的数据不需要时,则应该删除该数据并释放所占用的空间。本专题为大家提供oracle清空表数据的相关文章,帮助大家解决该问题。

2023.08.16

1041

5

Oracle中declare的使用
Oracle中declare的使用

Oracle DECLARE语句是PL/SQL编程语言中用于声明变量、常量、游标或异常的关键字。它的主要作用是在程序中定义这些对象,以便在后续的代码中使用。DECLARE语句的语法简单明了,可以根据需要声明多个对象。通过使用这些声明的对象,可以进行各种操作,如计算、查询数据库、处理异常等 。

2023.09.15

3093

5

oracle怎么分页
oracle怎么分页

实现分页的步骤:1、使用ROWNUM进行分页查询;2、在执行查询之前进行设置分页参数;3、使用"COUNT(*)"函数来获取总行数,并使用"CEIL"函数来向上取整计算总页数;4、在外部查询中使用"WHERE"子句来筛选出特定的行号范围,以实现分页查询。想了解更多oracle怎么分页的文章,可以来阅读本专题先的文章。

2023.09.18

3110

5

Oracle查看表操作历史记录
Oracle查看表操作历史记录

查看操作历史记录的方法:1、使用Oracle内置的审计功能,可以记录数据库中发生的各种操作,包括登录、DDL语句、DML语句等;2、使用Oracle日志文件,其中包含了数据库中发生的各种操作,可以通过查看日志文件来获取操作历史记录;3、使用Oracle的Flashback功能,可以查看数据库在某个时间点的操作历史记录;4、使用第三方工具等。本专题还提供其他查看表操作的文章,大家可以免费阅读。

2023.09.19

1769

3

Oracle中RAC的用法
Oracle中RAC的用法

Oracle中RAC的用法:1、通过在多个服务器上运行数据库实例来提供高可用性;2、允许在需要时增加或减少节点数量;3、通过将工作负载分布到多个节点上来实现负载均衡;4、使用共享存储来实现多个节点之间的数据共享;5、允许多个节点同时处理数据库请求,从而实现并行处理;6、提供了透明故障切换功能;7、使用了一些技术来确保数据的一致性;8、提供了管理工具来简化RAC环境的管理和维护。本专题还提供RAC相关的其他文章,大家可以免费阅读。

2023.09.19

2393

7

oracle imp
oracle imp

imp是Oracle数据库中的一个命令行工具,用于将导出的数据和对象从一个数据库实例导入到另一个数据库实例。imp命令的一般语法为“imp username/password@connect_string file=file_name [options]”。

2023.09.19

3269

4

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4709

19

oracle通配符有哪些
oracle通配符有哪些

oracle通配符有“%”、“_”、“[]”和“[^]"。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.08

257

5

oracle四舍五入怎么操作
oracle四舍五入怎么操作

oracle四舍五入操作可以使用ROUND函数来实现,其语法为“ROUND(number, decimal_places)”,其中,number是要进行四舍五入的数值,decimal_places是指定的小数位数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.14

846

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程