ストアドプロシージャ宣言のスケルトンは
です。CREATE OR REPLACE PROCEDURE procedure_name( <<parameters>> )
AS
<<variable declarations>>
BEGIN
<<code>>
END procedure_name;
投稿したコードでは、
-
BEGIN
を配置します 変数宣言の前 - 無関係な
DECLARE
があります --CREATE
を含まないPL/SQLブロックを宣言する場合にのみ使用します。 。 -
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;