我有一个执行sql语句的程序。在一个事务中,我想使用相同的 sysdate更新几个表。 例如。 (在事务中运行以下3个语句)
update table1 set some_col = 'updated' where some_other_col < sysdate;
delete from table2 where some_col < sysdate;
insert into table3 (col1, col2) select c1, c2 from table4 where some_col < sysdate;
如果这三个语句在一个事务中执行,那么每个语句都使用的“sysdate”将是我们当前正在运行的时间戳,而不是在事务开始时。
我可以创建一个存储过程并最初使用PL / SQL将sysdate选择为变量,但我更喜欢从外部程序运行sql语句。
答案 0 :(得分:5)
我可以创建一个存储过程 最初选择sysdate为a 变量,使用PL / SQL,但我更喜欢 从一个运行sql语句 外部计划
使用匿名块而不是存储过程,如(未经测试):
declare
v_sysdate date := sysdate;
begin
update table1 set some_col = 'updated' where some_other_col < v_sysdate;
delete from table2 where some_col < v_sysdate;
insert into table3 (col1, col2) select c1, c2 from table4 where some_col < v_sysdate;
commit;
exception
when others then
rollback;
raise;
end;
答案 1 :(得分:0)
我担心它的工作正常,每次查询都会重新计算时间。只需将时间戳存储在程序中的变量中,并在查询中使用该变量。
答案 2 :(得分:0)
哪个外部计划?如果您使用的是SQL * Plus,则可以使用:
var d char(50)
begin select sysdate into :d from dual; end;
/
update table1 set some_col = 'updated' where some_other_col < :d;
delete from table2 where some_col < :d;
insert into table3 (col1, col2) select c1, c2 from table4 where some_col < :d;
您可能需要调整会话的NLS_DATE_FORMAT设置...