sql >> Base de Datos >  >> RDS >> Oracle

PLS-00103 Error de procedimiento almacenado de Oracle

El esqueleto de una declaración de procedimiento almacenado es

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

En el código que publicaste,

  1. Pones el BEGIN antes de las declaraciones de variables
  2. Tienes un DECLARE superfluo -- solo usaría eso si está declarando un bloque PL/SQL que no involucra un CREATE .
  3. Le faltan puntos y comas después de RETURN declaraciones.
  4. Un procedimiento no puede devolver un valor. Si desea devolver un 1 o un 0, probablemente desee una función, no un procedimiento. Si necesita un procedimiento, puede declarar un OUT parámetro.
  5. Te falta el THEN después del IF

Parece que quieres 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;

Tenga en cuenta que, en general, es mejor que utilice algún tipo de convención de nomenclatura para garantizar que los parámetros y las variables locales no compartan el nombre de una columna. Intentando averiguar si LISTNAME es un parámetro o un nombre de columna y cuál es la diferencia entre LIST_NAME y LISTNAME Esto generalmente confundirá a los futuros programadores. Personalmente, uso un p_ prefijo para parámetros y un l_ prefijo para variables locales. También sugeriría usar tipos anclados:lists_master.list_name%type si eso es lo que se está pasando

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;