0

我想在另一个/子过程填充表时计算父过程中的表。这个第二个/智利程序作为一个工作从第一个/父级内部开始。以上是我需要根据计数在第一/父母内部做出的某些决定的简单描述。例如,如果在第一个/父级中读取的表的行计数值达到某个值,我想杀死/删除第二个/子作业。但是,我总是在第一个/父级中得到 count(*) = 0,即使表上的 select * 显示子过程正在填充表。可能是什么原因以及获得计数的方法是什么?下面是一个测试脚本:

create table test_j(col1 number);

create or replace PROCEDURE parent_job_sp
as
    g_jobid_child   number := -1;
    v_child_cnt     number := -1;
begin
    DBMS_OUTPUT.PUT_LINE ('START - parent_job_sp');
    DBMS_JOB.SUBMIT(g_jobid_child,'GFF_LOAD.child_job_sp;');
    COMMIT;
    DBMS_OUTPUT.PUT_LINE ('g_jobid_child='||g_jobid_child);
    while (v_child_cnt<=8)
    loop
        DBMS_OUTPUT.PUT_LINE ('v_child_cnt='||v_child_cnt);
        execute immediate 'select count(*) from test_j' into v_child_cnt;
        if v_child_cnt >= 8
        then
            BEGIN 
                DBMS_JOB.remove(g_jobid_child); 
                COMMIT;
                DBMS_OUTPUT.PUT_LINE ('REMOVED JOB '||g_jobid_child);
            EXCEPTION 
                WHEN OTHERS THEN 
                    IF SQLCODE=-23421 
                    THEN DBMS_OUTPUT.PUT_LINE('THEN'); 
                    ELSE DBMS_OUTPUT.PUT_LINE('ELSE'); 
                    END IF; 
            END;
        end if;
    DBMS_OUTPUT.PUT_LINE ('OUTSIDE IF');
    end loop;
    DBMS_OUTPUT.PUT_LINE ('OUTSIDE WHILE');
exception   --- proc-level exception
    when others then
        DBMS_OUTPUT.PUT_LINE('parent_job_sp - '||SQLERRM);
end;    --- end proc

create or replace PROCEDURE child_job_sp
as
PRAGMA AUTONOMOUS_TRANSACTION;
begin
    for cur_test in
    (
        select rownum row_num from dual connect by level<=1000
    )
    loop
        insert into test_j values (cur_test.row_num);
        commit;
    end loop;
    COMMIT;
exception   --- proc-level exception
    when others then
        DBMS_OUTPUT.PUT_LINE('child_job_sp - '||SQLERRM);
end;    --- end proc

--- 然后从 SQL*Plus 运行: exec parent_job_sp

--- 我总是得到 v_child_cnt=0 即使来自 test_j 的选择计数(*)的结果是 1000。

可能是什么原因以及获得计数的方法是什么?

4

0 回答 0