【发布时间】:2016-02-08 22:06:25
【问题描述】:
我在编译这个函数时收到以下错误:
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;
【问题讨论】:
-
哇,这简直是一团糟。对不起。这不是 sql-server,因此您可能需要花一些时间阅读pl/sql documenation
-
如果
fch_grabacion是date,你为什么要先写to_char,然后再写to_date?为什么你在sysdate上做同样的事情?如果您的查询已经检查fch_grabacion的日期部分比sysdate的日期部分晚 1 天,为什么要单独使用IF语句再次检查它?如果您想这样做,则不需要select,但该声明本身毫无意义。您不要使用@为局部变量添加前缀。您不想为与列名冲突的局部变量使用名称。您可以在一个update中完成所有操作而无需循环。
标签: oracle syntax plsql compiler-errors pls-00103