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
- Sie setzen den
BEGINvor den Variablendeklarationen - Sie haben eine irrelevante
DECLARE-- Sie würden das nur verwenden, wenn Sie einen PL/SQL-Block deklarieren, der keinCREATEbeinhaltet . - Ihnen fehlen Semikolons nach Ihrem
RETURNAussagen. - 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
OUTdeklarieren Parameter. - Dir fehlt der
THENnach demIF
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;