返回 PLS-00103 的过程:预期时遇到符号“EOF”

Posted

技术标签:

【中文标题】返回 PLS-00103 的过程:预期时遇到符号“EOF”【英文标题】:Procedure returning PLS-00103: Encountered the symbol "EOF" when expecting 【发布时间】:2015-11-27 04:52:00 【问题描述】:

我是 PL/SQL 的新手,正在做一个家庭作业问题,我需要编写一个基于星期几/时间返回错误消息的过程,但在我到达那一点之前我被困在一个基本的事情上:

我写了以下内容:

CREATE OR REPLACE PROCEDURE
SECURE_IT
(p_weekday NUMBER,
 p_currtime TIME)
IS
BEGIN
select to_char(current_timestamp,'D')
  , to_char(current_timestamp,'HH24:MI') 
into p_weekday, p_currtime 
from dual;
DBMS_OUTPUT.PUT_LINE(p_weekday,p_currtime);
END;   

我认为我所有的 ; 都已到位,看不出这之间有什么区别,书中的代码和我在网上找到的代码,但它仍然返回此错误:

PLS-00103: Encountered the symbol "end-of-file" when expecting one of the 
following: ; <an identifier> <a double-quoted delimited-identifier> 
current delete exists prior <a single-quoted SQL string> The symbol ";" 
was substituted for "end-of-file" to continue.

我尝试改变 END; END SECURE_IT;希望它能解决一些问题(我能想到的),但看不出有什么问题。有人可以帮我解决这个问题吗?

提前谢谢你:-)

【问题讨论】:

不幸的是,这种情况下的错误消息对您没有帮助。有两个问题:(1)TIME不是一个有效的数据类型,除非你自己定义了它; (2)DBMS_OUTPUT.put_line只接受一个参数。 另一个问题是您的参数使用默认的IN 模式,但您的程序正在尝试为它们分配新值 - 这是不允许的。 【参考方案1】:

您的程序中有几个错误

    TIME 数据类型(在 PL/SQL 中没有这样的数据类型,请参阅 Documentation,或者,您可以传递日期时间数据类型:DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE 和 TIMESTAMP WITH LOCAL TIME ZONE) 您可以使用许多选项提取时间部分。例如:

    SELECT TO_CHAR(p_currDateTime, 'HH24:MI:SS') into p_currtime FROM DUAL;
    

    您正在尝试更新 p_weekdayp_currtime,它们是 IN 参数。这些参数用于向过程传递值,而不是返回值。

    DBMS_OUTPUT.PUT_LINE 只接受一个参数,因此您可以像这样连接两个值而不是 ,DBMS_OUTPUT.PUT_LINE(p_weekday||'-'||p_currtime);

如果不清楚你想通过这个过程实现什么,这将有很大帮助

【讨论】:

【参考方案2】:

基本上我可以在这里看到的是,作为作业的一部分,您需要打印一些有价值的程序。但是使用 dbms_output 不会有任何好处。您需要将这些设置为 OUT 参数才能在任何地方使用这些值。

    CREATE OR REPLACE PROCEDURE SECURE_IT(
        p_weekday OUT VARCHAR2,
        p_currtime OUT VARCHAR2)
    IS
    BEGIN
      p_weekday := TO_CHAR(CURRENT_TIMESTAMP,'D');
      p_currtime:= TO_CHAR(CURRENT_TIMESTAMP,'HH24:MI');
      DBMS_OUTPUT.PUT_LINE(p_weekday||' '||p_currtime);
    END;

-----------------------------EXECUTE--------------------------------------------

var week VARChaR2(100);
var curtime VARChaR2(100);

EXEC SECURE_IT(:week,:curtime);

print week;
print curtime;

-------------------------------OUTPUT--------------------------------------------

WEEK
-
6

CURTIME
-----
06:12

-------------------------------OUTPUT----------------------------------------------

【讨论】:

以上是关于返回 PLS-00103 的过程:预期时遇到符号“EOF”的主要内容,如果未能解决你的问题,请参考以下文章

错误:PLS-00103:在预期以下情况之一时遇到符号“AS”:返回

错误:PLS-00103:在预期以下情况之一时遇到符号“)”

错误:00103 用于 plsql 过程

PLS-00103:在预期以下情况之一时遇到符号“TEST_PKG”:;

PLS00103:在预期以下情况之一时遇到符号“I”

PLS-00103:在预期以下情况之一时遇到符号“ON”