2011-04-19 109 views
1

我必须将SQL中使用的某些查询转换为Oracle代码。我有很多麻烦。有没有人知道任何查询变换器类似的东西?有人可以为我翻译这段代码的一部分吗?将sql查询转换为oracle

这是代码:

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' 

非常感谢您的帮助,i'll继续寻找。

+0

FYI甲骨文** **是的SQL''的实现。你的意思是微软'SQL Server'? – JNK 2011-04-19 19:23:34

+0

提供现有的输出将有助于比解码SQL Server Counter部分所做的更快地到达查询。 – Chandu 2011-04-19 19:28:02

+0

是的,我正在使用SQL Server ...输出是一个像这样的字符串的单个列: – NicoRiff 2011-04-19 19:31:55

回答

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') 
+0

此查询似乎是我需要但我现在得到此错误:ORA-01489:结果字符串连接太长。我会继续寻找。非常感谢您 – NicoRiff 2011-04-19 20:50:27

+0

为什么LPAD的第二个参数是ssno的查询?不会将ssno转换为数字,然后将多个'0'附加到该字符串,从而导致ORA-01489? – 2011-04-20 02:56:00

+0

@杰弗里:很好。修复了查询。在查询转换过程中可能是一个错误。 – Chandu 2011-04-20 03:02:25

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(如像您查询一个标量结果)的科尔的一个参数ECT类型,如:

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)右(或LEFT)是plSQL中的SUBSTR函数

对于plSQL的清晰说明,我发现很多这种链接的用途http://www.techonthenet.com/oracle/index.php