我必须将我在SQL中使用的一些查询转换为Oracle代码。我在这方面遇到了很多麻烦。有谁知道任何查询转换器o这样的东西?有人可以为我翻译这部分代码吗?。
这是代码:
SELECT PRUEBA = CASE (SELECT TIMEATT FROM READER WHERE PANELID = DEVID AND READERID =
MACHINE) WHEN '1' THEN 'P10' ELSE 'P20' END
+ '0001'
+ CAST(YEAR(EVENT_TIME_UTC)AS VARCHAR)
+ Right('0' + Convert(VarChar(2), Month(EVENT_TIME_UTC)), 2)
+ Right('0' + Convert(VarChar(2), DAY(EVENT_TIME_UTC)), 2)
+ Right('0' + Convert(VarChar(2), DATEPART(HOUR,EVENT_TIME_UTC)), 2)
+ Right('0' + Convert(VarChar(2), DATEPART(MINUTE,EVENT_TIME_UTC)), 2)
+ Right('0' + Convert(VarChar(2), DATEPART(SECOND,EVENT_TIME_UTC)), 2)
+ CAST(YEAR(EVENT_TIME_UTC)AS VARCHAR)
+ Right('0' + Convert(VarChar(2), Month(EVENT_TIME_UTC)), 2)
+ Right('0' + Convert(VarChar(2), DAY(EVENT_TIME_UTC)), 2)
+ Right('0' + Convert(VarChar(2), DATEPART(HOUR,EVENT_TIME_UTC)), 2)
+ Right('0' + Convert(VarChar(2), DATEPART(MINUTE,EVENT_TIME_UTC)), 2)
+ Right('0' + Convert(VarChar(2), DATEPART(SECOND,EVENT_TIME_UTC)), 2)
+ Right('00000000' + Convert(VarChar(8), CARDNUM), 8)
+ Right('00000000' + Convert(VarChar(8), (SELECT SSNO FROM EMP WHERE ID = EMPID)), 8),
FROM events
WHERE eventid = 0 AND eventid = 0
and machine in (11) AND DEVID IN (1,2)
and CARDNUM <> 0 AND EMPID <> 0
and EVENT_TIME_UTC between '2006-02-16' AND '2007-02-09'
非常感谢你的帮助,我会继续寻找。
答案 0 :(得分:2)
我最近不得不进行从tSQL生活到plSQL(oracle)的相同转换。您发布的代码中有几个“陷阱”:
1)在tSQL中,加号(用于连接)+
在plSQL中替换为双管||
2)大多数时候你需要一个“参考光标”(REF CURSOR)声明你的结果就像
PROCEDURE DEMO_SELECT_4_SO( //other parameters followed by// P_RESULT OUT REF CURSOR) IS BEGIN OPEN P_RESULT FOR SELECT //fields/// FROM a_table WHERE //you want..//
OR (与查询一样的标量结果)正确类型的单个参数,如:
PROCEDURE DEMO_SELECT_4_SO( //other parameters followed by// P_RESULT OUT varchar2(60)) IS BEGIN SELECT //concatenated fields/// INTO P_RESULT FROM a_table WHERE //you want..//
注意在plSQL中选择将所选值分配给目标参数,并且不像在tSQL中那样创建表
3)RIGHT(或LEFT)是plSQL中的SUBSTR函数
我已经从这个链接http://www.techonthenet.com/oracle/index.php找到了很多实用工具来清楚解释plSQL。
答案 1 :(得分:2)
试试这个:
SELECT CASE (SELECT timeatt FROM reader WHERE panelid = devid AND readerid =
machine)
WHEN '1' THEN 'P10'
ELSE 'P20'
END
|| '0001'
|| To_char(event_time_utc, 'RRRRMMDDHH24MISS')
|| To_char(event_time_utc, 'RRRRMMDDHH24MISS')
|| Lpad(cardnum, 8, '0')
|| Lpad((SELECT ssno
FROM emp
WHERE id = empid), 8, '0') AS prueba
FROM events
WHERE eventid = 0
AND eventid = 0
AND machine IN ( 11 )
AND devid IN ( 1, 2 )
AND cardnum <> 0
AND empid <> 0
AND event_time_utc BETWEEN TO_DATE('2006-02-16', 'RRRR-MM-DD') AND TO_DATE('2007-02-09', 'RRRR-MM-DD')