2011-06-06 75 views
0

的Oracle SQL Developer抱怨下一个SQL但我似乎无法找到原因:Oracle 10g中简单的查询错误

IF to_number(to_char(sysdate, 'HH24')) > 6 THEN 
    IF to_number(to_char(sysdate, 'HH24')) < 9 THEN 
    SELECT 1 FROM dual; 
    ELSE 
    SELECT (CASE WHEN result = 'SUCCESS' THEN 1 ELSE 0 END) FROM t_job WHERE to_char(start_time, 'yyyy/mm/dd') = to_char(sysdate, 'yyyy/mm/dd'); 
    END IF; 
ELSE 
    SELECT (CASE WHEN result = 'SUCCESS' THEN 1 ELSE 0 END) FROM t_job WHERE to_char(start_time, 'yyyy/mm/dd') = to_char(sysdate, 'yyyy/mm/dd'); 
END IF; 

什么是在提供的查询错误了吗?

错误报告:

Error starting at line 7 in command: 
ELSE 
Error report: 
Unknown Command 
(CASEWHENRESULT='SUCCESS'THEN1ELSE0END) 
--------------------------------------- 
1          


Error starting at line 9 in command: 
END IF 
Error report: 
Unknown Command 
+0

它究竟如何抱怨? ) – 2011-06-06 15:11:59

+0

@be现在在这里,已经添加,只是意识到它的缺失:) – 2011-06-06 15:12:27

回答

3

有几个问题与您的代码(这是PL/SQL,而不仅仅是SQL):

1)你缺少周围的beginend块。

2)你select的需要一个into条款

尝试:

DECLARE 
    l_result number; 
BEGIN 
    IF to_number(to_char(sysdate, 'HH24')) > 6 THEN 
    IF to_number(to_char(sysdate, 'HH24')) < 9 THEN 
     SELECT 1 INTO l_result FROM dual; 
    ELSE 
     SELECT (CASE WHEN result = 'SUCCESS' THEN 1 ELSE 0 END) 
     INTO l_result 
     FROM t_job WHERE to_char(start_time, 'yyyy/mm/dd') = to_char(sysdate, 'yyyy/mm/dd'); 
    END IF; 
    ELSE 
     SELECT (CASE WHEN result = 'SUCCESS' THEN 1 ELSE 0 END) 
     INTO l_result 
     FROM t_job WHERE to_char(start_time, 'yyyy/mm/dd') = to_char(sysdate, 'yyyy/mm/dd'); 
    END IF; 
    dbms_output.put_line('result is '||l_result); 
END; 
+0

'to_char(start_time,'yyyy/mm/dd')= to_char(sysdate,'yyyy/mm/dd')'听起来像一个坏习惯我也是 – 2011-06-06 15:17:53

+0

而不是'to_char(start_time,'yyyy/mm/dd')= to_char(sysdate,'yyyy/mm/dd')''我会为'trunc(start_time)= trunc(sysdate) – 2011-06-06 15:18:58

+0

@Tonu安德鲁斯,这是原始变种,但它是如何影响性能? – 2011-06-06 15:20:46

2

因为这是一个PL/SQL块,你的SELECT语句需要选择数据到一些局部变量或他们将需要在游标中使用。您想要的方法取决于T_JOB中有多少行可能与您指定的条件匹配。假设所有三个语句将只返回1行中,你可以做这样的事情(简化,以避免重复相同的查询两次代码)

DECLARE 
    l_some_local_variable PLS_INTEGER; 
BEGIN 
    IF(to_number(to_char(sysdate, 'HH24')) > 6 and 
     to_number(to_char(sysdate, 'HH24')) < 9) 
    THEN 
    SELECT 1 
     INTO l_some_local_variable 
     FROM dual; 
    ELSE 
    SELECT (CASE WHEN result = 'SUCCESS' 
       THEN 1 
       ELSE 0 
      END) 
     INTO l_some_local_variable 
     FROM t_job 
    WHERE trunc(start_time) = trunc(sysdate); 
    END IF; 
END; 

当然,一旦你在你的局部变量填充数据,您需要实际上做了一些有价值的事情。可能,您可能想要创建一个返回局部变量的函数,而不是像我这里所做的那样使用匿名PL/SQL块。

+0

你的答案很好,但托尼安德鲁斯是第一个。不过,非常感谢。 :) – 2011-06-06 15:38:25