程序

时间:2016-11-22 15:26:04

标签: oracle stored-procedures plsql

上下文:Oracle DB(plsql)

现在我有了这个程序,我们称之为 main 在主要内部我只是检查一些数据的完整性 如果一切正常,我会调用第二个程序(在main中),我称之为 import 导入将临时表中的数据插入到历史记录表中(不提交)。 在 import 里面我发现了任何异常。
最后, import 返回一个布尔值,如果成功与否,则处理返回 main
main 检查 import 是否正确,如果是,请调用第三个程序 stats

现在提问:

stats 是否可能无法查看 import 所做的更改?
我的意思是, stats 了解新数据那个导入导入历史表?

“伪代码”:

主要程序

select count(*) into var1
from table1;

if var1 == 0 then
    storeprocedure_import(result);

    if (result) = true then
          storeprocedure_stats(result);
    end if;
end if;

IMPORT PROCEDURE

insert /*+ append */  into table_history
       select *
       from table_temporany;

STAT程序

for tmp_data in (select distinct(data) dta
                     from table_history
                     order by dta)
    loop



      delete from stats_table
      where data = tmp_data.dta;

      insert into stats_table
        select tmp_data.dta, count(*) unique_stb
        from table_history
        where tmp_data.dta = table_history.data
        group by table_history.data;

    end loop;

现在我对此有一些疑问

   insert into stats_table
        select tmp_data.dta, count(*) unique_stb
        from table_history
        where tmp_data.dta = table_history.data
        group by table_history.data;

因为我不确定在调用 stats 时,它知道 import 导入的table_history中的新日期

1 个答案:

答案 0 :(得分:1)

正如Boneist所提到的,所有程序都在同一个交易中运行(除非你用pragma automomous_transaction另有说明,但不要去那里)。

我怀疑由于导入过程中的insert /*+ append */而存在问题,因为必须先提交直接路径操作才能对表执行任何操作,包括查询它,您的统计过程会尝试执行此操作。这可能是失败的,并且异常被您的自定义错误处理程序隐藏。

create table demo (c int);

insert /*+ append */ into demo select 1 from dual;

1 row created.

select count(*) from demo;

ERROR at line 1:
ORA-12838: cannot read/modify an object after modifying it in parallel

正如tbone所提到的,insert /*+ append */仅在批量加载数千万行时才有用。