PLS-00103:在期待以下之一时遇到符号“IS”::=。 ( @ % ; 非空范围默认字符

Posted

技术标签:

【中文标题】PLS-00103:在期待以下之一时遇到符号“IS”::=。 ( @ % ; 非空范围默认字符【英文标题】:PLS-00103: Encountered the symbol "IS" when expecting one of the following: := . ( @ % ; not null range default character 【发布时间】:2020-11-09 10:38:16 【问题描述】:

我正面临这个错误:

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/11     PLS-00103: Encountered the symbol "IS" when expecting one of the
         following:
         := . ( @ % ; not null range default character

我的包裹是:

CREATE OR REPLACE PACKAGE BODY EMP_PK AS
 
PROCEDURE INSERT_TR(EMPNO EMP_20171250.EMPNO%TYPE,ENAME EMP_20171250.ENAME%TYPE,SAL EMP_20171250.SAL%TYPE)  IS  
INSERT_ERROR EXCEPTION;  
CRUSOR C1 IS INSERT INTO EMP_20171250(EMPNO,ENAME,SAL) VALUES(EMPNO,ENAME,SAL);  
BEGIN  
IF(C1%FOUND) THEN  
DBMS_OUTPUT.PUT_LINE('RECORD INSERTED');  
ELSE   
RAISE INSERT_ERROR; 
END IF;  
EXCEPTION    
WHEN INSERT_ERROR THEN 
DBMS_OUTPUT.PUT_LINE('ERROR WHILE RECORD INSERTION');  
END INSERT_TR; 
END EMP_PK;

【问题讨论】:

【参考方案1】: 不是CRUSOR,而是CURSOR 游标不能包含INSERT 语句;这是SELECT 您正在检查 cursor 是否返回了某些内容,但是 - 您从未打开它也没有从中获取它,所以它几乎没用 insert_error 看起来在 插入 一行时出错了,但是 - 如果光标没有返回任何内容,你实际上是在提升它

基本上,您根本不需要光标。这样的程序会做:

   PROCEDURE insert_tr (p_empno  emp_20171250.empno%TYPE,
                        p_ename  emp_20171250.ename%TYPE,
                        p_sal    emp_20171250.sal%TYPE)
   IS
   BEGIN
         INSERT INTO emp_20171250 (empno, ename, sal)
              VALUES (p_empno, p_ename, p_sal);
   END insert_tr;

如果insert 失败,Oracle 无论如何都会引发异常 - 是的,如果你愿意,你可以处理它/它们。

另外,最好区分参数名和列名;例如,在他们的名字前加上p_(就像我一样)。

【讨论】:

以上是关于PLS-00103:在期待以下之一时遇到符号“IS”::=。 ( @ % ; 非空范围默认字符的主要内容,如果未能解决你的问题,请参考以下文章

PLS-00103:在期待以下之一时遇到符号“&”:%符号“%被插入在“&”之前继续[关闭]

PLS-00103:遇到符号“;”当期待以下之一时:

错误:PLS-00103:遇到符号“;”当期望以下之一时:* & = - + < / > at in is mod remaining not rem then

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

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

PLS-00103 遇到符号“数字”