2012-10-18 86 views
0

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

我的脚本是这样的:

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); 
} 
这样

有人能指导我,我需要改变,使其工作

回答

0

耐心等待,等待,等待..它需要长时间的地狱..这是我的经验

0

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

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

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

+0

确实Microsoft驱动程序不支持参数阵列,但我使用ODP 使用Oracle.DataAccess.Client;使用Oracle.DataAccess.Types的 ; 现在我已经解决了这个问题,调用纯文本SQL命令,但我会像CommandType.StoredProcedure – ronpy

相关问题