-3

编译此函数时收到以下错误:

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: 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

3 回答 3

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;

我想做的是比较两个日期(dd/mm/yyyy HH:mm:ss)。(昨天和今天)如果我的注册表超过 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)

谢谢

于 2016-02-09T21:25:34.330 回答
0

Franky 在代码中讲了太多错误。写不完。几个错误:

  1. 不需要在第 4 行声明。
  2. 太多的 Begin 语句。
  3. While(@@FETCH_STATUS=0) 不用于循环终止。使用退出时间。
  4. 错过了循环开始和结束循环[假设您使用的是循环,因为您是光标而不是选择进入]

    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;
    
于 2016-02-09T07:20:36.820 回答
0

您的代码的问题是您在 Select 子句中使用与 1 进行比较。你的代码:

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 小时时差[我在这里感到困惑,因为你是指 1 天时差还是 24 小时时差]: 1.如果你想比较 24 小时:

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))

希望这可以帮助。如果是这样。不要忘记将此答案标记为已接受并投票。[我可以做一些额外的代表:p]

于 2016-02-12T06:14:17.030 回答