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

P_AAの呼び出しで引数の数またはタイプが間違っています

    プロシージャは次のようにパラメータを定義します:

    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;
    /
    

    これがdb<>フィドルデモ です。 両方のアプローチが機能していることを示しています。




    1. IN(サブクエリ)を使用したクエリがIN(離散リスト)を使用したクエリよりも時間がかかるのはなぜですか

    2. CSVファイルをMySQLテーブルにインポートするにはどうすればよいですか?

    3. MS Access:長所と短所

    4. 多対多の関係をモデル化するための最良の方法