3

主キー値が指定されたときにデータ行を返す関数を含むパッケージ (DATA_PKG) があります。別のパッケージ (CALLER_PKG) のプロシージャーによって呼び出されたときに、DATA_PKG 関数の 1 つが失敗する状況を発見しました。次のエラーがスローされます。

ora -00932: inconsistent datatypes: expected - got -

パッケージ本体でまったく同じ関数を使用して CALLER をコンパイルすると、機能します。これが私のコードです:

CREATE OR REPLACE PACKAGE "DATA_PKG" AS

  FUNCTION data_function
   (primary_i IN table_name.id%type)
   RETURN table_name%ROWTYPE;

END DATA_PKG;

/

CREATE OR REPLACE PACKAGE BODY "DATA_PKG" AS

  FUNCTION data_function
   (primary_i IN table_name.id%type)
   RETURN table_name%ROWTYPE AS
   retval table_name%ROWTYPE;
  BEGIN
    SELECT * INTO retval FROM table_name WHERE id = primary_i;

    RETURN retval;
  END data_function;

END DATA_PKG;

/

CREATE OR REPLACE PACKAGE "CALLER" AS

  PROCEDURE calling_proc
   (key_i IN table_name.id%TYPE);

END CALLER;

/

CREATE OR REPLACE PACKAGE BODY "CALLER" AS

  PROCEDURE calling_proc
   (key_i IN table_name.id%TYPE) AS
   table_rec table_name%rowtype;
  BEGIN
   table_rec := data_pkg.data_function(primary_i=>key_i);
   /*
     do something with the returned record
   */
  END calling_proc;

END CALLER;

caller.calling_proc が実行されると、このコードは前述の方法で ora -00932 で失敗します。

次のコードが機能します。

CREATE OR REPLACE PACKAGE BODY "CALLER" AS

  FUNCTION data_function
   (primary_i IN table_name.id%type)
   RETURN table_name%ROWTYPE AS
   retval table_name%ROWTYPE;
  BEGIN
    SELECT * INTO retval FROM table_name WHERE id = primary_i;

    RETURN retval;
  END data_function;

  PROCEDURE calling_proc
   (key_i IN table_name.id%TYPE) AS
   table_rec table_name%rowtype;
  BEGIN
   table_rec := data_function(primary_i=>key_i);
   /*
     do something with the returned record
   */
  END calling_proc;

END CALLER;

これが機能する理由、私が考えるコードへの些細な変更を誰かに教えてもらえますか? このエラーは、データ型に一貫性がないことを示していますが、「ソリューション」では何も変更していません。

これは以前に誰かに起こったことがありますか?また、エラー メッセージのダッシュが何を表しているか説明できる人はいますか? ここで名前が付けられたデータ型が表示されることを期待しています。

4

1 に答える 1

0

これの代わりに

table_rec := data_pkg.data_function(primary_i=>key_i);

これを試してください(両方とも文字通り同じですが、うまくいくかもしれません)

SELECT data_pkg.data_function(primary_i=>key_i)
  INTO table_rec
  FROM dual;
于 2012-10-15T18:43:15.873 に答える