Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Qual é a diferença entre variáveis ​​de ligação e variáveis ​​de substituição (que eu insiro usando &&)?


Parece que você está confuso sobre as diferenças entre as variáveis ​​de vinculação no Oracle e variáveis ​​de substituição no SQL*Plus.

Vamos começar com variáveis ​​de substituição. As variáveis ​​de substituição são exclusivas do SQL*Plus e não fazem parte do banco de dados. Eles não funcionarão se você tentar usá-los com JDBC, por exemplo.

As variáveis ​​de substituição podem conter apenas um pedaço de texto. Se o SQL*Plus encontrar uma variável de substituição em uma linha de entrada, ele substituirá a variável por seu conteúdo 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

Observe que o SQL*Plus substituiu nossa variável de substituição por seu valor de texto sem levar em consideração se ela nos forneceu um SQL válido. No exemplo acima, omitimos as aspas simples em &subvar e isso nos deu SQL inválido, então recebemos um erro.

As linhas que começam com old e new mostre a linha que inserimos antes e depois que o SQL*Plus aplicou as variáveis ​​de substituição. O new line é a linha que o banco de dados tentou executar.

Você pode habilitar ou desabilitar a exibição do old e new linhas usando SET VERIFY ON e SET VERIFY OFF . Você também pode ativar ou desativar a substituição de variáveis ​​de substituição usando SET DEFINE ON e SET DEFINE OFF .

Se quisermos executar a consulta acima usando a variável de substituição, devemos colocar aspas em torno dela:
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

Se &subvar acontece de conter uma string que era um número válido (por exemplo, 5 ), então podemos fugir sem usar as aspas, mas isso é apenas porque tirar o texto &subvar e substituindo-o pelo texto 5 acontece para nos dar SQL válido.

Por exemplo, suponha que temos uma tabela chamada test com os seguintes dados nele:
         A
----------
         1
         2
         3
         4
         5

Então podemos fazer
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

As variáveis ​​de ligação, por outro lado, têm tipos. Eles não são valores de texto simples. Seus valores são enviados ao banco de dados e o banco de dados também pode definir seus valores.
SQL> variable bindvar varchar2(1);
SQL> exec :bindvar := 'X';

PL/SQL procedure successfully completed.

Você não coloca aspas em torno de uma variável de ligação quando deseja usá-la:
SQL> select * from dual where dummy = :bindvar;

D
-
X

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

no rows selected

No segundo exemplo acima, não obtivemos nenhuma linha retornada porque o DUAL a tabela não tem linhas com o DUMMY coluna contendo o texto :bindvar .

Você receberá um erro se tentar atribuir um valor do tipo errado a uma variável de ligação:
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

As variáveis ​​de ligação são uma parte padrão do banco de dados e você pode usá-las com JDBC ou qualquer método de conexão com o banco de dados escolhido.

Finalmente, variable num1 number e var num1 number ambos significam a mesma coisa. Ambos definem uma variável de ligação num1 do tipo number . var é apenas uma abreviação de variable .