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
BEGIN
fö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
RETURN
uttalanden. - 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
OUT
parameter. - Du saknar
THEN
efterIF
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;