上下文: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中的新日期
答案 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 */
仅在批量加载数千万行时才有用。