我有外部光标
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的每条记录。请告诉我如何实现,因为我面临性能问题。
答案 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;
/