Skelettet i en lagrad procedurdeklaration är
CREATE OR REPLACE PROCEDURE procedure_name( <<parameters>> )
AS
<<variable declarations>>
BEGIN
<<code>>
END procedure_name;
I koden du postade,
- Du anger
BEGINföre variabeldeklarationerna - Du har en främmande
DECLARE-- du skulle bara använda det om du deklarerar ett PL/SQL-block som inte involverar enCREATE. - Du saknar semikolon efter din
RETURNuttalanden. - En procedur kan inte returnera ett värde. Om du vill returnera antingen en 1 eller en 0, vill du förmodligen ha en funktion, inte en procedur. Om du behöver en procedur kan du deklarera en
OUTparameter. - Du saknar
THENefterIF
Det låter som att du vill ha något liknande
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;
Observera att du generellt sett är bättre att använda någon form av namnkonvention för att säkerställa att parametrar och lokala variabler inte delar namnet på en kolumn. Försöker ta reda på om LISTNAME är en parameter eller ett kolumnnamn och vad är skillnaden mellan LIST_NAME och LISTNAME Det kommer i allmänhet att förvirra framtida programmerare. Personligen använder jag en p_ prefix för parametrar och en l_ prefix för lokala variabler. Jag skulle också rekommendera att använda förankrade typer-- lists_master.list_name%type om det är det som skickas in
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;