Eu sei que esta é uma pergunta antiga, mas não foi abordada corretamente, por isso estou respondendo a outras pessoas que possam encontrar esse problema.
Por padrão, o ODP.net da Oracle vincula variáveis por posição e trata cada posição como uma nova variável.
Tratar cada cópia como uma variável diferente e definir seu valor várias vezes é uma solução alternativa e uma dor, como furman87 mencionou, e pode levar a erros, se você estiver tentando reescrever a consulta e mover as coisas.
A maneira correta é definir a propriedade BindByName do OracleCommand como true conforme abaixo:
var cmd = new OracleCommand(cmdtxt, conn);
cmd.BindByName = true;
Você também pode criar uma nova classe para encapsular o OracleCommand definindo o BindByName como true na instanciação, para que você não precise definir o valor todas as vezes. Isso é discutido neste post