O esqueleto de uma declaração de procedimento armazenado é
CREATE OR REPLACE PROCEDURE procedure_name( <<parameters>> )
AS
<<variable declarations>>
BEGIN
<<code>>
END procedure_name;
No código que você postou,
- Você coloca o
BEGIN
antes das declarações de variáveis - Você tem um
DECLARE
estranho -- você só usaria isso se estivesse declarando um bloco PL/SQL que não envolve umCREATE
. - Está faltando ponto e vírgula após seu
RETURN
declarações. - Um procedimento não pode retornar um valor. Se você deseja retornar um 1 ou um 0, provavelmente deseja uma função, não um procedimento. Se você precisar de um procedimento, você pode declarar um
OUT
parâmetro. - Está faltando o
THEN
após oIF
Parece que você quer 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;
Observe que, em geral, é melhor usar algum tipo de convenção de nomenclatura para garantir que parâmetros e variáveis locais não compartilhem o nome de uma coluna. Tentando descobrir se
LISTNAME
é um parâmetro ou um nome de coluna e qual a diferença entre LIST_NAME
e LISTNAME
Isso geralmente confunde os futuros programadores. Pessoalmente, eu uso um p_
prefixo para parâmetros e um l_
prefixo para variáveis locais. Eu também sugeriria usar tipos ancorados-- lists_master.list_name%type
se é isso que está sendo passado 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;