ODP.NET如何将字符串数组传递给Oracle存储过程?

关于这个问题有很多问题和令人困惑的 文档 ,但到目前为止还没有运气。

我有以下PL / SQL存储过程;

PROCEDURE PS_test( Liste1 Listcar, Liste2 Listcar, P_CURS_MESSAGE out CURSOR_REF_TYP ) 

Listcar类型如下:

TYPE Listcar IS VARRAY(100)OF VARCHAR2(50);

这是我到目前为止所尝试的:

 string[] list = { "name1", "name1" }; OracleParameter oParam = (OracleParameter)myOracleCommand.CreateParameter(); oParam.ParameterName = "Liste1"; oParam.UdtTypeName = "LISTCAR"; oParam.Value = list; oParam.Direction = ParameterDirection.Input; myOracleCommand.Parameters.Add(oParam); 

在值赋值上出现以下错误:

 Value does not fall within the expected range. 

试图使用类型varchr2,设置ArrayBindSize等,但到目前为止没有运气。

我想界面IOracleArrayTypeFactory可能会在某个地方发挥作用,但是如何?

我没有在ODP.NET中使用udtTypefunction,所以我不确定如何实现这个目标。 但是,要传递一个字符串数组,您不需要它。

与您附加的文档一样,您需要创建一个包含存储过程的包,并将关联数组(不是VARRAY)作为输入参数。

例如:

 -- Create the table CREATE TABLE TBLTEST (testID NUMBER, name VARCHAR2(50)); CREATE SEQUENCE seq_test MINVALUE 1 START WITH 1 INCREMENT BY 1 NOCACHE; CREATE OR REPLACE PACKAGE pkgTestArrayBinding AS -- Define an local scope associative array type called T_ASSOCIATIVE_ARRAY and make it as the type of input parameter TYPE T_ASSOCIATIVE_ARRAY IS TABLE OF VARCHAR(50) INDEX BY PLS_INTEGER; PROCEDURE TestArrayBinding( Param1 IN T_ASSOCIATIVE_ARRAY, Param2 IN T_ASSOCIATIVE_ARRAY); END pkgTestArrayBinding; / CREATE OR REPLACE PACKAGE BODY pkgTestArrayBinding AS PROCEDURE TestArrayBinding( Param1 IN T_ASSOCIATIVE_ARRAY, Param2 IN T_ASSOCIATIVE_ARRAY) AS BEGIN -- for all loop to insert them in a batch FORALL indx IN 1..Param1.COUNT INSERT INTO tblTest VALUES(seq_test.nextval, Param1(indx)); FORALL indx IN 1..Param2.COUNT INSERT INTO tblTest VALUES(seq_test.nextval, Param2(indx)); END TestArrayBinding; END pkgTestArrayBinding; / 

现在,运行此代码,放置您自己的连接字符串。

 namespace Con1 { using System; using System.Data; using Oracle.DataAccess.Client; ///  /// The program. ///  internal class Program { #region Methods ///  /// The main. ///  private static void Main() { var con = new OracleConnection { ConnectionString = "User Id=usr;Password=pass;Data Source=XE" }; con.Open(); Console.WriteLine("Connected to Oracle" + con.ServerVersion); // create command to run your package var cmd = new OracleCommand("BEGIN pkgTestArrayBinding.TestArrayBinding(:Param1, :Param2); END;", con); var param1 = cmd.Parameters.Add("Param1", OracleDbType.Varchar2); var param2 = cmd.Parameters.Add("Param2", OracleDbType.Varchar2); param1.Direction = ParameterDirection.Input; param2.Direction = ParameterDirection.Input; // Specify that we are binding PL/SQL Associative Array param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray; param2.CollectionType = OracleCollectionType.PLSQLAssociativeArray; // Setup the values for PL/SQL Associative Array param1.Value = new[] { "First Element", "Second Element ", "Third Element_" }; param2.Value = new[] { "Fourth Element", "Fifth Element ", "Sixth Element " }; // Specify the maximum number of elements in the PL/SQL Associative Array // this should be your array size of your parameter Value. param1.Size = 3; param2.Size = 3; // Setup the ArrayBindSize for each elment in the array, // it should be bigger than the original length of element to avoid truncation param1.ArrayBindSize = new[] { 13, 14, 13 }; // Setup the ArrayBindSize for Param2 param2.ArrayBindSize = new[] { 20, 20, 20 }; // execute the cmd cmd.ExecuteNonQuery(); // I am lazy to query the database table here, but you should get you data now. // watch what happened to element "Third Element_" // Close and Dispose OracleConnection object con.Close(); con.Dispose(); Console.WriteLine("Disconnected"); } #endregion } }