2009-09-14 31 views
31

Esta es la primera vez que trato con Oracle, y me está costando entender por qué estoy recibiendo este error.Oracle "ORA-01008: no todas las variables vinculadas" Error con los parámetros

estoy usando ODT.NET de Oracle w/C# con el código siguiente en la cláusula de una consulta donde:

WHERE table.Variable1 = :VarA 
    AND (:VarB IS NULL OR table.Variable2 LIKE '%' || :VarB || '%') 
    AND (:VarC IS NULL OR table.Variable3 LIKE :VarC || '%') 

y estoy añadiendo los valores de los parámetros de este modo:

cmd.Parameters.Add("VarA", "24"); 
cmd.Parameters.Add("VarB", "test"); 
cmd.Parameters.Add("VarC", "1234"); 

cuando ejecuto esta consulta, el servidor devuelve:

ORA-01008: not all variables bound 

Si comento hacia fuera, ya sea de la 'Y (....' líneas, el borrador de consulta letes con éxito.

¿Por qué la consulta se ejecutará correctamente si solo estoy consultando con dos parámetros, pero no con tres? El error que estoy recibiendo ni siquiera tiene sentido

+0

¿Es capaz de utilizar DBMS_OUTPUT para imprimir la instrucción SQL antes de ser ejecutado? –

Respuesta

42

El proveedor ODP.Net de Oracle utiliza el enlace por posición como valor predeterminado. Para cambiar el comportamiento para enlazar por nombre. Establezca la propiedad BindByName en verdadero. Entonces puede descartar la doble definición de parámetros.

using(OracleCommand cmd = con.CreateCommand()) { 
    ... 
    cmd.BindByName = true; 
    ... 
} 
+0

que tiene más sentido ... Reorganicé los parámetros ayer y me di cuenta de que era vinculante por la posición de la variable y no por el nombre (que no era bueno); no me di cuenta que había una opción para cambiar eso – John

+0

¡Esto es bueno Christian13467! No sabía que, por lo tanto, mi experiencia con el .Net Oracle Data Provider nativo de 8i a 10g. Gracias por esta respuesta. –

+1

Excelente solución. Mucho mejor que duplicar los parámetros. @John - realmente deberías considerar aceptar esta respuesta, si es posible, más de 13,000 personas ya han visto tu pregunta, deberían haber visto la mejor opción primero.(Lo siento Tony) – Kobi

23

Parece tonto, pero creo que cuando se utiliza la misma variable se unen dos veces usted tiene que fijar dos veces:

cmd.Parameters.Add("VarA", "24"); 
cmd.Parameters.Add("VarB", "test"); 
cmd.Parameters.Add("VarB", "test"); 
cmd.Parameters.Add("VarC", "1234"); 
cmd.Parameters.Add("VarC", "1234"); 

Ciertamente eso es cierto con Nativo SQL dinámico en PL/SQL:

SQL> begin 
    2  execute immediate 'select * from emp where ename=:name and ename=:name' 
    3  using 'KING'; 
    4 end; 
    5/
begin 
* 
ERROR at line 1: 
ORA-01008: not all variables bound 


SQL> begin 
    2  execute immediate 'select * from emp where ename=:name and ename=:name' 
    3  using 'KING', 'KING'; 
    4 end; 
    5/

PL/SQL procedure successfully completed. 
+0

Eso funcionó ... no puedo creer que actuaría en esa mansión, pero funcionó, ¡así que lo tomaré! ¡Gracias! – John

+1

No solo tienen que especificarse varias veces, sino que deben agregarse en el orden en que aparecen en la consulta. –

+0

No me refiero a utilizar una publicación muy antigua ... pero ¿alguien sabe si esto (tener que agregar parámetros varias veces si se usa varias veces) sigue siendo el caso? Estoy lidiando con un extraño escenario donde algo funciona localmente para mí, pero falló cuando lo ejecutó un usuario en Producción. Retiró el cambio por el momento, pero de alguna manera perdió por qué el error '01008' solo apareció para el usuario. –

2

También puede considerar la eliminación de la necesidad de que los nombres de parámetros duplicados en su SQL cambiando SQL para

table.Variable2 LIKE '%' || :VarB || '%' 

y luego conseguir su cliente para proporcionar '%' para cualquier valor de varB en lugar de nulo. De alguna manera, creo que esto es más natural.

También podría cambiar el SQL para

table.Variable2 LIKE '%' || IfNull(:VarB, '%') || '%' 
Cuestiones relacionadas