sql >> Database >  >> RDS >> Oracle

Wat is het verschil tussen bindvariabelen en substitutievariabelen (die ik invoer met &&)?

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 .




  1. ORA-01658:kan INITIAL-extent niet maken voor segment in tabelruimte TS_DATA

  2. .NET Core 2.1 Identity krijgt alle gebruikers met hun bijbehorende rollen

  3. Hoe helpt databaseontwerp docenten, lessen en studenten te organiseren?

  4. Opgeslagen procedure die automatisch rijen verwijdert die ouder zijn dan 7 dagen in MYSQL