El esqueleto de una declaración de procedimiento almacenado es
CREATE OR REPLACE PROCEDURE procedure_name( <<parameters>> )
AS
<<variable declarations>>
BEGIN
<<code>>
END procedure_name;
En el código que publicaste,
- Pones el
BEGIN
antes de las declaraciones de variables - Tienes un
DECLARE
superfluo -- solo usaría eso si está declarando un bloque PL/SQL que no involucra unCREATE
. - Le faltan puntos y comas después de
RETURN
declaraciones. - Un procedimiento no puede devolver un valor. Si desea devolver un 1 o un 0, probablemente desee una función, no un procedimiento. Si necesita un procedimiento, puede declarar un
OUT
parámetro. - Te falta el
THEN
después delIF
Parece que quieres algo como
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;
Tenga en cuenta que, en general, es mejor que utilice algún tipo de convención de nomenclatura para garantizar que los parámetros y las variables locales no compartan el nombre de una columna. Intentando averiguar si LISTNAME
es un parámetro o un nombre de columna y cuál es la diferencia entre LIST_NAME
y LISTNAME
Esto generalmente confundirá a los futuros programadores. Personalmente, uso un p_
prefijo para parámetros y un l_
prefijo para variables locales. También sugeriría usar tipos anclados:lists_master.list_name%type
si eso es lo que se está pasando
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;