是否有方法使用**相同**系统日期执行多个sql语句?

是否有方法使用**相同**系统日期执行多个sql语句?,sql,oracle,Sql,Oracle,我有一个执行sql语句的程序。在一个事务中,我想使用相同的系统日期更新几个表。 例如(在事务中运行以下3条语句) updatetable 1设置一些列='updated',其中一些列

我有一个执行sql语句的程序。在一个事务中,我想使用相同的系统日期更新几个表。 例如(在事务中运行以下3条语句)

updatetable 1设置一些列='updated',其中一些列
如果在一个事务中执行这3条语句,则每个语句使用的“sysdate”将是当前运行该语句时的时间戳,而不是在事务开始时

我可以使用PL/SQL创建一个存储过程,并在开始时将sysdate选择为一个变量,但我更喜欢从外部程序运行SQL语句

我可以创建一个存储过程并 首先将sysdate选择到 变量,使用PL/SQL,但我更喜欢 仅从数据库运行sql语句 外部程序

使用匿名块而不是存储过程,例如(未测试):

声明
v_sysdate:=sysdate;
开始
更新表1设置一些列=“更新”,其中一些列
我可以创建一个存储过程并 首先将sysdate选择到 变量,使用PL/SQL,但我更喜欢 仅从数据库运行sql语句 外部程序

使用匿名块而不是存储过程,例如(未测试):

声明
v_sysdate:=sysdate;
开始
更新表1设置一些列=“更新”,其中一些列
恐怕它正在按预期工作,每次查询都会重新计算时间。只需将时间戳存储在程序中的一个变量中,并在查询中使用该变量。

恐怕它正在按预期工作,每次查询都会重新计算时间。只需将时间戳存储在程序中的变量中,并在查询中使用该变量。

哪个外部程序?如果您使用的是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;
var d char(50)
开始从dual中选择sysdate到:d;结束;
/
更新表1设置一些列=“更新”,其中一些列<:d;
从表2中删除某些列<:d;
插入表3(col1,col2)中,从表4中选择c1,c2,其中一些列<:d;

您可能需要调整会话的NLS\u日期\u格式设置…

哪个外部程序?如果您使用的是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;
var d char(50)
开始从dual中选择sysdate到:d;结束;
/
更新表1设置一些列=“更新”,其中一些列<:d;
从表2中删除某些列<:d;
插入表3(col1,col2)中,从表4中选择c1,c2,其中一些列<:d;

您可能需要调整会话的NLS\u日期\u格式设置…

我想您已经回答了自己的问题。每个查询都会有一个稍微不同的datetime,用于上面执行的wa的sysdate。我认为您需要进行存储过程。我认为您回答了自己的问题。每个查询都会有一个稍微不同的datetime,用于上面执行的wa的sysdate。我认为您需要创建存储过程。您可以像普通sql一样运行/执行它(即从外部程序)?…我不相信这与存储过程之间有任何区别-除了它没有存储之外…它仍然是PL/sql,而不是sql,并且不能(直接)运行通过外部程序,存储过程和匿名块之间有很多区别。什么“外部程序”不能直接运行它(但可以运行单个DML语句)?哇!令我大吃一惊的是,这居然奏效了!我从未意识到您可以这样执行PL/SQL!这打开了一个全新的世界!谢谢大家!您可以像运行/执行常规sql一样运行/执行它(即从外部程序)?…我不相信这与存储过程之间有任何区别-除了它没有存储之外…它仍然是PL/sql,而不是sql,并且不能由外部程序(直接)运行存储过程和匿名块之间有很多区别。什么“外部程序”不能直接运行它(但可以运行单个DML语句)?哇!令我大吃一惊的是,这居然奏效了!我从未意识到您可以这样执行PL/SQL!这打开了一个全新的世界!谢谢大家!
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;