Frage

Ich bin versucht, ein Verfahren zu nennen, die einen benutzerdefinierten Datentyp table of numbers als einer der Parameter verwendet.

Hier ist die Definition des Typs:

create type num_list as table of number;

Und die Definition des Verfahrens:

create or replace procedure my_procedure
    (listofnumbers num_list,
                  v_value char)
is
begin

  update my_table
     set my_column = v_value
   where my_row_id in (select column_value
                         from table(listofnumbers));

end;

Mit ODP.NET und C #, ich bin erklärt es wie folgt:

var row_ids = new int[] { 1, 2 };

using (var oracleConn = new Oracle.DataAccess.Client.OracleConnection(myConnectionString))
{
    oracleConn.Open();
    var cmd = new Oracle.DataAccess.Client.OracleCommand("my_procedure", oracleConn);
    cmd.CommandType = CommandType.StoredProcedure;

    var param1 = new Oracle.DataAccess.Client.OracleParameter("listofnumbers", Oracle.DataAccess.Client.OracleDbType.Array, ParameterDirection.Input);
    param1.CollectionType = Oracle.DataAccess.Client.OracleCollectionType.PLSQLAssociativeArray;
    param1.UdtTypeName = "num_list";
    param1.Value = row_ids;
    cmd.Parameters.Add(param1);

    var param2 = new Oracle.DataAccess.Client.OracleParameter("v_value ", Oracle.DataAccess.Client.OracleDbType.Char, ParameterDirection.Input);
    param2.Value = "Y";
    cmd.Parameters.Add(param2);

    cmd.ExecuteNonQuery();
}

Die Ausnahmezustände geworfen werden:

  

Ungültige Parameterbindung Parameter   Name: listofnumbers

Was Eigenschaften bin ich dabei die Parameter bei der Definition?

War es hilfreich?

Lösung

EDIT: 14. Mai

Als meine Antwort nicht akzeptiert hätte, hier ist ein Link, der von Nutzen sein kann:

http://developergeeks.com/article/35/working-with-user-defined-type-oracle-udt-and-custom-type-using-odp-net-11g


Leider kann ich nicht mit diesem spielen, um wie ich x64 ODP.NET den UDT nicht unterstützt.

Doch wie Ihr UDT ist eine Sammlung haben sie versucht, die Eigenschaft Größe Einstellung auf param1?

param1.Size = row_ids.Length;

Nun ist es kein UDT, aber hier ist ein Code-Schnipsel, wie ich auf einen Typen band in einer Paket-Spezifikation definiert als:

TYPE t_stringlist IS TABLE OF VARCHAR2(4000);

            string[] values = new string[] { "AAA", "BBB" };

            OracleParameter parameter = new OracleParameter();
            parameter.Name = "my_param";
            parameter.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
            parameter.OracleDbType = OracleDbType.Varchar2;
            parameter.ArrayBindSize = new int[values.Length];
            parameter.ArrayBindStatus = new OracleParameterStatus[values.Length];
            parameter.Size = values.Length;

            for (int i = 0; i < values.Length; ++i)
            {
                parameter.ArrayBindSize[i] = 4000;
                parameter.ArrayBindStatus[i] = OracleParameterStatus.Success;
            }

            parameter.Value = values;

Ich bin nicht sicher, welche Werte Sie setzen könnten ArrayBindSize zu.

Auch Sie sollten erwägen eine Art Fabrik für Ihre UDT zu erstellen:

http://download.oracle.com/docs/html/E15167_01/ featUDTs.htm

Wie auch immer, ich hoffe, dass Sie hier etwas finden, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top