Oracle SQL中时区的时间戳
尝试将Oracle SQL中时区的时间戳,oracle,plsql,Oracle,Plsql,尝试将时间戳值转换为作为参数(变量)给定的时区时,我遇到了一个奇怪的错误 以下代码引发ORA-00907异常: ORA-00907:缺少右括号 同时,带字符串文字的SQL(第一行注释)和带变量的PL/SQL(第二行注释)都可以正常工作 SQL中的变量可能有什么问题?为什么ORA-00907?您只需要将v_时区变量括在大括号()内,请参见下面的代码 declare tz timestamp := current_timestamp; v_timezone varchar2(100) :=
时间戳
值转换为作为参数(变量)给定的时区时,我遇到了一个奇怪的错误
以下代码引发ORA-00907异常:
ORA-00907:缺少右括号
同时,带字符串文字的SQL(第一行注释)和带变量的PL/SQL(第二行注释)都可以正常工作
SQL中的变量可能有什么问题?为什么
ORA-00907
?您只需要将v_时区变量括在大括号()内,请参见下面的代码
declare
tz timestamp := current_timestamp;
v_timezone varchar2(100) := '03:00';
tz2 timestamp;
begin
-- select (tz at time zone '03:00') into tz2 from dual;
-- either use it as
-- select tz at time zone (v_timezone)
-- or
-- select (tz at time zone (v_timezone) )
select (tz at time zone (v_timezone) )
into tz2
from dual;
dbms_output.put_line(to_char(tz2,'hh24:mi:ss'));
-- dbms_output.put_line(to_char((tz at time zone v_timezone),'hh24:mi:ss'));
end;
您只需将v_timezone变量括在大括号()内,请参见下面的代码
declare
tz timestamp := current_timestamp;
v_timezone varchar2(100) := '03:00';
tz2 timestamp;
begin
-- select (tz at time zone '03:00') into tz2 from dual;
-- either use it as
-- select tz at time zone (v_timezone)
-- or
-- select (tz at time zone (v_timezone) )
select (tz at time zone (v_timezone) )
into tz2
from dual;
dbms_output.put_line(to_char(tz2,'hh24:mi:ss'));
-- dbms_output.put_line(to_char((tz at time zone v_timezone),'hh24:mi:ss'));
end;
需要文字或表达式:
它不像一个变量。似乎变量被隐式地视为dbms\u输出
调用或任何PL/SQL上下文中的表达式(正如Wernfried指出的,只是tz2:=tz在时区v\u时区
工作),这有点奇怪;但同样的事情在SQL上下文中不会发生
您可以通过将变量括在括号中,强制将其放入表达式中,或调用一个伪函数:
declare
tz timestamp := current_timestamp;
v_timezone varchar2(100) := '03:00';
tz2 timestamp;
begin
-- select (tz at time zone '03:00') into tz2 from dual;
select tz at time zone (v_timezone)
into tz2
from dual;
dbms_output.put_line(to_char(tz2,'hh24:mi:ss'));
-- dbms_output.put_line(to_char((tz at time zone v_timezone),'hh24:mi:ss'));
end;
PL/SQL procedure successfully completed.
17:45:41
从本质上讲,删除现有的多余括号,并在变量周围使用伪括号。您可以改用函数,如上限(v_时区)
,但这不是必需的-只需使用括号即可将其作为表达式进行计算。奇怪,但工作。。。bug 6113282中提到了它,从9i开始,它似乎就是这样工作的。需要一个文本或表达式:
它不像一个变量。似乎变量被隐式地视为dbms\u输出
调用或任何PL/SQL上下文中的表达式(正如Wernfried指出的,只是tz2:=tz在时区v\u时区
工作),这有点奇怪;但同样的事情在SQL上下文中不会发生
您可以通过将变量括在括号中,强制将其放入表达式中,或调用一个伪函数:
declare
tz timestamp := current_timestamp;
v_timezone varchar2(100) := '03:00';
tz2 timestamp;
begin
-- select (tz at time zone '03:00') into tz2 from dual;
select tz at time zone (v_timezone)
into tz2
from dual;
dbms_output.put_line(to_char(tz2,'hh24:mi:ss'));
-- dbms_output.put_line(to_char((tz at time zone v_timezone),'hh24:mi:ss'));
end;
PL/SQL procedure successfully completed.
17:45:41
从本质上讲,删除现有的多余括号,并在变量周围使用伪括号。您可以改用函数,如
上限(v_时区)
,但这不是必需的-只需使用括号即可将其作为表达式进行计算。奇怪,但工作。。。它在bug 6113282中提到过,从9i开始似乎就是这样工作的。更短的tz2:=tz在时区v_时区代码>甚至更短tz2:=tz在时区v_时区代码>