PLS-00103 Oracle存储过程错误

时间:2012-12-06 16:27:11

标签: sql oracle stored-procedures plsql

我是存储过程的新手。 我试图运行存储过程并获取这些错误: 我正在获得PLS-00103:遇到以下其中一项时遇到符号“SELECT”:开始函数编译指示程序... PLS-00103:当遇到以下情况之一时遇到符号“RETURN”:*& = - +< />在in是mod剩余不是rem然后... 我已经尝试搜索导致这些错误的原因以及与此类似的示例,但结果还不够。关于为什么会发生这些错误的任何线索? 这是代码:

CREATE OR REPLACE PROCEDURE LIST_ACTIONS_CHECK_ADD 
(
  LISTNAME IN VARCHAR2  
) AS 
BEGIN
 DECLARE CNT NUMBER;
 SELECT COUNT(LIST_NAME) INTO CNT FROM LISTS_MASTER WHERE LIST_NAME = LISTNAME;
IF (CNT > 0)
 RETURN 1
ELSE
 RETURN 0
END IF;
END LIST_ACTIONS_CHECK_ADD;

新守则:

CREATE OR REPLACE PROCEDURE LIST_ACTIONS_CHECK_ADD 
(
  P_LISTNAME IN VARCHAR2  
) 
AS 
 L_CNT NUMBER;
BEGIN
 SELECT COUNT(LIST_NAME) 
   INTO L_CNT 
   FROM LISTS_MASTER 
  WHERE LIST_NAME = P_LISTNAME;
 IF (L_CNT > 0)
   RETURN 1;
 ELSE
   RETURN 0;
  END IF;
END LIST_ACTIONS_CHECK_ADD;

2 个答案:

答案 0 :(得分:2)

存储过程声明的框架是

CREATE OR REPLACE PROCEDURE procedure_name( <<parameters>> ) 
AS
  <<variable declarations>>
BEGIN
  <<code>>
END procedure_name;

在您发布的代码中

  1. 您将BEGIN放在变量声明
  2. 之前
  3. 你有一个无关的DECLARE - 你只会在声明一个不涉及CREATE的PL / SQL块时使用它。
  4. RETURN语句后,您缺少分号。
  5. 过程无法返回值。如果要返回1或0,您可能需要一个函数,而不是一个过程。如果您需要一个程序,可以声明OUT参数。
  6. 您错过了THEN
  7. 之后的IF

    听起来你想要像

    这样的东西
    CREATE OR REPLACE FUNCTION LIST_ACTIONS_CHECK_ADD 
    (
      LISTNAME IN VARCHAR2  
    ) 
      RETURN NUMBER
    AS 
     CNT NUMBER;
    BEGIN
     SELECT COUNT(LIST_NAME) 
       INTO CNT 
       FROM LISTS_MASTER 
      WHERE LIST_NAME = LISTNAME;
     IF (CNT > 0)
     THEN
       RETURN 1;
     ELSE
       RETURN 0;
      END IF;
    END LIST_ACTIONS_CHECK_ADD;
    

    请注意,作为一般事项,通常最好使用某种命名约定来确保参数和局部变量不共享列的名称。试图确定LISTNAME是参数还是列名称以及LIST_NAMELISTNAME之间的区别通常会使未来的程序员感到困惑。就个人而言,我为参数使用p_前缀,为局部变量使用l_前缀。我还建议使用锚定类型 - lists_master.list_name%type,如果这是

    中传递的内容
    CREATE OR REPLACE FUNCTION LIST_ACTIONS_CHECK_ADD 
    (
      P_LIST_NAME IN lists_master.list_name%type
    ) 
      RETURN NUMBER
    AS 
     L_CNT NUMBER;
    BEGIN
     SELECT COUNT(LIST_NAME) 
       INTO L_CNT 
       FROM LISTS_MASTER 
      WHERE LIST_NAME = P_LIST_NAME;
     IF (L_CNT > 0)
     THEN
       RETURN 1;
     ELSE
       RETURN 0;
      END IF;
    END LIST_ACTIONS_CHECK_ADD;
    

答案 1 :(得分:2)

  • (更正#1)您无法在程序中返回值;应删除LIST_ACTIONS_CHECK_ADD并将其声明为函数以返回NUMBER
  • (更正#2)您需要按如下方式移动CNT声明(见下文)
  • (更正#3)您需要在返回语句中使用分号:
  • (更正#4)在IF(CNT> 0)之后你需要一个(见下文):


DROP PROCEDURE LIST_ACTIONS_CHECK_ADD;
CREATE OR REPLACE FUNCTION LIST_ACTIONS_CHECK_ADD
(
   LISTNAME IN VARCHAR2  
) 

RETURN NUMBER AS 

  CNT NUMBER;
BEGIN
    SELECT COUNT(LIST_NAME) INTO CNT FROM LISTS_MASTER WHERE LIST_NAME = LISTNAME;
    IF (CNT > 0) THEN
       RETURN 1;
    ELSE
       RETURN 0;
    END IF;
END LIST_ACTIONS_CHECK_ADD;

这可以从SQLPLUS执行:

SET SERVEROUTPUT ON SIZE 100000;
DECLARE
    V_RESULT NUMBER;
BEGIN

    V_RESULT := LIST_ACTIONS_CHECK_ADD('X');
    DBMS_OUTPUT.PUT_LINE('RESULT: ' || V_RESULT);

END;