Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

truyền mảng số nguyên cho thủ tục oracle bằng c #

Loại của bạn:

create or replace TYPE INNUMARRAY AS TABLE OF INTEGER;

là một tập hợp được xác định trong phạm vi SQL.

Đối số đã thông qua của bạn:

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

là một mảng kết hợp chỉ có thể được xác định trong một phạm vi PL / SQL (nghĩa là trong một gói hoặc trong một khối PL / SQL) và không thể được sử dụng trong một phạm vi SQL.

Chúng là hai kiểu dữ liệu khác nhau và không tương thích.

Thay vào đó, bạn có thể tạo kiểu mảng kết hợp trong một gói và sau đó trích xuất thủ công từng giá trị từ mảng kết hợp vào một tập hợp có thể được sử dụng trong phạm vi 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;
/

tôi có thể xác định kiểu mảng kết hợp bên ngoài gói không? Tôi muốn chúng độc lập.

Không, nhưng bạn có thể xác định một gói chỉ chứa kiểu:

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

Hoặc, tốt hơn, hãy tạo một số kiểu được đặt tên chung và một hàm trong gói để dịch từ một mảng kết hợp sang một tập hợp và sau đó sử dụng lại chúng trong các thủ tục của bạn:

SQL Fiddle

Thiết lập lược đồ 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. Truy vấn Oracle để tìm nạp tên cột

  2. Hàm NANVL () trong Oracle

  3. Sự cố kết nối gián đoạn Oracle JDBC

  4. Cách giải quyết ORA-29913 với bảng bên ngoài

  5. Hàm ROWIDTOCHAR () trong Oracle