2016-02-08 3 views
-3

я получаю следующее сообщение об ошибке при компиляции этой функции:Oracle ошибка функции компиляции PLS-00103 (Встречающиеся символ "SELECT" ...)

ошибки компиляции для МЕТОДИКА INV.USP_MSC_MODIFICA_ESTADO

Error: PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:(- + case mod new not null <an identifier> 
<a double-quoted delimited-identifier> <a bind variable> 
continue avg count current exists max min prior sql stddev 
sum variance execute forall merge time timestamp interval 
date <a string literal with character set specification> 
<a number> <a single-quoted SQL string> pipe 
<an alternatively-quoted string literal with character set specification> 
<an alternat Line: 14 Text: IF SELECT TRUNC((SYSDATE) -TO_DATE(@FCH_GRABACION, 'DD/MM/YYYY HH24:MI:SS')) From DUAL=1 THEN 
CREATE OR REPLACE PROCEDURE "USP_MSC_MODIFICA_ESTADO" AS 
    BEGIN 
    DECLARE 
     CURSOR reservar IS 
     SELECT 
     id_reserva, 
     fch_grabacion 
     FROM tb_msc_reserva 
     WHERE to_date(to_char(fch_grabacion, 'dd/mm/yyyy')) = to_date(to_char(SYSDATE, 'dd/mm/yyyy')) - 1; 
     id_reserva VARCHAR2(50); 
     fch_grabacion DATE; 
    BEGIN 
     OPEN reservar; 
     FETCH reservar INTO id_reserva, fch_grabacion; 

     IF SELECT TRUNC((SYSDATE) - TO_DATE(@fch_grabacion, 'DD/MM/YYYY HH24:MI:SS')) FROM dual=1 THEN 

     UPDATE inv.tb_msc_reserva t 
     SET t.flg_estado = 'C' 
     WHERE id_reserva = @id_reserva; 
     COMMIT; 
    END if; 
    WHILE (@@fetch_status = 0) 

    CLOSE RESERVAR; 

    END; 
+4

Вау, это просто большой беспорядок. Сожалею. Это не sql-сервер, поэтому вы можете потратить некоторое время на чтение [pl/sql documenation] (https://docs.oracle.com/database/121/LNPLS/toc.htm) – OldProgrammer

+0

Если 'fch_grabacion' является 'date', почему вы делаете' to_char', а затем 'to_date' на нем? Почему вы делаете то же самое в 'sysdate'?Если ваш запрос уже проверяет, что часть дня 'fch_grabacion' на 1 день позже, чем дневная часть' sysdate', почему отдельный оператор 'IF' снова проверяет его? Если вы хотите это сделать, вам не нужно 'select', но само утверждение бессмысленно. Вы не используете '@' для префикса локальных переменных. Вы не хотите использовать имена для локальных переменных, которые конфликтуют с именами столбцов. И вы можете делать все в одном «обновлении» без цикла. –

ответ

0

Franky говорит слишком много ошибок в коде. Не могу написать их все. Немногие ошибки:

  1. Заявить на строке-4 не нужно.
  2. Слишком много сообщений о начале.
  3. Хотя (@@ FETCH_STATUS = 0) не используется для завершения цикла. Используйте EXIT WHEN.
  4. Пропущенный Loop начала & End Loop [Предполагая, что вы используете Loop, как вы Cursor вместо отборных Into]

    CREATE OR REPLACE PROCEDURE "USP_MSC_MODIFICA_ESTADO" 
    AS 
    CURSOR reservar 
    IS 
    SELECT id_reserva, fch_grabacion 
    FROM tb_msc_reserva 
    WHERE TO_DATE (TO_CHAR (fch_grabacion, 'dd/mm/yyyy')) = 
    TO_DATE (TO_CHAR (SYSDATE, 'dd/mm/yyyy')) 
    - 1; 
    
    id_reserva  VARCHAR2 (50); 
    fch_grabacion DATE; 
    BEGIN 
    OPEN reservar; 
    
    FETCH reservar 
    INTO id_reserva, fch_grabacion; 
    
    LOOP 
    IF (SELECT TRUNC ( (SYSDATE) - TO_DATE (@fch_grabacion, 'DD/MM/YYYY HH24:MI:SS')) 
    FROM DUAL) = 1 
    THEN 
    UPDATE inv.tb_msc_reserva t 
    SET t.flg_estado = 'C' 
    WHERE id_reserva = @id_reserva; 
    
    COMMIT; 
    END IF; 
    
    EXIT WHEN (@@fetch_status = 0); 
    END LOOP; 
    
    CLOSE reservar; 
    END; 
    
0

я так жаль, но я очень новый в Oracle. Я изменил код, но я продолжаю получать ту же ошибку.

CREATE OR REPLACE PROCEDURE "USP_MSC_MODIFICA_ESTADO" 
AS 
CURSOR reservar 
IS 
SELECT id_reserva, fch_grabacion 
FROM tb_msc_reserva 
WHERE to_date(FCH_GRABACION,'dd/mm/yyyy') = to_date(SYSDATE,'dd/mm/yyyy')- 1; 

reserva  VARCHAR2 (50); 
fch_grabacion DATE; 
BEGIN 
OPEN reservar; 
FETCH reservar 
INTO reserva, fch_grabacion; 

LOOP 
IF (SELECT TRUNC((SYSDATE) -TO_DATE(fch_grabacion, 'DD/MM/YYYY HH24:MI:SS'))From DUAL=1) 

THEN 
UPDATE inv.tb_msc_reserva t 
SET t.flg_estado = 'C' 
WHERE id_reserva = reserva; 

COMMIT; 
END IF; 

EXIT WHEN reservar%NOTFOUND ; 
END LOOP; 

CLOSE reservar; 
END; 

Что я хочу сделать, это сравнить две даты (дд/мм/гггг чч: мм: сс). (Вчера и сегодня) Если мой реестр более чем за 24 часа, затем ID_ESTADO = 'C'

У меня есть ошибка здесь:

IF (SELECT TRUNC((SYSDATE) -TO_DATE(fch_grabacion, 'DD/MM/YYYY HH24:MI:SS')) From DUAL=1) 

сообщение:

Compilation errors for PROCEDURE INV.USP_MSC_MODIFICA_ESTADO 
Error: PLS-00103: Encountered the symbol "SELECT" when expecting one of the following: 

    (- + case mod new not null <an identifier> 
    <a double-quoted delimited-identifier> <a bind variable> 
    continue avg count current exists max min prior sql stddev 
    sum variance execute forall merge time timestamp interval 
    date <a string literal with character set specification> 
    <a number> <a single-quoted SQL string> pipe 
    <an alternatively-quoted string literal with character set specification> 
    <an alternat 
Line: 18 
Text: IF (SELECT TRUNC((SYSDATE) -TO_DATE(fch_grabacion, 'DD/MM/YYYY HH24:MI:SS')) From DUAL=1) 

Error: PLS-00103: Encountered the symbol "=" when expecting one of the f  oollowing: 

    . , @ ; for <an identifier> 
    <a double-quoted delimited-identifier> group having intersect 
    minus order partition start subpartition union where connect 
    sample 
Line: 18 
Text: IF (SELECT TRUNC((SYSDATE) -TO_DATE(fch_grabacion, 'DD/MM/YYYY  HH24:MI:SS')) From DUAL=1) 

Благодаря

0

Проблема с кодом ура заключается в том, что ur использует сравнение с 1 внутри предложения Select. Ur Код:

IF (SELECT TRUNC((SYSDATE) -TO_DATE(fch_grabacion, 'DD/MM/YYYY HH24:MI:SS'))From DUAL=1) 

Исправленный код:

IF (SELECT TRUNC ( (SYSDATE) - TO_DATE (fch_grabacion, 'DD/MM/YYYY HH24:MI:SS')) FROM DUAL) = 1 

Однако, есть лучшие способы для сравнения разницы 24ч времени [им путать здесь, как и в том и означает 1Day разница или точно 24ч разница]: 1.Если вы хотите сравнить 24hrs:

IF TO_DATE (fch_grabacion, 'DD/MM/YYYY HH24:MI:SS') < (SYSDATE - 1) 

2. Если вы хотите сравнить 1d:

IF TO_DATE (fch_grabacion, 'DD/MM/YYYY') < TRUNC ((SYSDATE - 1)) 

Надеюсь, это поможет. Если это так. Не забывайте отмечать, что этот ответ принят и поднят. [Я могу сделать с некоторыми дополнительными rep: p]