当前位置: 首页 > 知识库问答 >
问题:

PL/SQL:遇到符号“END”

毕宏盛
2023-03-14

尽管我仔细检查了代码,但还是出现了以下错误。我不知道我错过了什么。

行/列错误

31/1 PLS-00103:在期望以下之一时遇到符号“END”:

代码:

CREATE OR REPLACE PROCEDURE sp_ssjm_newworkorder
(   workorderno IN NUMBER,
company     IN CHAR,
attention   IN CHAR,
datedue     IN DATE,
loggedby    IN CHAR
)

AS  id     NUMBER;
today         DATE:=SYSDATE;
BEGIN
SELECT  client_id   --grab client_id
INTO id 
FROM    ssjm_client
WHERE ssjm_client.name=company;

IF id IS NULL THEN  --check if client exists by checking if client_id is there
    dbms_output.put_line('Please create client first');
    GOTO the_end;
ELSE
    INSERT INTO ssjm_workorder      VALUES(workorderno,workorderno,company,loggedby,attention,'Received',today,datedue,id);
END IF;

EXCEPTION
    WHEN OTHERS THEN
    raise_application_error(-20999,'An error occured in' ||
        SQLCODE || '-ERROR-' || SQLERRM);

<<the_end>>

END sp_ssjm_newworkorder;

共有1个答案

柴文林
2023-03-14

代码中有几个地方需要注意:

  1. 出现该错误的原因是因为label

为此,您的代码应如下所示:

IF id IS NULL THEN  --check if client exists by checking if client_id is there
    dbms_output.put_line('Please create client first');
    GOTO the_end;
ELSE
    INSERT INTO ssjm_workorder
 VALUES(workorderno,workorderno,company,loggedby
       ,attention,'Received',today,datedue,id);
END IF;

<<the_end>>
NULL;

EXCEPTION
    WHEN OTHERS THEN
    raise_application_error(-20999,'An error occured in' ||
        SQLCODE || '-ERROR-' || SQLERRM);
END sp_ssjm_newworkorder;

尽可能避免无条件分支。使用“转到”操作符是非常非常不好的做法。它破坏了可读性,这样的代码很难调试。这将使您和所有在您之后查看该代码的人感到头痛。此外,如果查询

SELECT  client_id   --grab client_id
INTO id 
FROM    ssjm_client
WHERE ssjm_client.name=company;

不返回行,异常NO_DATA_FOUND将立即引发并且代码的执行停止。因此IF id IS NULL那么条件将永远不会被评估。您可以通过删除该条件并在代码的EXCEPTION部分添加NO_DATA_FOUND异常处理程序来重写代码。当然,正如@Rob van Wijk在评论中正确指出的那样

但代码可以进一步清理。今天可以删除变量,其他变量也可以删除。正如现在一样,它只是将错误转换为更长的错误消息,没有更多的细节,而且最重要的是:它掩盖了真正错误发生的行号。

今天不需要变量,SYSDATE可以直接在插入语句的值子句中使用,也可以在删除其他变量时使用。

CREATE OR REPLACE PROCEDURE sp_ssjm_newworkorder
(
workorderno IN NUMBER,
company     IN CHAR,
attention   IN CHAR,
datedue     IN DATE,
loggedby    IN CHAR
)
AS  
  id     NUMBER;
BEGIN
  SELECT client_id   --grab client_id
    INTO id
    FROM ssjm_client
   WHERE ssjm_client.name=company;

    INSERT INTO ssjm_workorder      
      VALUES(workorderno,workorderno,company,loggedby
            ,attention,'Received',SYSDATE,datedue,id);

EXCEPTION
    when NO_DATA_FOUND
    then dbms_output.put_line('Please create client first');
END sp_ssjm_newworkorder;

 类似资料:
  • 行/COL错误 19/12 PLS-00103:当期望下列之一时遇到符号“=”:。(*@%&=-+at in是mod余数而不是rem,那么<指数(**)><>或!=或~=>=<=<>和或类似于2类似于4类似于多集成员子多集之间的 20/2 PLS-00103:当需要下列操作之一时遇到符号“end”:begin函数pragma过程子类型类型当前游标删除存在之前

  • 主要内容:声明字符串变量,PL/SQL字符串函数和运算符PL/SQL中的字符串实际上是一个具有可选大小规格的字符序列。字符可以是数字,字母,空白,特殊字符或全部的组合。 PL/SQL提供三种字符串 - 固定长度字符串 - 在这样的字符串中,程序员在声明字符串时指定长度。该字符串的右边填充规定的长度。 可变长度字符串 - 在这样的字符串中,指定字符串的最大长度达,并且不会填充。 字符大对象(CLOB) - 这些可变长度字符串最多可达。 PL/SQL字符串

  • 主要内容:算术运算符,关系运算符,比较运算符,逻辑运算符,PL/SQL运算符优先级在本章中,我们将学习在中如何使用运算符。 运算符是一个符号,它告诉编译器执行指定的数学或逻辑操作。语言中有丰富的内置运算符,提供有以下类型的运算符 - 算术运算符 关系运算符 比较运算符 逻辑运算符 字符串运算符 在这里,我们将逐个地来了解算术,关系,比较和逻辑运算符。字符串运算符将在后面的章节(PL/SQL字符串)中学习。 算术运算符 下表显示了PL/SQL支持的所有算术运算符。假设变量的值为,

  • 我们的PL/SQL数据库有三个数字变量,分别表示确切的日期、月份和年份。 我想在Java中将这些值读入一个字符串来显示,但是rs.getString(“[Number_字段]”)会显示一个“Invalid Column Name”异常,而rs.getInt(“[Number_字段]”)会执行相同的操作(见下面的代码段)。而且,因为单词“number”被用来描述编码历史上创建的每一个字符串转换,所以

  • 主要内容:包规范,包体,使用包元素在本章中,我们将讨论PL/SQL中的包。 包是模式对象,将逻辑上相关的PL/SQL类型,变量和子程序分组。 一个包将有两个强制性的部分 - 包规范/格式 包体或定义 包规范 规范是包的接口。它只是声明可以从包外部引用的类型,变量,常量,异常,游标和子程序。 换句话说,它包含有关包的内容的所有信息,但不包括子程序的代码。 所有放置在规范中的对象被称为公共对象。任何不在包规范中但在包体中编码的子程序称

  • 主要内容:开始和结束事务,提交事务,回滚事务,自动事务控制在本章中,我们将讨论和学习PL/SQL中的事务。 数据库事务是由一个或多个相关SQL语句组成的原子工作单元。它被称为原子操作,因为构成事务的SQL语句带来的数据库修改可以共同提交,即永久化到数据库或从数据库回滚(撤销)。 成功执行的SQL语句和提交的事务不一样。即使成功执行SQL语句,除非提交包含语句的事务,否则可以回滚该语句,并且可以撤消语句所做的所有更改。 开始和结束事务 事务有开始和结束。当