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 .