-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

あなたのコードの問題は、あなたが 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))

お役に立てれば。もしそうなら。この回答を承認済みとしてマークし、賛成票を投じることを忘れないでください。

于 2016-02-12T06:14:17.030 に答える
0

フランキーはコードのエラーが多すぎます。それらすべてを書くことはできません。いくつかの間違い:

  1. 行 4 で宣言する必要はありません。
  2. Begin ステートメントが多すぎます。
  3. While(@@FETCH_STATUS=0) はループの終了には使用されません。EXIT WHEN を使用します。
  4. ループの開始と終了ループを見逃した[Select IntoではなくCursorとしてループを使用していると仮定して]

    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 に答える