U lijkt enige verwarring te hebben over de verschillen tussen bindvariabelen in Oracle en substitutievariabelen in SQL*Plus.
Laten we beginnen met substitutievariabelen. Vervangingsvariabelen zijn uniek voor SQL*Plus en maken geen deel uit van de database. Ze werken niet als u ze bijvoorbeeld met JDBC probeert te gebruiken.
Substitutievariabelen kunnen alleen een stuk tekst bevatten. Als SQL*Plus een substitutievariabele tegenkomt in een invoerregel, zal het de variabele vervangen door zijn tekstinhoud:
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
Merk op dat SQL*Plus onze substitutievariabele heeft vervangen door zijn tekstwaarde, ongeacht of het ons geldige SQL gaf. In het bovenstaande voorbeeld hebben we de enkele aanhalingstekens rond &subvar
. weggelaten en het gaf ons ongeldige SQL, dus we kregen een foutmelding.
De regels die beginnen met old
en new
laat ons de regel zien die we hebben ingevoerd voor en nadat SQL*Plus de substitutievariabelen heeft toegepast. De new
regel is de regel die de database probeerde uit te voeren.
U kunt de weergave van de old
. in- of uitschakelen en new
regels met behulp van SET VERIFY ON
en SET VERIFY OFF
. U kunt de vervanging van vervangingsvariabelen ook in- of uitschakelen met SET DEFINE ON
en SET DEFINE OFF
.
Als we de bovenstaande query willen uitvoeren met behulp van de substitutievariabele, moeten we er aanhalingstekens omheen plaatsen:
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
Als &subvar
bevat toevallig een tekenreeks die een geldig nummer was (bijv. 5
), dan kunnen we wegkomen zonder de aanhalingstekens te gebruiken, maar dat is alleen omdat de tekst &subvar
wordt verwijderd en vervang het door de tekst 5
geeft ons toevallig een geldige SQL.
Stel dat we bijvoorbeeld een tabel hebben met de naam test
met de volgende gegevens erin:
A ---------- 1 2 3 4 5
Dan kunnen we doen
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
Bindvariabelen hebben daarentegen typen. Het zijn geen eenvoudige tekstwaarden. Hun waarden worden naar de database verzonden en de database kan ook hun waarden instellen.
SQL> variable bindvar varchar2(1); SQL> exec :bindvar := 'X'; PL/SQL procedure successfully completed.
U plaatst geen aanhalingstekens rond een bindvariabele wanneer u deze wilt gebruiken:
SQL> select * from dual where dummy = :bindvar; D - X SQL> select * from dual where dummy = ':bindvar'; no rows selected
In het tweede voorbeeld hierboven hebben we geen rijen geretourneerd omdat de DUAL
tabel heeft geen rijen met de DUMMY
kolom met de tekst :bindvar
.
U krijgt een foutmelding als u probeert een waarde van het verkeerde type toe te wijzen aan een bindvariabele:
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
Bindvariabelen zijn een standaard onderdeel van de database en u kunt ze gebruiken met JDBC of welke methode u ook kiest om verbinding te maken met de database.
Ten slotte, variable num1 number
en var num1 number
beide betekenen hetzelfde. Ze definiëren allebei een bindvariabele num1
van type number
. var
is slechts een afkorting voor variable
.