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
BEGIN
vor den Variablendeklarationen - Sie haben eine irrelevante
DECLARE
-- Sie würden das nur verwenden, wenn Sie einen PL/SQL-Block deklarieren, der keinCREATE
beinhaltet . - Ihnen fehlen Semikolons nach Ihrem
RETURN
Aussagen. - 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. - Dir fehlt der
THEN
nach 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;