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

よくわかりませんが、 System.Data.OracleClient は実際にはユーザー定義の配列をサポートしていないと思います。

たとえば、カンマ区切りの文字列(これらは varray 型の値になります)を取り、WHILE LOOP と SUBSTR を使用して値に分割する、補助ストアド関数を作成しようとします。次に、反復ごとに、EXTEND(1) を使用して実際の VARCHAR2 を一時的な integrator.NROMOVIL_ARRAY 型変数に追加し、新しい値を格納します。

最後に、関数は一時的な integrator.NROMOVIL_ARRAY を返します。この値はストアド プロシージャで使用できます。

于 2012-10-23T09:31:46.557 に答える
0

我慢して、待って待って.. めちゃくちゃ長い時間がかかる.. それが私の経験です

于 2012-10-20T14:04:45.777 に答える