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
BEGIN
trước khi khai báo biến - Bạn có
DECLARE
khô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
RETURN
củ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
OUT
tham số. - Bạn đang thiếu
THEN
sauIF
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;