有序列错误的程序 - 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 发生需要指导的主要内容,如果未能解决你的问题,请参考以下文章
oracle程序错误PLS-00103遇到符号“END”[关闭]