2012-10-18 84 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

相關問題