これは古い質問ですが、正しく対処されていないため、この問題が発生する可能性のある他の人のために回答しています。
デフォルトでは、OracleのODP.netは変数を位置ごとにバインドし、各位置を新しい変数として扱います。
furman87が述べたように、各コピーを異なる変数として扱い、その値を複数回設定することは回避策であり、苦痛であり、クエリを書き直して物事を動かそうとすると、バグにつながる可能性があります。
正しい方法は、次のようにOracleCommandのBindByNameプロパティをtrueに設定することです。
var cmd = new OracleCommand(cmdtxt, conn);
cmd.BindByName = true;
インスタンス化時にBindByNameをtrueに設定するOracleCommandをカプセル化する新しいクラスを作成することもできるため、毎回値を設定する必要はありません。これについては、この投稿で説明しています