Le squelette d'une déclaration de procédure stockée est
CREATE OR REPLACE PROCEDURE procedure_name( <<parameters>> )
AS
<<variable declarations>>
BEGIN
<<code>>
END procedure_name;
Dans le code que vous avez posté,
- Vous mettez le
BEGIN
avant les déclarations de variables - Vous avez un
DECLARE
étranger - vous ne l'utiliserez que si vous déclarez un bloc PL/SQL qui n'implique pas deCREATE
. - Il manque des points-virgules après votre
RETURN
déclarations. - Une procédure ne peut pas renvoyer de valeur. Si vous souhaitez renvoyer un 1 ou un 0, vous voulez probablement une fonction, pas une procédure. Si vous avez besoin d'une procédure, vous pouvez déclarer un
OUT
paramètre. - Il vous manque le
THEN
après leIF
On dirait que vous voulez quelque chose comme
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;
Notez qu'en règle générale, il est généralement préférable d'utiliser une sorte de convention de dénomination pour garantir que les paramètres et les variables locales ne partagent pas le nom d'une colonne. Essayer de déterminer si LISTNAME
est un paramètre ou un nom de colonne et quelle est la différence entre LIST_NAME
et LISTNAME
Cela confondra généralement les futurs programmeurs. Personnellement, j'utilise un p_
préfixe pour les paramètres et un l_
préfixe pour les variables locales. Je suggérerais également d'utiliser des types ancrés-- lists_master.list_name%type
si c'est ce qui est transmis
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;