精华内容
下载资源
问答
  • Oracle并行调用存储过程

    千次阅读 2019-01-09 23:33:00
    Oracle并行调用存储过程 网上很少看到有对Oracle并行的介绍,下面通过Oracle中的dbms_job包实现存储过程并行调用: create table a(id number); create table b(id number); create or replace procedure pro_a ...

    Oracle并行调用存储过程

    网上很少看到有对Oracle并行的介绍,下面通过Oracle中的dbms_job包实现存储过程的并行调用:

    create table a(id number);
    create table b(id number);
    
    create or replace procedure pro_a is
    begin
      for i in  1 .. 10 loop
        insert into a values (i);
        dbms_lock.sleep(5);
        commit;
      end loop;
    end;
    /
    
    create or replace procedure pro_b(v_num in number default 10) is
    begin
      for i in reverse 1 .. v_num loop
        insert into b values (10+i);
        dbms_lock.sleep(5);
        commit;
      end loop;
    end;
    /
    
    -- 串行
    begin
      pro_a;
      pro_b;
    end;
    /
    
    CREATE OR REPLACE PROCEDURE pro_job(pro_name in varchar2) as
      v_job binary_integer;
    begin
      -- 通过一个job一个存储过程来实现并行调用
      dbms_job.submit(v_job,pro_name);
      dbms_output.put_line(v_job);
      commit;
    end;
    /
    
    -- 并行执行存储过程
    begin
      pro_job('pro_a;');
      pro_job('pro_b(''7'');');
    end;
    /
    
    --查询是否并行
    select * from a;
    select * from b;
    
    --删除重新实验
    --delete from a;
    --delete from b;
    --commit;
    
    --查询job的运行情况
    select * from user_jobs;
    select * from dba_jobs_running;
    

    也可以使用DBMS_SCHEDULER来实现,可参考
    https://docs.oracle.com/cd/E11882_01/server.112/e25494/appendix_a.htm#ADMIN11002

    展开全文
  • Oracle11gR2 并行执行存储过程

    千次阅读 2019-06-19 18:14:59
    现在我们有3个存储过程,分别是p1,p2,p3 如果按下列方式执行 begin p1; p2; p3; end; 它们是串行的。 我们可以使用DBMS_SCHEDULER包来间接实现并行执行,具体用法如下: begin dbms_scheduler.create_job...

    现在我们有3个存储过程,分别是p1,p2,p3

    如果按下列方式执行

    begin
        p1;
        p2;
        p3;
    end;

    它们是串行的。

    我们可以使用DBMS_SCHEDULER包来间接实现并行执行,具体用法如下:

    begin
      dbms_scheduler.create_job(job_name   => dbms_scheduler.generate_job_name,
                                job_type   => 'PLSQL_BLOCK',
                                job_action => 'begin p1; end;',
                                start_date => sysdate,
                                enabled    => true,
                                comments   => 'temporary job,will be delete soon after complete!',
                                auto_drop  => true
                                );
      dbms_scheduler.create_job(job_name   => dbms_scheduler.generate_job_name,
                                job_type   => 'PLSQL_BLOCK',
                                job_action => 'begin p2; end;',
                                start_date => sysdate,
                                enabled    => true,
                                comments   => 'temporary job,will be delete soon after complete!',
                                auto_drop  => true
                                );                            
      dbms_scheduler.create_job(job_name   => dbms_scheduler.generate_job_name,
                                job_type   => 'PLSQL_BLOCK',
                                job_action => 'begin p3; end;',
                                start_date => sysdate,
                                enabled    => true,
                                comments   => 'temporary job,will be delete soon after complete!',
                                auto_drop  => true
                                );
    end;

    使用create_job来创建并立即执行一个job,执行完之后系统会自动删除。其中:

    dbms_scheduler.generate_job_name 用来创建一个job_name,默认是JOB$_加上一个递增的数字,形如 JOB$_7983

    start_time => sysdate 表示立即执行(需要同时将enabled设置为true)

    enabled => true 只有这样才会立即执行

    auto_drop => true 表示执行完自动删除

    由于我们没有指定任何重复执行的参数,所以job创建后,它的SCHEDULE_TYPE=ONCE,而不是一般的CALENDAR。

    可以通过

    select * from user_scheduler_jobs;

    查看。

    在我的工作中遇到这么一个实际需求,伪代码如下:
     

    begin
    for rows in (select COL1 from tab) loop
        业务逻辑处理;
    end loop;
    end;

    处理逻辑部分比较简单,但是循环次数比较多,所以考虑将数据分片执行。

    begin
      for rows in (select col1
                     from (select mod(rownum, v_parallel_degree) + 1 part,
                                  --part要加1,因为是取余
                                  col1
                             from (select col1 from tab order by col2))
                    where part = v_part) loop
      end loop;
    end;
    
    其中:
     v_parallel_degree:分片的数量
     v_part:用来取第x分片

    将以上代码放到存储过程中,两个入参:v_parallel_degree,v_part

    最后使用一个存储过程来调用

    --***************************创建一个工具包用来创建job***************************
    
    create or replace package pkg_utils is
    
      procedure exec_pkg(v_pkg_name in varchar2);
    
      --并行执行存储过程
      procedure exec_proc_parallel(v_procedure_name  in varchar2,
                                   v_parallel_degree in int);
    
    end pkg_utils;
    
    /
    create or replace package body pkg_utils is
    
      --并行执行存储过程
      procedure exec_proc_parallel(v_procedure_name  in varchar2,
                                   v_parallel_degree in int) is
      
      begin
        for i in 1 .. v_parallel_degree loop
          dbms_scheduler.create_job(job_name   => dbms_scheduler.generate_job_name,
                                    job_type   => 'PLSQL_BLOCK',
                                    job_action => 'begin ' || v_procedure_name || '(' ||
                                                  v_parallel_degree || ',' || i ||
                                                  '); end;',
                                    start_date => sysdate,
                                    enabled    => true,
                                    comments   => v_procedure_name || '(' || i ||
                                                  ' of ' || v_parallel_degree || ')',
                                    auto_drop  => true);
        end loop;
      end exec_proc_parallel;
    
    begin
      -- initialization
      null;
    end pkg_utils;
    /
    
    --***************************调用实例***************************
    begin
      pkg_utils.exec_proc_parallel('PROCEDURE_NAME', 16);
    end;
    /

     

    展开全文
  • oracle并行执行存储过程的小案例前言一、操作流程1.查询一下create job的权限2.建日志表和可延时的存储过程来测试并行和串行执行存储过程的效果3.执行并行和串行的plsql来测试 前言 Oracle的dbms_scheduler包也可以...


    前言

    Oracle的dbms_scheduler包也可以创建Job,来定时、并行执行任务。下面给一个测试的小案例,方便入门。


    一、操作流程

    1.查询一下create job的权限

    代码如下:

    Select * From Session_Privs;
    

    在这里插入图片描述
    如果没有Create Job权限,可以参考:https://blog.csdn.net/crystal201314/article/details/100454496

    2.建日志表和可延时的存储过程来测试并行和串行执行存储过程的效果

    代码如下:

    --创建日志表,记录进表的时间,logid可以插入序列号
    create table LOG1
    (
      logid VARCHAR2(20),
      daten DATE
    );
    -- Create sequence 
    create sequence seq_logid
    minvalue 1
    maxvalue 999999999
    start with 1
    increment by 1
    cache 20;
    
    --创建延时的存储过程
    create or replace procedure test_sleep is
    datenow date;
    begin
      insert into log1(LOGID,daten) select seq_logid.nextval,sysdate from dual;
      commit;
    select sysdate + + 1/24/60*1 into datenow from dual;
    loop
    
    exit when datenow < sysdate;
    end loop;
       insert into log1(LOGID,daten) select seq_logid.nextval,sysdate from dual;
    commit;
    end;
    

    3.执行并行和串行的plsql来测试

    代码如下:

    --并行plsql
    begin
      dbms_scheduler.create_job(job_name => 'xxx1',
                                job_type => 'PLSQL_BLOCK',
                                job_action => 'begin test_sleep; end;',
                                start_date => sysdate,
                                enabled => true,    
                                comments => 'temporary job,will be delete soon after complete!',        
                                auto_drop => true
                                );
        dbms_scheduler.create_job(job_name => 'xxx2',
                                job_type => 'PLSQL_BLOCK',
                                job_action => 'begin test_sleep; end;',
                                start_date => sysdate,
                                enabled => true,    
                                comments => 'temporary job,will be delete soon after complete!',        
                                auto_drop => true
                                );
       dbms_scheduler.create_job(job_name => 'xxx3',
                                job_type => 'PLSQL_BLOCK',
                                job_action => 'begin test_sleep; end;',
                                start_date => sysdate,
                                enabled => true,    
                                comments => 'temporary job,will be delete soon after complete!',        
                                auto_drop => true
                                );
    end;
    
    --串行plsql
    begin
    test_sleep;
    test_sleep;
    test_sleep;
    end;
    

    分别执行并行和串行plsql,并行plsql会同时执行存储过程test_sleep,而串行plsql后面的存储过程需要等前面的执行完才会执行。执行完成之后,查看日志表,看并行、串行执行存储过程的效果。

    在这里插入图片描述


    展开全文
  • oracle存储过程通过JOB来实现并行执行

    1、oracle版本为10G及以上,由于网上很多都没有完善,所以特此完善记录下来,仅供参考

    需求:多个无依赖关系的存储过程并行执行(使用该功能前测试下服务器情况,貌似并行任务和数据库的CPU个数有直接关系,小于等于CPU个数*4)。

    实现思路:在存储过程中创建任务,以便能直接通过JAVA输入动态参数调用。

    第一步:建测试表

    create table A ( A INTEGER);

    第二步:创建存储过程

    create or replace procedure test1
    
    (
        i_tjrq   in    number,    --统计日期
        i_err_no out number   --输出参数
    )
    as
    begin
    insert into a values(i_tjrq);
    end;
    
    
    create or replace procedure test2
    (
        i_tjrq   in    number,     --统计日期
            i_err_no out number   --输出参数
    )
    as
    begin
    insert into a values(i_tjrq);
    end;



    第三步:在存储过程中创建任务,以便操作

    CREATE OR REPLACE PROCEDURE test3 (i_tjrq IN NUMBER)  as
    x   NUMBER;
    --m varchar2(100):='declare i_err_no NUMBER;begin test2('||i_tjrq||',i_err_no);test1('||i_tjrq||',i_err_no); end;';
    BEGIN
       --SYS.DBMS_OUTPUT.put_line(m);
       sys.DBMS_JOB.submit (
          job         => x,
          what        => 'declare i_err_no NUMBER;begin test2('||i_tjrq||',i_err_no);test1('||i_tjrq||',i_err_no); end;',
          next_date   => TO_DATE ('14-05-2013 00:00:00', 'dd-mm-yyyy hh24:mi:ss'),
          interval    => 'trunc(sysdate+1)',
          no_parse    => FALSE);
       --SYS.DBMS_OUTPUT.put_line ('Job Number is: ' || TO_CHAR (x));
      
       COMMIT;
    END;


    --值得注意的是sys.DBMS_JOB.submit()里面的参数只在这里做简单的介绍

    job是任务号--系统自行生成

    what是可以存储pl/sql代码的函数,动态输入的变量可以在此拼接。

    其他参数直接参考oracle官方文档或者自行搜索,就不一一叙述了。


    select * from user_jobs 可以查看你用户名下任务的jobid 也就是上面的任务号,单个执行任务用下列语句实现。

    begin
    --dbms_job.remove(39); --删除任务
    dbms_job.run(39);  --运行任务
    end;

    由于是直接创建在存储过程里面的,所以直接调用存储过程即可插入当天的数据。

    begin
      -- Call the procedure
      test3(i_tjrq => :i_tjrq);
    end;  --或者直接在pl/sql工具里面执行,查看a表你会发现系统数据已经插入。


    展开全文
  • 利用job并行执行Oracle存储过程

    千次阅读 2016-12-28 11:13:26
    -- 建立测试表 CREATE ... -- 建立存储过程 CREATE OR REPLACE PROCEDURE p_parallel (p_min IN NUMBER, p_max IN NUMBER) IS BEGIN INSERT INTO t SELECT TRUNC (DBMS_RANDOM.VALUE (p_min,
  • 背景: 最近遇到一个case,Client端程式调用存储过程SP1,过程SP1执行完成后返回结果到Client。 因为过程SP1执行时间要5秒钟,时间Client用户无法接受。 分析...
  • 存储过程内容是有对多个表查询、插入、更新等操作。 假如一个存储过程执行要10s。启动了10个java线程同时调用同一个存储过程存储过程并行还是串行,要10s还是100s?  </p>
  • Kettle 调用存储过程

    万次阅读 2017-04-11 11:24:53
    不带参数的存储过程可以直接使用“调用DB存储过程”控件,将存储过程名称配置进去即可。 带返回值的参数 CREATE OR REPLACE PROCEDURE JOBTEST(CCX OUT NUMBER) AS BEGIN CCX:=88 ; DBMS_OUTPUT.PUT_LINE...
  • plsql 调用存储过程

    千次阅读 2017-10-30 11:04:56
    打开sql 命令窗口 如果有输出参数,请先声明。如var str VARCHAR2(50); 调用存储过程 exec proname(参数1,参数2,。。。。,:str); //输出参数前加:
  • SHELL脚本调用存储过程

    万次阅读 2018-01-09 09:41:16
    #!/bin/bash export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1 export ORACLE_SID=orcl export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export PATH=$ORACLE_BASE/bin:$ORACLE_HOME/bin:$PATH...
  • 最近遇到一个数据库存储过程多线程运算的问题,按照常规的做法,是写一个程序,在程序内多线程执行业务逻辑,这样做也不是不可以,但有以下不便:  1.开发周期,在存储过程中实现的业务逻辑,在程序里实现一遍...
  • 自动执行存储过程

    千次阅读 2007-09-29 02:19:00
    启动时自动执行存储过程[浏览:87 评论(0条)] 来源:it168 [2006-10-02]如何在启动SQL SERVER的时候,执行一个存储过程? 将存储过程创建在master数据库中,然后企业管理器中找到这个存储过程--右键--属性--勾选...
  • plsql之存储过程调用执行

    万次阅读 2011-11-15 09:15:59
     2 存储过程的参数模式 存储过程的参数特性: IN类型的参数 OUT类型的参数 IN-OUT类型的参数 值被 传递给子程序 返回给调用环境 传递给子程序 返回给调用环境 参数形式 常量 未初始化的变量
  • 并行网络存储系统是浪潮存储开发的新一代网络存储系统。浪潮并行文件系统以PVFS作为开发原型,并在此基础上进行改进,使其与并行网络存储系统紧密结合。在这里,将对基于PVFS的浪潮并行文件系统作一个简单的介绍。 ...
  • Oracle--存储过程概述、创建和执行

    千次阅读 2020-01-04 18:27:25
    存储过程是一种命名PL/SQL程序块,它将一些相关的SQL语句、流程控制语句组合在一起,用于执行某些特定的操作或者任务,可以将经常需要执行的特定的操作写成过程。通过过程名,就可以多次调用过程,从而实现程序的...
  • Sqlserver定时执行存储过程

    千次阅读 2016-11-10 17:28:02
    --方法1:作业里定时执行存储过程定时作业的制定    企业管理器  --管理  --SQL Server代理  --右键作业  --新建作业  --"常规"项中输入作业名称  --"步骤"项  --新建  --...
  • 存储过程创建在master数据库中,然后企业管理器中找到这个存储过程--右键--属性--勾选"每当sql server启动时执行"。 或者在master中创建存储过程后,执行语句设置为自动启动 use master exec sp_procoption 存储...
  • Oracle并行执行

    千次阅读 2015-02-13 10:49:18
    执行一个sql 时,分配多个并行进程同时执行数据扫描,连接以及聚合等操作,使用更多的资源,得到更快的sql 响应时间并行执行是充分利用硬件资源,处理大量数据时的核心技术。  在本文中,在一个简单的星型...
  • SAP HANA中调试存储过程

    千次阅读 2016-05-03 14:06:58
    当对一个存储过程进行调试时,这个存储过程中的代码将被顺序执行,而并不是按照实际的可能情况并行执行。因此在对存储过程进行调试时,只是为了验证逻辑的正确性,查看执行过程中变量的值,而并不能保证调试中的性能...
  • 3.开启2个线程,在线程中循环调用第2步中的存储过程,直到user_status表中记录全部取完(即status全部为1)。要求:在2个线程中取出的userid不能重复。并把取出的userid,打印到某个文件中,一行一个userid 第一点...
  • oracle存储过程的递归调用

    千次阅读 2011-08-30 10:41:36
    心里知道有这么回事,但很少在实践中用到,下面是一个查找父地址的过程。 CREATE OR REPLACE FUNCTION F_CALLPARENTARDADDRESS(V_ARDADDRESSID IN NUMBER,
  • oracle 并行执行sql

    千次阅读 2018-12-06 21:43:24
    并行执行执行sql alter session enable parallel dml; update /*+ parallel(t,100)*/ People t set t.handle_flag='0' where t.handle_flag is null ; commit; alter session disable ...用存储过程执行 加游标...
  • CREATE PROCEDURE创建存储过程存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用...
  • 谈Spark下并行执行多个Job的问题

    万次阅读 多人点赞 2019-03-20 19:08:03
    本文结合笔者的实践场景,探讨了Spark下并行执行多个Job的问题。梳理了Spark任务调度的机制,并总结了实践中需要考虑的问题。
  • SQLServer之创建存储过程

    万次阅读 2018-11-01 11:18:45
    在 SQL Server、 Azure SQL Database、Azure SQL 数据仓库和并行数据库中创建 Transact-SQL 或公共语言运行时 (CLR) 存储过程存储过程与其他编程语言中的过程类似。 可以在当前数据库中创建永久过程,或者在 ...
  • Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行,会长时间占用资源,导致其它任务堵塞。 1.在Spring中这时需要设置concurrent的值为false, 禁止并发...
  • sql存储过程完全教程

    万次阅读 多人点赞 2007-09-22 10:11:00
    各种存储过程使用指南5.ASP中存储过程调用的两种方式及比较6.SQL存储过程在.NET数据库中的应用 7.使用SQL存储过程要特别注意的问题 1.sql存储过程概述 在大型数据库系统中,存储过程和触发器具有很重要的作用。无论...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 258,217
精华内容 103,286
关键字:

并行调用存储过程时间长