Oracle
 sql >> Baza danych >  >> RDS >> Oracle

przekaż tablicę liczb całkowitych do procedury Oracle przez c#

Twój typ:

create or replace TYPE INNUMARRAY AS TABLE OF INTEGER;

to kolekcja zdefiniowana w zakresie SQL.

Twój przekazany argument:

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

jest tablicą asocjacyjną, która może być zdefiniowana tylko w zakresie PL/SQL (tj. w pakiecie lub w bloku PL/SQL) i nie może być używana w zakresie SQL.

Są to dwa różne i niezgodne typy danych.

Zamiast tego możesz utworzyć typ tablicy asocjacyjnej w pakiecie, a następnie ręcznie wyodrębnić każdą wartość z tablicy asocjacyjnej do kolekcji, której można użyć w zakresie 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;
/

czy mogę zdefiniować typ tablicy asocjacyjnej poza pakietem? Chcę, aby były samodzielne.

Nie, ale możesz zdefiniować pakiet zawierający tylko typ:

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

Lub, lepiej, utwórz kilka ogólnie nazwanych typów i funkcji w pakiecie do przetłumaczenia z tablicy asocjacyjnej na kolekcję, a następnie użyj ich ponownie w swoich procedurach:

Skrzypce SQL

Konfiguracja schematu 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. Jak tworzyć tablice asocjacyjne w bazie danych Oracle

  2. błąd składni z zapytaniem o aktualizację podczas dołączania do jakiejś tabeli

  3. Kursor w procedurze zwraca więcej wartości niż zapytanie

  4. Czy istnieje sposób na ponowne połączenie puli połączeń JBoss z Oracle, gdy połączenia się zepsują?

  5. Funkcja dzielenia w Oracle na wartości oddzielone przecinkami z automatyczną sekwencją