Скелетът на декларацията за съхранена процедура е
CREATE OR REPLACE PROCEDURE procedure_name( <<parameters>> )
AS
<<variable declarations>>
BEGIN
<<code>>
END procedure_name;
В кода, който публикувахте,
- Поставяте
BEGINпреди декларациите на променливи - Имате външен
DECLARE-- бихте го използвали само ако декларирате PL/SQL блок, който не включваCREATE. - Липсват ви точки и запетая след
RETURNизявления. - Процедура не може да върне стойност. Ако искате да върнете 1 или 0, вероятно искате функция, а не процедура. Ако имате нужда от процедура, можете да декларирате
OUTпараметър. - Липсва ви
THENследIF
Изглежда, че искате нещо като
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;
Обърнете внимание, че като цяло е по-добре да използвате някакъв вид конвенция за именуване, за да сте сигурни, че параметрите и локалните променливи не споделят името на колона. Опитвам се да разбера дали LISTNAME е параметър или име на колона и каква е разликата между LIST_NAME и LISTNAME това обикновено ще обърка бъдещите програмисти. Лично аз използвам p_ префикс за параметри и l_ префикс за локални променливи. Бих предложил също да използвате закотвени типове-- lists_master.list_name%type ако това е, което се предава
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;