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
BEGINavant 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
RETURNdé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
OUTparamètre. - Il vous manque le
THENaprè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;