Скелетът на декларацията за съхранена процедура е
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;