0

varchar2我在 Oracle 中有一个存储过程,它接收可变数组类型的输入参数。该过程有效,如果您从 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);
}

有人可以指导我我需要进行更改才能使其正常工作

4

2 回答 2

0

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

于 2012-10-20T14:04:45.777 回答
0

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

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

最后函数返回临时积分器.NROMOVIL_ARRAY,这个值可以在存储过程中使用。

于 2012-10-23T09:31:46.557 回答