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

整数配列をc#でoracleプロシージャに渡します

    あなたのタイプ:

    create or replace TYPE INNUMARRAY AS TABLE OF INTEGER;
    

    SQLスコープで定義されたコレクションです。

    渡された引数:

    p_strings.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    p_strings.Value = new int[5]{1,2,3,4,5};
    

    は、PL / SQLスコープ(つまり、パッケージ内またはPL / SQLブロック内)でのみ定義でき、SQLスコープでは使用できない連想配列です。

    これらは2つの異なる互換性のないデータ型です。

    代わりに、パッケージに連想配列型を作成し、連想配列からSQLスコープで使用できるコレクションに各値を手動で抽出できます。

    CREATE PACKAGE vehicles_pkg IS
      TYPE INNUMASSOCARRAY IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;
    
      PROCEDURE v1
      (
        VehicleGroupID_Array IN INNUMASSOCARRAY
      );
    END;
    /
    
    CREATE PACKAGE BODY vehicles_pkg IS
      PROCEDURE v1
      (
        VehicleGroupID_Array IN INNUMASSOCARRAY
      )
      IS
        p_recordset SYS_REFCURSOR;
        p_array     INNUMARRAY := INNUMARRAY();
        i           BINARY_INTEGER;
      BEGIN
        i := VehicleGroupID_Array.FIRST;
        WHILE i IS NOT NULL LOOP
          p_array.EXTEND;
          p_array( p_array.COUNT ) := VehicleGroupID_Array(i);
          i := VehicleGroupID_Array.NEXT(i);
        END LOOP;
    
        -- Rest of your procedure using p_array instead of the associative array.
      END;
    END;
    /
    

    パッケージの外で連想配列タイプを定義できますか?スタンドアロンにしたい。

    いいえ。ただし、タイプのみを含むパッケージを定義できます:

    CREATE PACKAGE vehicles_pkg IS
      TYPE INNUMASSOCARRAY IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;
    END;
    /
    
    CREATE PROCEDURE v1
    (
      VehicleGroupID_Array IN vehicles_pkg.INNUMASSOCARRAY
    )
    IS
      p_recordset SYS_REFCURSOR;
      p_array     INNUMARRAY := INNUMARRAY();
      i           BINARY_INTEGER;
    BEGIN
      i := VehicleGroupID_Array.FIRST;
      WHILE i IS NOT NULL LOOP
        p_array.EXTEND;
        p_array( p_array.COUNT ) := VehicleGroupID_Array(i);
        i := VehicleGroupID_Array.NEXT(i);
      END LOOP;
    
      -- Rest of your procedure using p_array instead of the associative array.
    END;
    /
    

    または、パッケージ内にいくつかの一般的な名前の型と関数を作成して、連想配列からコレクションに変換し、それらをプロシージャで再利用することをお勧めします。

    SQLフィドル

    Oracle11gR2スキーマのセットアップ

    CREATE TYPE IntList AS TABLE OF INTEGER
    /
    
    CREATE PACKAGE tools IS
      TYPE IntMap IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;
    
      FUNCTION IntMapToList(
        i_map IntMap
      ) RETURN IntList;
    END;
    /
    
    CREATE PACKAGE BODY tools IS
      FUNCTION IntMapToList(
        i_map IntMap
      ) RETURN IntList
      IS
        o_list IntList := IntList();
        i      BINARY_INTEGER;
      BEGIN
        IF i_map IS NOT NULL THEN
          i := o_list.FIRST;
          WHILE i IS NOT NULL LOOP
            o_list.EXTEND;
            o_list( o_list.COUNT ) := i_map( i );
            i := i_map.NEXT( i );
          END LOOP;
        END IF;
        RETURN o_list;
      END;
    END;
    /
    
    CREATE PROCEDURE v1
    (
      VehicleGroupID_Array IN tools.IntMap
    )
    IS
      p_recordset SYS_REFCURSOR;
      p_array     IntList := tools.IntMapToList( VehicleGroupID_Array );
      i           BINARY_INTEGER;
    BEGIN
      -- Rest of your procedure using p_array instead of the associative array.
      NULL;
    END;
    /
    


    1. IRI-Windocksテストデータベースリポジトリ

    2. UID –Oracleの現在のセッションのIDを返します

    3. SQL Serverの列からノーブレークスペースを削除するにはどうすればよいですか?

    4. ストレージエンジンの選択:Aria