Oracle函数编译错误PLS-00103(遇到符号“SELECT”…)

Oracle函数编译错误PLS-00103(遇到符号“SELECT”…),oracle,syntax,plsql,compiler-errors,pls-00103,Oracle,Syntax,Plsql,Compiler Errors,Pls 00103,编译此函数时,我收到以下错误: INV.USP\u MSC\u MODIFICA\u 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 v

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

INV.USP\u MSC\u MODIFICA\u 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

弗兰基说代码中有太多错误。我不能全部写。 几处错误:

在第4行声明不需要。 太多的Begin语句。 而@FETCH\u STATUS=0不用于循环终止。在需要时使用EXIT。 错过循环开始和结束循环[假设您使用的是循环,而不是选择进入]

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;

很抱歉,我对甲骨文还是个新手。我已经更改了代码,但我一直收到相同的错误

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)

谢谢

ur代码的问题是在Select子句中使用了与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)
二,。如果要比较1d:

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

希望这有帮助。如果有。别忘了把这个答案标记为接受并投票。[我需要一些额外的代表:p]

哇,这真是一团糟。很抱歉这不是sql server,因此您可能需要花费一些时间来阅读fch_grabacion,如果fch_grabacion是一个日期,那么为什么要在它上执行to_字符,然后执行to_日期?你为什么在sysdate上做同样的事情?如果您的查询已经检查fch_grabacion的day部分比sysdate的day部分晚1天,为什么要使用单独的If语句再次检查它?如果您想这样做,您不需要select,但语句本身是毫无意义的。不能使用@作为局部变量的前缀。您不希望对与列名冲突的局部变量使用名称。您可以在一次更新中完成所有操作,而无需循环。
IF TO_DATE (fch_grabacion, 'DD/MM/YYYY HH24:MI:SS') < (SYSDATE - 1)
IF TO_DATE (fch_grabacion, 'DD/MM/YYYY') < TRUNC ((SYSDATE - 1))