Oracle
 sql >> डेटाबेस >  >> RDS >> 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};

एक सहयोगी सरणी है जिसे केवल पीएल/एसक्यूएल स्कोप (यानी पैकेज में या पीएल/एसक्यूएल ब्लॉक के भीतर) में परिभाषित किया जा सकता है और एसक्यूएल स्कोप में इस्तेमाल नहीं किया जा सकता है।

वे दो भिन्न और असंगत डेटा प्रकार हैं।

इसके बजाय, आप एक पैकेज में एक सहयोगी सरणी प्रकार बना सकते हैं और फिर मैन्युअल रूप से प्रत्येक मान को सहयोगी सरणी से एक संग्रह में निकाल सकते हैं जिसका उपयोग 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;
/

या, बेहतर है, एक सहयोगी सरणी से संग्रह में अनुवाद करने के लिए पैकेज में कुछ सामान्य रूप से नामित प्रकार और फ़ंक्शन बनाएं और फिर उन्हें अपनी प्रक्रियाओं में पुन:उपयोग करें:

एसक्यूएल फिडल

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. बैच फ़ाइल से SQL निष्पादित करें

  2. प्रत्येक पंक्ति में स्तंभ मान के आधार पर दोहराई जाने वाली पंक्तियाँ

  3. Oracle डेटाबेस में PL/SQL बल्क कलेक्ट का परिचय

  4. TRUNC(दिनांक) Oracle में समारोह

  5. विशिष्ट स्कीमा पर उपयोगकर्ता विशेषाधिकार कैसे प्रदान करें?