1. ホーム
  2. sql

[解決済み] Oracle Error PLS-00323: サブプログラムまたはカーソルがパッケージ仕様で宣言されているため、パッケージ本体で定義する必要があります。

2022-02-24 07:02:15

質問内容

pl/sqlプロシージャをパッケージに入れるのを手伝ってくれる人がいますか?私は試してみましたが、苦労しています。

私のパッケージの仕様はこんな感じです。

CREATE OR REPLACE PACKAGE film_pkg
IS
title VARCHAR2(100);
PROCEDURE get_films(fname VARCHAR2);
END film_pkg;

--

これが私のパッケージ本体で、問題にぶつかっているところです。

  CREATE OR REPLACE PACKAGE BODY film_pkg
IS
   PROCEDURE get_films (fname    IN     film.title%TYPE,
                        r_date      OUT film.release_date%TYPE,
                        dur         OUT film.duration%TYPE)
   AS
   BEGIN
      SELECT release_date, duration
        INTO r_date, dur
        FROM FILM
       WHERE title = fname;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         r_date := '';
         dur := '';
   END get_films;
END film_pkg;

もし誰かがこのエラーを修正するのを手伝ってくれるなら、私はそれを感謝します。

Error(4,11): PLS-00323: subprogram or cursor 'GET_FILMS' is declared in a package specification and must be defined in the package body

解決方法は?

ヘッダーとボディのプロシージャの定義が一致していない

ヘッダーに、あります。

PROCEDURE get_films(fname VARCHAR2);

一方、本文では

PROCEDURE get_films(fname IN film.title%type, 
   r_date OUT film.release_date%type, dur OUT film.duration%type)

おそらく、2つのOUTパラメータを追加してヘッダー定義を更新する必要があるのでしょう?

まとめると

  • ヘッダー定義がボディ実装のすべてのパラメータ(パラメータの数、パラメータ名、パラメータの順序、パラメータタイプ)と一致することを確認する。
  • Alexのコメントにあるように、カスタムタイプ( film.title%type ) とベースタイプ ( VARCHAR2 ). どちらか一方を選択してください。