Skelettet af en lagret procedureerklæring er
CREATE OR REPLACE PROCEDURE procedure_name( <<parameters>> )
AS
<<variable declarations>>
BEGIN
<<code>>
END procedure_name;
I den kode, du sendte,
- Du sætter
BEGIN
før variabeldeklarationerne - Du har en uvedkommende
DECLARE
-- du ville kun bruge det, hvis du erklærer en PL/SQL-blok, der ikke involverer enCREATE
. - Du mangler semikolon efter din
RETURN
udsagn. - En procedure kan ikke returnere en værdi. Hvis du vil returnere enten et 1 eller et 0, vil du sandsynligvis have en funktion, ikke en procedure. Hvis du har brug for en procedure, kan du erklære en
OUT
parameter. - Du mangler
THEN
efterIF
Det lyder som om du vil have noget lignende
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;
Bemærk, at du generelt er bedre stillet ved at bruge en form for navngivningskonvention for at sikre, at parametre og lokale variabler ikke deler navnet på en kolonne. Forsøger at finde ud af, om LISTNAME
er en parameter eller et kolonnenavn, og hvad forskellen mellem LIST_NAME
og LISTNAME
det vil generelt forvirre fremtidige programmører. Personligt bruger jeg en p_
præfiks for parametre og en l_
præfiks for lokale variabler. Jeg vil også foreslå at bruge forankrede typer-- lists_master.list_name%type
hvis det er det, der sendes ind
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;