2011-10-16 16 views
6

Bu iki değişken bildirim arasındaki fark nedir?Bağlantı değişkenleri ile && ile girdiğim değişken arasındaki fark nedir?

1: variable num1 number;

her iki durumda da bir, diğer dosyalarda &num veya &&num kullanarak ve bağlama değişkenleri :num1 durumunda num referans beri:
.

Ayrıca bir karışıklık daha var: Aşağıdaki ifadelerden herhangi biri bir şekilde farklılık gösteriyor mu, ikisi de geçerli mi ve aynı şeyi mi kastediyorlar?

1: variable num1 number;
2: var num1 number;

cevap

29

SQL * Plus Oracle'da bağlama değişkenleri ve ikame değişkenler arasındaki farklar hakkında bazı karışıklık var görünüyor.

Değiştirme değişkenleriyle başlayalım. İkame değişkenleri SQL * Plus'a özgüdür ve veritabanının bir parçası değildir. Örneğin, bunları JDBC ile kullanmaya çalışırsanız çalışmazlar.

Yerine koyma değişkenleri yalnızca bir metin parçası tutabilir. SQL * Plus, girişlerin bir satırında bir ikame değişken karşılaşırsa, onun metin içeriğiyle değişkeni yerini alacak: SQL * Plus, bunun olmadığını hiç dikkate almadan kendi metin değeri ile bizim ikame değişken yerini o

 
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 

Not

Bize geçerli bir SQL verdi. Yukarıdaki örnekte, &subvar arasındaki tek tırnakları çıkardık ve bize geçersiz SQL verdi, bu yüzden bir hata oluştu.

old ve new başlangıç ​​çizgileri, SQL * Plus'ın değiştirme değişkenlerini uyguladıktan önce ve sonra girdiğimiz satırı gösterir. new satırı, veritabanının çalışmaya çalıştığı çizgi.

ve new satırlarının görüntüsünü SET VERIFY ON ve SET VERIFY OFF kullanarak etkinleştirebilir veya devre dışı bırakabilirsiniz. Ayrıca, SET DEFINE ON ve SET DEFINE OFF kullanarak ikame değişkenlerinin değiştirilmesini açabilir veya kapatabilirsiniz. biz ikame değişken kullanarak yukarıdaki sorguyu çalıştırmak istiyorsanız

, bunu tırnak koymak gerekir:

 
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 

&subvar geçerli bir sayı olan bir dize içeren olursa (mesela 5), o zaman tırnak işaretleri kullanmadan uzaklaşabilir, ancak bu sadece &subvar metnini çıkarmak ve onu 5 metinle değiştirmemizin bize geçerli SQL vermesi nedeniyle gerçekleşir.

Örneğin, biz de şu verilerle test denilen bir tablo olduğunu varsayalım:

 
     A 
---------- 
     1 
     2 
     3 
     4 
     5 

Sonra diğer taraftan, türlerine sahip,

 
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 

Bind değişkenleri yapabilirsiniz. Basit metin değerleri değildirler. Değerleri veritabanına gönderilir ve veritabanı da değerlerini belirleyebilir.

 
SQL> variable bindvar varchar2(1); 
SQL> exec :bindvar := 'X'; 

PL/SQL procedure successfully completed. 

Bunu kullanmak istediğinizde bir bağlama değişkeni tırnak koymak yoktur:

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

D 
- 
X 

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

no rows selected 

İkinci örnekte yukarıdaki, biz DUAL tablo ile hiçbir satır var çünkü hiçbir satır döndürdü var :bindvar numaralı metni içeren DUMMY sütun.

bir bağlama değişkene yanlış türde bir değer atamak denerseniz bir hata alırsınız:

 
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 

Bind değişkenleri veritabanının standart bir parçası vardır ve JDBC ile kullanabilirsiniz ya da seçtiğiniz veritabanına bağlanma yöntemi.


Son olarak variable num1 number ve var num1 number ikisi de aynı anlama geliyor. Her ikisi de num1 number türünde bir bağlama değişkeni tanımlar. var sadece variable için bir kısaltmadır.