Oracle
 sql >> Database >  >> RDS >> Oracle

PLS-00103 Errore di procedura memorizzata Oracle

Lo scheletro di una dichiarazione di stored procedure è

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

Nel codice che hai pubblicato,

  1. Metti BEGIN prima delle dichiarazioni delle variabili
  2. Hai un DECLARE estraneo -- lo useresti solo se stai dichiarando un blocco PL/SQL che non implica un CREATE .
  3. Ti mancano i punti e virgola dopo il tuo RETURN dichiarazioni.
  4. Una procedura non può restituire un valore. Se vuoi restituire un 1 o uno 0, probabilmente vuoi una funzione, non una procedura. Se hai bisogno di una procedura, puoi dichiarare un OUT parametro.
  5. Ti manca il THEN dopo il IF

Sembra che tu voglia qualcosa come

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;

Si noti che in generale, è generalmente meglio utilizzare una sorta di convenzione di denominazione per garantire che i parametri e le variabili locali non condividano il nome di una colonna. Sto cercando di capire se LISTNAME è un parametro o il nome di una colonna e qual è la differenza tra LIST_NAME e LISTNAME è generalmente confonderà i futuri programmatori. Personalmente, utilizzo un p_ prefisso per i parametri e un l_ prefisso per le variabili locali. Suggerirei anche di utilizzare tipi ancorati:lists_master.list_name%type se questo è ciò che viene passato

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;