使用来自C#的param输入变量数组调用Oracle存储过程

时间:2012-10-18 12:21:10

标签: c# oracle stored-procedures varray paramarray

我在Oracle中有一个存储过程,它接收类型varchar2变量数组的输入参数。该过程有效,如果从SQL调用它,我需要的是从C#调用。

我的脚本是这样的:

CREATE OR REPLACE PROCEDURE INTEGRATOR.PRC_TEST_PARAM_ARRAY  (p_nros_moviles integrator.NROMOVIL_ARRAY) IS
BEGIN
  FOR i IN 1..p_nros_moviles.count LOOP
    IF p_nros_moviles(i) IS NOT NULL THEN                               
      INSERT INTO INTEGRATOR.TEST_PARAM_ARRAY VALUES (p_nros_moviles(i));
    END IF;
  END LOOP;
END;
/

我的用户类型:

CREATE OR REPLACE TYPE INTEGRATOR.NROMOVIL_ARRAY AS
    VARYING ARRAY(100) OF VARCHAR2(15);
/

我从PLSQL调用

DECLARE
  v_array integrator.NROMOVIL_ARRAY;
BEGIN
  v_array := integrator.NROMOVIL_ARRAY('9999999', '66666666');

  integrator.prc_test_param_array(v_array);

END;

我从c#

尝试这种方式
try
{
    using (OracleConnection connection = new OracleConnection())
    {
        connection.ConnectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)" +
                                      "(HOST=10.10.10.10)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)" +
                                      "(SID=PORTANODE)));User Id=user;Password=*****;";

        using (OracleCommand cmd = new OracleCommand("INTEGRATOR.PRC_TEST_PARAM_ARRAY", connection))
        {
            cmd.CommandType = CommandType.StoredProcedure;

            OracleParameter p = new OracleParameter();
            p.ParameterName = "P_NROS_MOVILES";
            p.OracleDbType = OracleDbType.Array;
            p.Direction = ParameterDirection.Input;

            p.UdtTypeName = "INTEGRATOR.NROMOVIL_ARRAY";
            //p.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
            p.Value = new string[] { "XXXX", "YYYY" };
            cmd.Parameters.Add(p);


            connection.Open();

            cmd.ExecuteNonQuery();

            MessageBox.Show("Ejecutado");
        }
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

有人可以指导我,我需要改变以使其发挥作用

2 个答案:

答案 0 :(得分:0)

要有耐心,等等......这需要很长时间......这是我的经历

答案 1 :(得分:0)

我不确定,但我认为System.Data.OracleClient并不真正支持用户定义的数组。

我尝试编写一个帮助存储函数,例如以逗号分隔的字符串(这些将是varray类型的值),并使用WHILE LOOP和SUBSTR将其拆分为值。然后在每次迭代中,它使用EXTEND(1)将实际VARCHAR2添加到临时integrator.NROMOVIL_ARRAY类型变量,以便为新值添加位置。

最后,该函数返回临时integrator.NROMOVIL_ARRAY,该值可以在存储过程中使用。