Oracle 10g простая ошибка запроса - PullRequest
0 голосов
/ 06 июня 2011

Oracle SQL Developer жалуется на следующий SQL, хотя я не могу найти причину:

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

Ответы [ 2 ]

3 голосов
/ 06 июня 2011

Есть несколько проблем с вашим кодом (это PL / SQL, а не только SQL):

1) Вы пропускаете begin и end вокруг блока.

2) Ваши select s нуждаются в into предложении

try:

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;
2 голосов
/ 06 июня 2011

Поскольку это блок PL / SQL, ваши операторы SELECT должны будут выбирать данные в какую-то локальную переменную, или они должны использоваться в курсоре.Какой подход вам нужен, зависит от того, сколько строк в T_JOB потенциально может соответствовать указанным вами критериям.Предполагая, что все три оператора будут возвращать ровно одну строку, вы можете сделать что-то вроде этого (код упрощен, чтобы избежать повторения одного и того же запроса дважды)

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, как я сделал здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...