Oracle
 sql >> Base de données >  >> RDS >> Oracle

La valeur de liaison de tableau Oracle.DataAccess (ODP.NET) ne se situe pas dans la plage attendue

Je pense que vous essayez de fusionner un Array Bind {simplement lier un tableau à un paramètre pour qu'il s'exécute plusieurs fois - c'est ainsi que l'exemple dans le lien que vous avez fourni l'a fait} avec un tableau associatif {re :PLSQLAssociativeArray avec un paramètre INPUT de TABLE OF}.

Puisque vous n'avez pas posté votre package/proc que vous exécutez, je suppose que vous faites quelque chose comme ça (il suffit de le mettre pour valider l'hypothèse)

procedure insertdata(P_JOB_TITLE IN VARCHAR2) as
begin
insert into myTable(x) value (P_JOB_TITLE);
end  insertdata;

Pour exécuter ceci comme l'auteur de l'article, vous devez utiliser ArrayBindCount ( consultez ce lien, il a aussi un exemple) .Cela indique également que si vous avez plusieurs paramètres, il attendra un ARRAY pour chacun.

Maintenant, pour que cela soit exécuté pour tous les P_JOB_TITLE() que vous transmettez

//this was missing in your example and MUST be there to tell ODP how many array elements to expect
cmd.ArrayBindCount = 2;

 string[] jobTitleArray = {"name1", "name1"};

OracleParameter paramNames= new OracleParameter("P_JOB_TITLE", OracleDbType.Varchar2);

   //paramNames.CollectionType = OracleCollectionType.PLSQLAssociativeArray;/*once again, you are passing in an array of values to be executed and not a pl-sql table*/

    //paramNames.Size = 2; /* this is unnecessary since it is for a plsql-associative array*/
    paramNames.Value =  jobTitleArray ;
    cmd.Parameters.Add(paramNames);

Pour un exemple plSQLAssociativeArray, consultez les exemples fournis lors de l'installation d'ODP @ %ORA_HOME%\odp.net\samples\2.x\AssocArray

et pour les exemples de liaison de tableau (à partir du lien que vous avez fourni) @ %ORA_HOME%\odp.net\samples\2.x\ArrayBind