假设我有一个过程,它试图根据条件评估将记录一个接一个地插入到单独的表中,并使用sys_refcursor试图取出插入数据的表。
在过程中,我们有DML和DDL命令,如truncate,insert,select,create cursor。
假设多个用户尝试使用相同的参数调用该过程。
问题是,当多个用户试图运行我们正在截断同一个表的过程时,我们最终插入并从中选择,输出数据中可能会出现数据丢失或数据模糊。
想知道过程是否对过程体中提到的表加锁。
现在,为了输出过程的结果集,我将行插入到该表名中,并使用sys_refcursor,我使用下面的代码返回它的内容:
open prc for select * from tablename;
假设我不想将行插入到任何表中。我需要直接将结果集从select语句输出到输出变量。我们如何才能做到这一点?
执行过程调用,对过程体中提到的表加锁,以便其他用户无法访问和修改这些表。
伪代码:
create or replace PROCEDURE PROCEDURE_NAME(var1 in VARCHAR2, var2 in NUMBER, prc out SYS_REFCURSOR)
IS
cursor c1 IS
select v3 from TABLE_NAME1 where v1 = var1 and v2 = var2;
begin
EXECUTE immediate 'TRUNCATE TABLE AUDIT_TABLE';
if (var2 = 2)
then
for var3 in c1
loop
insert into AUDIT_TABLE select col1,col2,col3,col4
from
(select ROW_NUMBER() OVER(order by row_id) AS num_row, col1, v2, col2, col3, col4
from TABLE_NAME1
where col3 = var3.v3 and v1 = var1 and v2 = var2) a
inner join
(select ROW_NUMBER() OVER(order by row_id) AS num_row, col1, v2, col2, col3, col4
from TABLE_NAME1
where col3 = var3.v3 and v1 = var1 and v2 = var2) b on
(b.num_row = a.num_row + 1)
inner join TABLE_NAME2 c on (a.v2 = c.v2);
end loop;
end if;
open prc for select * from AUDIT_TABLE;
end;
1条答案
按热度按时间ebdffaop1#
我不明白你的程序的目的是什么,也许有更好的解决方案。但是...