So che questa è una vecchia domanda, ma non è stata affrontata correttamente, quindi rispondo per altri che potrebbero incontrare questo problema.
Per impostazione predefinita, ODP.net di Oracle lega le variabili per posizione e tratta ogni posizione come una nuova variabile.
Trattare ogni copia come una variabile diversa e impostarne il valore più volte è una soluzione alternativa e un problema, come menzionato da furman87, e potrebbe portare a bug, se stai cercando di riscrivere la query e spostare le cose.
Il modo corretto consiste nell'impostare la proprietà BindByName di OracleCommand su true come di seguito:
var cmd = new OracleCommand(cmdtxt, conn);
cmd.BindByName = true;
Puoi anche creare una nuova classe per incapsulare OracleCommand impostando BindByName su true nell'istanza, quindi non devi impostare il valore ogni volta. Questo è discusso in questo post