Oracle
 sql >> Datenbank >  >> RDS >> Oracle

PLS-00103 Fehler in gespeicherter Oracle-Prozedur

Das Grundgerüst einer Deklaration einer gespeicherten Prozedur ist

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

In dem von Ihnen geposteten Code

  1. Sie setzen den BEGIN vor den Variablendeklarationen
  2. Sie haben eine irrelevante DECLARE -- Sie würden das nur verwenden, wenn Sie einen PL/SQL-Block deklarieren, der kein CREATE beinhaltet .
  3. Ihnen fehlen Semikolons nach Ihrem RETURN Aussagen.
  4. Eine Prozedur kann keinen Wert zurückgeben. Wenn Sie entweder eine 1 oder eine 0 zurückgeben möchten, möchten Sie wahrscheinlich eine Funktion und keine Prozedur. Wenn Sie eine Prozedur benötigen, können Sie ein OUT deklarieren Parameter.
  5. Dir fehlt der THEN nach dem IF

Es hört sich so an, als wollten Sie so etwas wie

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;

Beachten Sie, dass Sie im Allgemeinen besser dran sind, eine Art Namenskonvention zu verwenden, um sicherzustellen, dass Parameter und lokale Variablen nicht den Namen einer Spalte teilen. Ich versuche herauszufinden, ob LISTNAME ein Parameter oder ein Spaltenname ist und was der Unterschied zwischen LIST_NAME ist und LISTNAME Dies wird zukünftige Programmierer im Allgemeinen verwirren. Ich persönlich verwende ein p_ Präfix für Parameter und ein l_ Präfix für lokale Variablen. Ich würde auch die Verwendung verankerter Typen vorschlagen – lists_master.list_name%type falls das weitergegeben wird

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;