Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用Oracle存储过程,使参数输入从C变为数组#_C#_Oracle_Stored Procedures_Varray_Paramarray - Fatal编程技术网

C# 调用Oracle存储过程,使参数输入从C变为数组#

C# 调用Oracle存储过程,使参数输入从C变为数组#,c#,oracle,stored-procedures,varray,paramarray,C#,Oracle,Stored Procedures,Varray,Paramarray,我在Oracle中有一个存储过程,它接收类型为varchar2variang array的输入参数。这个过程可以工作,如果从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

我在Oracle中有一个存储过程,它接收类型为
varchar2
variang array的输入参数。这个过程可以工作,如果从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#


有人可以指导我,我需要改变才能让它发挥作用

耐心等待。。这需要很长时间。。这是我的经验

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

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


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

实际上,Microsoft驱动程序不支持param array,但我使用的是ODP,使用的是Oracle.DataAccess.Client;使用Oracle.DataAccess.Types;现在我已经解决了这个问题,调用了一个纯文本SQL命令,但我会按照CommandType.StoredProcedure执行
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);
}