Je sais que c'est une vieille question, mais elle n'a pas été correctement traitée, donc j'y réponds pour les autres qui pourraient rencontrer ce problème.
Par défaut, ODP.net d'Oracle lie les variables par position et traite chaque position comme une nouvelle variable.
Traiter chaque copie comme une variable différente et définir sa valeur plusieurs fois est une solution de contournement et une douleur, comme furman87 l'a mentionné, et peut entraîner des bogues, si vous essayez de réécrire la requête et de déplacer les choses.
La méthode correcte consiste à définir la propriété BindByName d'OracleCommand sur true comme ci-dessous :
var cmd = new OracleCommand(cmdtxt, conn);
cmd.BindByName = true;
Vous pouvez également créer une nouvelle classe pour encapsuler OracleCommand en définissant BindByName sur true lors de l'instanciation, de sorte que vous n'ayez pas à définir la valeur à chaque fois. Ceci est discuté dans ce post