sql >> Base de Datos >  >> RDS >> Oracle

¿Cuál es la diferencia entre las variables de vinculación y las variables de sustitución (que ingreso usando &&)?

Parece que tiene cierta confusión acerca de las diferencias entre las variables de vinculación en Oracle y variables de sustitución en SQL*Plus.

Comencemos con las variables de sustitución. Las variables de sustitución son exclusivas de SQL*Plus y no forman parte de la base de datos. No funcionarán si intenta usarlos con JDBC, por ejemplo.

Las variables de sustitución solo pueden contener un fragmento de texto. Si SQL*Plus encuentra una variable de sustitución en una línea de entrada, reemplazará la variable con su contenido de texto:

SQL> define subvar=X
SQL> select * from dual where dummy = &subvar;
old   1: select * from dual where dummy = &subvar
new   1: select * from dual where dummy = X
select * from dual where dummy = X
                                 *
ERROR at line 1:
ORA-00904: "X": invalid identifier

Tenga en cuenta que SQL*Plus reemplazó nuestra variable de sustitución con su valor de texto sin tener en cuenta si nos dio un SQL válido. En el ejemplo anterior, omitimos las comillas simples alrededor de &subvar y nos dio un SQL no válido, por lo que obtuvimos un error.

Las líneas que comienzan con old y new muéstrenos la línea que ingresamos antes y después de que SQL*Plus aplicó las variables de sustitución. El new línea es la línea que la base de datos intentó ejecutar.

Puede habilitar o deshabilitar la visualización del old y new líneas usando SET VERIFY ON y SET VERIFY OFF . También puede activar o desactivar el reemplazo de variables de sustitución usando SET DEFINE ON y SET DEFINE OFF .

Si queremos ejecutar la consulta anterior usando la variable de sustitución, debemos ponerla entre comillas:

SQL> select * from dual where dummy = '&subvar';
old   1: select * from dual where dummy = '&subvar'
new   1: select * from dual where dummy = 'X'

D
-
X

Si &subvar sucede que contiene una cadena que era un número válido (por ejemplo, 5 ), entonces podemos escapar sin usar las comillas, pero eso es solo porque quitamos el texto &subvar y reemplazándolo con el texto 5 pasa a darnos un SQL válido.

Por ejemplo, supongamos que tenemos una tabla llamada test con los siguientes datos:

         A
----------
         1
         2
         3
         4
         5

Entonces podemos hacer

SQL> define subvar=5
SQL> select * from test where a = &subvar;
old   1: select * from test where a = &subvar
new   1: select * from test where a = 5

         A
----------
         5

Las variables de enlace, por otro lado, tienen tipos. No son simples valores de texto. Sus valores se envían a la base de datos y la base de datos también puede establecer sus valores.

SQL> variable bindvar varchar2(1);
SQL> exec :bindvar := 'X';

PL/SQL procedure successfully completed.

No pones comillas alrededor de una variable de vinculación cuando quieres usarla:

SQL> select * from dual where dummy = :bindvar;

D
-
X

SQL> select * from dual where dummy = ':bindvar';

no rows selected

En el segundo ejemplo anterior, no obtuvimos filas devueltas porque DUAL la tabla no tiene filas con el DUMMY columna que contiene el texto :bindvar .

Obtendrá un error si intenta asignar un valor del tipo incorrecto a una variable de vinculación:

SQL> variable bindvar number;
SQL> exec :bindvar := 'X';
BEGIN :bindvar := 'X'; END;

*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 1

Las variables de vinculación son una parte estándar de la base de datos y puede usarlas con JDBC o cualquier método de conexión a la base de datos que elija.

Finalmente, variable num1 number y var num1 number ambos significan lo mismo. Ambos definen una variable de vinculación num1 de tipo number . var es solo una abreviatura de variable .