Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

PLS-00103 Erro de procedimento armazenado do Oracle


O esqueleto de uma declaração de procedimento armazenado é
CREATE OR REPLACE PROCEDURE procedure_name( <<parameters>> ) 
AS
  <<variable declarations>>
BEGIN
  <<code>>
END procedure_name;

No código que você postou,
  1. Você coloca o BEGIN antes das declarações de variáveis
  2. Você tem um DECLARE estranho -- você só usaria isso se estivesse declarando um bloco PL/SQL que não envolve um CREATE .
  3. Está faltando ponto e vírgula após seu RETURN declarações.
  4. Um procedimento não pode retornar um valor. Se você deseja retornar um 1 ou um 0, provavelmente deseja uma função, não um procedimento. Se você precisar de um procedimento, você pode declarar um OUT parâmetro.
  5. Está faltando o THEN após o IF

Parece que você quer algo como
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;

Observe que, em geral, é melhor usar algum tipo de convenção de nomenclatura para garantir que parâmetros e variáveis ​​locais não compartilhem o nome de uma coluna. Tentando descobrir se LISTNAME é um parâmetro ou um nome de coluna e qual a diferença entre LIST_NAME e LISTNAME Isso geralmente confunde os futuros programadores. Pessoalmente, eu uso um p_ prefixo para parâmetros e um l_ prefixo para variáveis ​​locais. Eu também sugeriria usar tipos ancorados-- lists_master.list_name%type se é isso que está sendo passado
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;