Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

meneruskan array integer ke prosedur Oracle dengan c #

Jenis Anda:

create or replace TYPE INNUMARRAY AS TABLE OF INTEGER;

adalah kumpulan yang didefinisikan dalam lingkup SQL.

Argumen yang Anda lewati:

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

adalah array asosiatif yang hanya dapat didefinisikan dalam lingkup PL/SQL (yaitu dalam paket atau dalam blok PL/SQL) dan tidak dapat digunakan dalam lingkup SQL.

Mereka adalah dua tipe data yang berbeda dan tidak kompatibel.

Sebagai gantinya, Anda dapat membuat tipe larik asosiatif dalam sebuah paket dan kemudian secara manual mengekstrak setiap nilai dari larik asosiatif ke dalam koleksi yang dapat digunakan dalam lingkup 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;
/

dapatkah saya mendefinisikan tipe array asosiatif di luar paket? Saya ingin mereka mandiri.

Tidak, tetapi Anda dapat menentukan paket yang hanya berisi jenis:

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

Atau, lebih baik, buat beberapa tipe dan fungsi yang diberi nama umum dalam paket untuk menerjemahkan dari larik asosiatif ke koleksi dan kemudian menggunakannya kembali dalam prosedur Anda:

SQL Fiddle

Pengaturan Skema Oracle 11g R2 :

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ubah tipe data stempel waktu menjadi stempel waktu unix Oracle

  2. Bagaimana Memanggil Fungsi Oracle dengan Python?

  3. Tempat Pemusnahan Kursor

  4. Kesalahan 1033 diterima masuk ke standby

  5. Fitur tersembunyi di Oracle