我可以异步触发Oracle数据库中的存储过程吗?

时间:2017-12-19 06:53:42

标签: python oracle stored-procedures

所以我有一个Oracle数据库,我使用CX_ORACLE包从我的Python模块连接到该数据库 只要我进行同步调用,这种方法就可以正常工作,但我试图找出一种方法可以使异步,因为我在Oracle上的存储过程可能需要花费太多时间,而且我与Oracle的连接超时。

有没有办法可以从我的Python模块触发我的存储过程并关闭连接而不终止存储过程触发的实例?

1 个答案:

答案 0 :(得分:3)

你问的方式 - 没有。当你断开连接时,oracle会杀死你的会话(或至少试图杀死)。但是你可以创造一份工作。 Job是由oracle实例管理的对象。它有一个用于运行的计划。创建作业的最简单示例,该作业将运行一次存储过程:

begin
  dbms_scheduler.create_job(
      job_name           =>  'My job',
      job_type           =>  'STORED_PROCEDURE',
      job_action         =>  'YOUR_SCHEMA.YOUR_PACKAGE.YOUR_PROCEDURE',
      start_date         =>  'desired date to start',
      repeat_interval    =>  'FREQ=DAILY;INTERVAL=1', /* every day */
      end_date           =>  'desired date to stop',
      comments           =>  'I will run it from python');
end;

仅在离开start_daterepeat_intervalend_date null时运行您的程序:

begin
  dbms_scheduler.create_job(
      job_name           =>  'My job',
      job_type           =>  'STORED_PROCEDURE',
      job_action         =>  'YOUR_SCHEMA.YOUR_PACKAGE.YOUR_PROCEDURE',
      comments           =>  'I will run it from python');
end;

Oracle Scheduler是一个非常复杂和强大的工具。您可以使用参数,匿名块,创建复杂的计划等运行过程。要了解更多信息,请参阅文档:SchedulerDBMS_SCHEDULER