1

我是存储过程的新手。我正在尝试运行存储过程并收到这些错误:我收到 PLS-00103:在预期以下情况之一时遇到符号“SELECT”:开始函数杂注过程... PLS-00103:遇到符号“RETURN”时期待以下之一: * & = - + < / > at is mod remaining not rem then... 我尝试搜索导致这些错误的原因以及与此类似的示例,但结果还不够。关于为什么会发生这些错误的任何线索?这是代码:

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;
4

2 回答 2

2

存储过程声明的框架是

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

在您发布的代码中,

  1. 你把BEGIN变量声明之前
  2. 你有一个无关紧要的DECLARE东西——只有在声明一个不涉及CREATE.
  3. 您的RETURN陈述后缺少分号。
  4. 过程不能返回值。如果你想返回 1 或 0,你可能需要一个函数,而不是一个过程。如果你需要一个过程,你可以声明一个OUT参数。
  5. 你错过了THEN之后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_NAME通常LISTNAME会使未来的程序员感到困惑。就个人而言,我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;
于 2012-12-06T16:34:39.607 回答
2
  • (更正#1)您不能在过程中返回值;应删除 LIST_ACTIONS_CHECK_ADD 并将其声明为函数以返回 NUMBER
  • (更正#2)您需要按如下方式移动CNT的声明(见下文)
  • (更正 #3)您需要在 return 语句中使用分号:
  • (更正 #4)在 IF (CNT > 0) 之后需要一个 THEN(见下文):


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;    
于 2012-12-06T16:39:41.950 回答