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
.