sql >> データベース >  >> RDS >> Oracle

PLS-00103Oracleストアドプロシージャエラー

    ストアドプロシージャ宣言のスケルトンは

    です。
    CREATE OR REPLACE PROCEDURE procedure_name( <<parameters>> ) 
    AS
      <<variable declarations>>
    BEGIN
      <<code>>
    END procedure_name;
    

    投稿したコードでは、

    1. BEGINを配置します 変数宣言の前
    2. 無関係なDECLAREがあります --CREATEを含まないPL/SQLブロックを宣言する場合にのみ使用します。 。
    3. RETURNの後にセミコロンがありません ステートメント。
    4. プロシージャは値を返すことができません。 1または0のいずれかを返したい場合は、プロシージャではなく関数が必要になる可能性があります。プロシージャが必要な場合は、OUTを宣言できます。 パラメータ。
    5. 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;
    


    1. テーブル全体を明示的にロックしているときにpostgresが同時に行更新エラーを表示する理由

    2. PHPを使用してOracleにBLOBとして画像をアップロードする

    3. HAProxy接続とMySQL接続-知っておくべきこと

    4. AndroidOSとpostgreSQL