有序列错误的程序 - PLS-00103 发生需要指导

Posted

技术标签:

【中文标题】有序列错误的程序 - PLS-00103 发生需要指导【英文标题】:Procedure with sequence error - PLS-00103 occurring need guidance 【发布时间】:2018-05-14 10:39:51 【问题描述】:

您好堆栈溢出我是 sql 新手,我正在尝试创建一个程序来添加新顾问。我将在带有按钮的 apex 应用程序中重新使用代码来执行任务。我还实施了序列以添加到顾问的新条目中。不幸的是我有错误

编译失败,第 10 行 (11:48:18) PLS-00103:在预期以下情况之一时遇到符号“BEGIN”:;使用 authid 作为集群顺序,使用外部确定性 parallel_enable 流水线 result_cache 可访问

我能否得到一些指导来解决这个问题,因为我是 sql 新手,谢谢大家,研究没有帮助。

原代码

create or replace procedure hirecst
       (CST_NAME VARCHAR2,
        START_DATE DATE,
        LEAVE_DATE DATE,
        LOCATION VARCHAR2,
        SPECIALIST_AREA VARCHAR2)

    RETURN NUMBER IS
       new_cst NUMBER;
    BEGIN
       SELECT CONSULTANT_IDSEQ.NEXTVAL
          INTO new_cst
          FROM DUAL;
       INSERT INTO LDS_CONSULTANT (CONSULTANT_ID, CST_NAME, START_DATE, LEAVE_DATE, LOCATION, SPECIALIST_AREA)
          VALUES (new_cst, p_con_name, p_con_start, p_con_end, p_con_loc, p_con_spec);

       RETURN(new_cst);
    END;

删除了返回

create or replace procedure hirecst
   (CST_NAME VARCHAR2,
    START_DATE DATE,
    LEAVE_DATE DATE,
    LOCATION VARCHAR2,
    SPECIALIST_AREA VARCHAR2)



BEGIN
new_cst NUMBER;
   SELECT CONSULTANT_IDSEQ.NEXTVAL
      INTO new_cst
      FROM DUAL;
   INSERT INTO LDS_CONSULTANT (CONSULTANT_ID, CST_NAME, START_DATE, LEAVE_DATE, LOCATION, SPECIALIST_AREA)
      VALUES (new_cst, p_con_name, p_con_start, p_con_end, p_con_loc, p_con_spec);


END;

【问题讨论】:

一个 procedure 不返回任何东西。你应该创建a function 吗? (还有;same course?*8-) Is it possible to use "return" in stored procedure?的可能重复 不,我删除了返回,它返回了一个不同的错误 这是您发布的错误的直接问题。您已将问题编辑为现在没有该问题;但是您还从该行中删除了IS。 (还有其他问题;p_con_name 等来自哪里?那些应该是过程参数的名称吗?而且您不需要 new_cst 变量 - 您可以直接在插入语句中使用序列.) 你不需要select CONSULTANT_IDSEQ.NEXTVAL into new_cst from dual;。只需制作new_cst := CONSULTANT_IDSEQ.NEXTVAL; 即可。 INSERT INTO LDS_CONSULTANT (...) VALUES (CONSULTANT_IDSEQ.NEXTVAL, ...); 如果您只需要该值一次。 【参考方案1】:

注意:我忽略了声明的参数名称与 INSERT 语句中使用的参数名称之间明显的不匹配。


As documented in the manual 你需要AS(或IS)关键字来启动实际的过程部分 - 之后需要编写变量声明:

create or replace procedure hirecst
   (CST_NAME VARCHAR2,
    START_DATE DATE,
    LEAVE_DATE DATE,
    LOCATION VARCHAR2,
    SPECIALIST_AREA VARCHAR2)
AS --<< HERE
  new_cst NUMBER;
BEGIN
   SELECT CONSULTANT_IDSEQ.NEXTVAL
      INTO new_cst
      FROM DUAL;

   INSERT INTO LDS_CONSULTANT 
      (CONSULTANT_ID, CST_NAME, START_DATE, LEAVE_DATE, LOCATION, SPECIALIST_AREA)
    VALUES 
      (new_cst, p_con_name, p_con_start, p_con_end, p_con_loc, p_con_spec);
END;

但是,SELECT INTO 根本不需要,您可以直接在INSERT 语句中使用nextval。因此,您可以将程序简化为:

create or replace procedure hirecst
   (CST_NAME VARCHAR2,
    START_DATE DATE,
    LEAVE_DATE DATE,
    LOCATION VARCHAR2,
    SPECIALIST_AREA VARCHAR2)
AS --<< Still needed!
BEGIN
   INSERT INTO LDS_CONSULTANT 
     (CONSULTANT_ID, CST_NAME, START_DATE, LEAVE_DATE, LOCATION, SPECIALIST_AREA)
   VALUES 
     (CONSULTANT_IDSEQ.NEXTVAL, p_con_name, p_con_start, p_con_end, p_con_loc, p_con_spec);
END;

如果你想从过程中返回生成的 ID,你需要一个 OUT 参数:

create or replace procedure hirecst
   (CST_NAME VARCHAR2,
    START_DATE DATE,
    LEAVE_DATE DATE,
    LOCATION VARCHAR2,
    SPECIALIST_AREA VARCHAR2, 
    p_consultant_id out integer) --<< HERE
AS 
BEGIN
   -- Assign the value to the OUT parameter
   p_consultant_id := CONSULTANT_IDSEQ.NEXTVAL;

   INSERT INTO LDS_CONSULTANT 
      (CONSULTANT_ID, CST_NAME, START_DATE, LEAVE_DATE, LOCATION, SPECIALIST_AREA)
    VALUES 
      (p_consultant_id, p_con_name, p_con_start, p_con_end, p_con_loc, p_con_spec);
END;
/

【讨论】:

【参考方案2】:

以下是procedre的语法-

CREATE [OR REPLACE] PROCEDURE procedure_name
    [ (parameter [,parameter]) ]

IS
    [declaration_section]

BEGIN
    executable_section

[EXCEPTION
    exception_section]

END [procedure_name];

你忘记了'IS'关键字

following is the code-

    create or replace procedure hirecst
           (CST_NAME VARCHAR2,
            START_DATE DATE,
            LEAVE_DATE DATE,
            LOCATION VARCHAR2,
            SPECIALIST_AREA VARCHAR2)

         IS
           new_cst NUMBER;
        begin
           SELECT CONSULTANT_IDSEQ.NEXTVAL
              INTO new_cst
              FROM DUAL;
           INSERT INTO LDS_CONSULTANT (CONSULTANT_ID, CST_NAME, START_DATE, LEAVE_DATE, LOCATION, SPECIALIST_AREA)
              VALUES (new_cst, p_con_name, p_con_start, p_con_end, p_con_loc, p_con_spec);

           end;
        ;

【讨论】:

以上是关于有序列错误的程序 - PLS-00103 发生需要指导的主要内容,如果未能解决你的问题,请参考以下文章

运行程序时出现错误 PLS-00103

PL/SQL 过程、游标、PLS- 00103 错误

程序错误 - PLS-00103 遇到符号“>”

oracle程序错误PLS-00103遇到符号“END”[关闭]

PLS-00103:尝试使用序列递增值时遇到符号 DECLARE/EOF

令人沮丧的 PL/SQL 错误...PLS-00103