多线程在PL / SQL中

时间:2014-02-25 12:45:27

标签: sql multithreading oracle plsql

我有外部光标

 CURSOR C1 IS
      SELECT CBAT.*, ROWID ROWID2
        FROM table CBAT
       WHERE ATTRIBUTE3 IS NULL
         AND ATTRIBUTE4 = 'COSTPROCESSED'
         AND AP_DOCUMENT_REF IS NULL;

和1个内部光标

CURSOR C2(C1_MONTH VARCHAR2, C1_YEAR VARCHAR2, C_CMCA_PROJECT_ID VARCHAR2, C_CMCA_EMPLOYEE_NUMBER VARCHAR2)

并且处理似乎是

FOR I IN C1 LOOP       
    BEGIN
      FOR J IN C2(I.MONTH,
                  I.YEAR,
                  I.CMCA_PROJECT_ID,
                  I.CMCA_EMPLOYEE_NUMBER) LOOP

处理: - 对于光标c1中的每个记录,我需要检查光标c1中的员工,项目编号和月份是否存在于第二个光标C2中。如果条件满足,我需要更新自定义表。所以这个处理需要很长时间。如何减少处理时间

在我的C1游标中,有1000个记录,并在游标c2中处理单个记录。对于每一行,它花费了大量时间,并且对于所有1000条记录,它所花费的时间超过2hours

我知道多线程概念,但不知道如何实现。谁能告诉我如何实现这个概念。

根据我的要求,我需要检查从光标c1到光标c2的每条记录。请告诉我如何实现,因为我面临性能问题。

1 个答案:

答案 0 :(得分:4)

该概念称为jobs,您可以发布它们,以便在后台处理它们。

来自here的示例:

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name             => 'oe.my_job1',
   job_type             => 'PLSQL_BLOCK',
   job_action           => 'BEGIN DBMS_STATS.GATHER_TABLE_STATS(''oe'',
                            ''sales''); END;',
   start_date           => '15-JUL-08 1.00.00AM US/Pacific',
   repeat_interval      => 'FREQ=DAILY', 
   end_date             => '15-SEP-08 1.00.00AM US/Pacific',
   enabled              =>  TRUE,
   comments             => 'Gather table statistics');
END;
/