C# Retrieving Associative Arrays from PL/SQL Code

CREATE OR REPLACE PACKAGE ProductsPackage IS
  TYPE DecimalArray IS TABLE OF DECIMAL INDEX BY BINARY_INTEGER;
  TYPE StringArray IS TABLE OF VARCHAR2(255) INDEX BY BINARY_INTEGER;
  PROCEDURE proc_GetAllProductNames(ProdNames OUT StringArray);
END ProductsPackage;
 /
CREATE OR REPLACE PACKAGE BODY ProductsPackage IS
  PROCEDURE proc_GetAllProductNames(ProdNames OUT StringArray)
 IS
 BEGIN
    SELECT Name BULK COLLECT INTO ProdNames FROM Products;
 END;
END ProductsPackage;

/

private void btnGetAllProductNames(object sender, EventArgs e)
{
  String _connstring = "Data Source=localhost/NEWDB;User 
  Id=EDZEHOO;Password=PASS123;";
        try
        {
          OracleConnection _connObj = new OracleConnection(_connstring);
                _connObj.Open();
                OracleCommand _cmdObj = _connObj.CreateCommand();
                _cmdObj.CommandText = "ProductsPackage.proc_GetAllProductNames";
                _cmdObj.CommandType = CommandType.StoredProcedure;
 
    //Create an output parameter
                OracleParameter _NameParam = new OracleParameter();
                _NameParam.ParameterName = "ProdNames";
                _NameParam.OracleDbType = OracleDbType.Varchar2 ;
                _NameParam.Direction = ParameterDirection.Output;
                _NameParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
 //You must explicitly define the number of elements to return           
 _NameParam.Size = 10;
//Because you are retrieving an object with a variable size, you need to
//define the size of the string returned. This size must be specified for
//each element in the output result
 int[] intArray= new int[10];
 int _counter;
 for (_counter = 0; _counter < 10; _counter++) {intArray[_counter] = 255;}
 _NameParam.ArrayBindSize = intArray;
//Execute the stored procedure
 _cmdObj.Parameters.Add(_NameParam);
 _cmdObj.ExecuteNonQuery();
//For VARCHAR2 data types, an array of OracleString objects is returned
 String _result="";
 OracleString[] stringArray = (OracleString[])_NameParam.Value;
 for (_counter = 0; _counter <= stringArray.GetUpperBound(0); _counter++)
 {
     OracleString _outputString = stringArray[_counter];
     _result = _result + _outputString.Value + "\n";
 }
 MessageBox.Show("Product names are:\n" + _result);
 
 _connObj.Close();
 _connObj.Dispose();
 _connObj = null; }
  catch (Exception ex)
 {
  MessageBox.Show(ex.ToString());
 }
}

原文地址:https://www.cnblogs.com/kingwangzhen/p/1795116.html