プロシージャは次のようにパラメータを定義します:
serv in t45
したがって、t45
パラメータの定義済みデータ型です。
これで、プロシージャを呼び出すときに、変数v
を渡します。 。そして、v
はどうですか 定義されていますか?
type t1 is table of number;
...
v t1;
t1
t45
とは異なるタイプです 。構造が同じであってもタイプが異なる 。そしてそれがあなたがPLS-00306を手に入れる理由です。解決策は非常に簡単です。v
を定義します。 t45
として 。
コレクションを初期化する必要があります。これは、プログラムの開始時に、そのタイプのデフォルトのコンストラクターを使用して行います...
v := t45();
...または宣言するとき:
v t45 := t45();
それを超えると、割り当てロジックが間違っていることに気付くでしょう。カウンターをインクリメントしたり、配列を拡張したりする前に、コレクションの要素にフェッチしています。必要なのはこれです:
declare
cursor c1 is select serv_item_id from serv_item;
n number:=0;
v t45 := t45();
x number;
begin
open c1;
loop
fetch c1 into x;
exit when c1%notfound;
n:=n+1;
v.extend();
v(n) := x;
end loop;
close c1;
p_aa(v);
end;
/
または、冗長性の低い一括収集を使用します。これにより、すべてのループと型管理が暗黙的に処理されます:
declare
v t45;
begin
select serv_item_id
bulk collect into v
from serv_item;
p_aa(v);
end;
/
これが