Oracle11g “错误”;在“预期”处未找到from关键字;在执行存储过程时,oracle
我有以下存储过程,我得到一个错误“从关键字未找到预期的地方”。select查询中的参数p_usr_tz用法是否存在任何问题 我已将p_usr_tz设置为“欧洲/伦敦”,p_wi_id设置为48127808Oracle11g “错误”;在“预期”处未找到from关键字;在执行存储过程时,oracle,oracle11g,toad,Oracle11g,Toad,我有以下存储过程,我得到一个错误“从关键字未找到预期的地方”。select查询中的参数p_usr_tz用法是否存在任何问题 我已将p_usr_tz设置为“欧洲/伦敦”,p_wi_id设置为48127808 PROCEDURE getworkitembyid (p_wi_id IN NUMBER,p_usr_tz IN VARCHAR2 , workitem OUT prvdr_rec ) AS BEGIN OPEN workitem FOR S
PROCEDURE getworkitembyid (p_wi_id IN NUMBER,p_usr_tz IN VARCHAR2
, workitem OUT prvdr_rec )
AS
BEGIN
OPEN workitem FOR
SELECT wi.id wi_id
, wi.type_name
, wi.status
, wi.priority
, wi.crt_usr_id
, crt_usr.name crt_name
, crt_usr.pass crt_pass
, crt_usr.first_name crt_first_name
, crt_usr.last_name crt_last_name
, crt_usr.email crt_email
, from_tz (cast ( (wi.crt_tm) as timestamp), 'America/New_York') at time zone p_usr_tz crt_tm
, wi.updt_usr_id
, updt_usr.name updt_name
, updt_usr.pass updt_pass
, updt_usr.first_name updt_first_name
, updt_usr.last_name updt_last_name
, updt_usr.email updt_email
, from_tz (cast ( (wi.updt_tm) as timestamp), 'America/New_York') at time zone p_usr_tz updt_tm
, wi.lock_usr_id
, lock_usr.name lock_name
, lock_usr.pass lock_pass
, lock_usr.first_name lock_first_name
, lock_usr.last_name lock_last_name
, lock_usr.email lock_email
, wi.lock_tm
, queue.id queue_id
, queue.name
, queue.TYPE
, queue_wi.state
, queue_wi.queue_entry_tm
FROM wi
INNER JOIN sec_usr crt_usr
ON wi.crt_usr_id = crt_usr.id
INNER JOIN sec_usr updt_usr
ON wi.updt_usr_id = updt_usr.id
LEFT OUTER JOIN sec_usr lock_usr
ON wi.lock_usr_id = lock_usr.id
LEFT OUTER JOIN queue_wi
ON wi.id = queue_wi.wi_id
LEFT OUTER JOIN queue
ON queue_wi.queue_id = queue.id
WHERE wi.id = p_wi_id;
END getworkitembyid;
尽管Oracle文档不太清楚,AT TIME ZONE
子句中的时区似乎不能是绑定变量;它必须是文字或表达式
不过,一个可能的解决方案(不是很好的解决方案)是使用本机动态SQL,并在选择中将p_USR_TZ
变量值“硬编码”,即
SQL>
SQL> CREATE OR REPLACE
2 PROCEDURE example_procedure
3 ( p_some_date_value IN DATE
4 , p_usr_tz IN VARCHAR2
5 , workitem OUT SYS_REFCURSOR )
6 AS
7 BEGIN
8 OPEN workitem FOR q'{
9 SELECT :p_some_date_value AS original_date_value
10 , from_tz (cast ( (:p_some_date_value) as timestamp), 'America/New_York') at time zone '}'||p_usr_tz||q'{' AS timezone_changed_date_value
11 FROM dual
12 }' USING
13 IN p_some_date_value,
14 IN p_some_date_value
15 ;
16 END example_procedure;
17 /
Procedure created.
SQL>
SQL> VAR example_cursor REFCURSOR;
SQL>
SQL> EXEC example_procedure(sysdate, 'Europe/London', :example_cursor);
PL/SQL procedure successfully completed.
SQL>
SQL> COL original_date_value FORMAT A30
SQL> COL timezone_changed_date_value FORMAT A45
SQL>
SQL> PRINT :example_cursor;
ORIGINAL_DATE_VALUE TIMEZONE_CHANGED_DATE_VALUE
------------------------------ ---------------------------------------------
04.06.14 04.06.14 17:32:07,000000 EUROPE/LONDON
谢谢你的回复,但不幸的是它没有工作,它说时区没有找到,而且我也不明白为什么在时区声明中有大括号和字符q大括号和q就是因为这个:你说的“它没有工作”是什么意思?对我来说效果很好,请参阅更新的答案。可能是在toad中,我猜它不起作用,尽管我有一个解决方案,但我将参数p_usr_tz括在大括号中,它起了作用,谢谢您回信。请将您的解决方案发布在此处。我不明白你所说的“用大括号括起参数p_usr_tz”是什么意思。