プロが教えるわが家の防犯対策術!

以下のようなパッケージを作っています。

CREATE OR REPLACE PACKAGE
"TEST"."TEST_P" as
type test_type1 is table of TEST.TEST_TABLE%ROWTYPE;
procedure test2 (ret OUT test_type1 ) ;
end;

-----------------------------------
本体
-----------------------------------

CREATE OR REPLACE PACKAGE BODY
"TEST"."TEST_P" as

procedure test2( ret OUT test_type1 ) is
cursor basic_cusor is
select * from TEST.TEST_TABLE;
BEGIN
open basic_cusor;
loop
fetch basic_cusor into ret(0);
exit when basic_cusor%notfound;
END loop;
END TEST3;
end;

----------------------------------------

これをSQL Pluseから

set serveroutput on;
declare
 arg1 TEST.TEST_P.test_type1;
begin
TEST.TEST_P.test2(arg1);
dbms_output.put(arg1(0).coulm1);
end;

のように実行するとエラーが出ます。
初期化処理とはどのように行えばいいのでしょうか?


最終的にはSQLServerのストアドようにテーブル
のような構造で値を返えせればいいです。

A 回答 (2件)

こんにちは。



パッケージのプロシージャの引数で使用する場合、パッケージの宣言部においてインスタンスを作成しなければいけません・・・。
それと、作成したインスタンスをコレクションの型で初期化する必要があります。
これはIndexBy表(PL/SQL表)と違うところです。
(^^ゞ
    • good
    • 0
この回答へのお礼

ありがとうございます。
解決しました。
type test_type1 is table of TEST.TEST_TABLE%ROWTYPE;

type test_type1 is table of TEST.TEST_TABLE%ROWTYPE INDEX BY BINARY_INTEGER;
としたところエラーは消えました。

Oracleはまだはじめたばかりなので
INDEX BY BINARY_INTEGERをつけると何が変るのかは
まだ知りませんがこれから調べてみようと思います。

お礼日時:2005/01/31 14:51

Packageで配列の型は宣言していますが、ret自体の宣言はしていないようです。

そこで、

type test_type1 is table of TEST.TEST_TABLE%ROWTYPE;

の次に以下のようにretの宣言をすればOKだと思います。

ret test_type1;

初期化というより、retの宣言がないのが原因だと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
そのまま入れてみましたが結果は
変わりませんでした。
入れてもいれなくてもどちらでもいいようです。

お礼日時:2005/01/31 14:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A