Khung của một khai báo thủ tục được lưu trữ là
CREATE OR REPLACE PROCEDURE procedure_name( <<parameters>> )
AS
<<variable declarations>>
BEGIN
<<code>>
END procedure_name;
Trong mã bạn đã đăng,
- Bạn đặt
BEGINtrước khi khai báo biến - Bạn có
DECLAREkhông liên quan - bạn sẽ chỉ sử dụng nó nếu bạn đang khai báo một khối PL / SQL không liên quan đếnCREATE. - Bạn thiếu dấu chấm phẩy sau
RETURNcủa mình tuyên bố. - Một thủ tục không thể trả về một giá trị. Nếu bạn muốn trả về 1 hoặc 0, bạn có thể muốn một hàm chứ không phải một thủ tục. Nếu bạn cần một thủ tục, bạn có thể khai báo một
OUTtham số. - Bạn đang thiếu
THENsauIF
Có vẻ như bạn muốn một cái gì đó giống như
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;
Lưu ý rằng như một vấn đề chung, bạn thường nên sử dụng một số loại quy ước đặt tên để đảm bảo rằng các tham số và biến cục bộ không dùng chung tên của một cột. Đang cố gắng tìm ra liệu LISTNAME là một tham số hoặc một tên cột và sự khác biệt giữa LIST_NAME và LISTNAME nói chung sẽ gây nhầm lẫn cho các lập trình viên trong tương lai. Cá nhân tôi sử dụng p_ tiền tố cho các tham số và một l_ tiền tố cho các biến cục bộ. Tôi cũng sẽ đề xuất sử dụng các loại cố định-- lists_master.list_name%type nếu đó là những gì đang được chuyển vào
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;