2011-10-16 37 views
6

Sự khác biệt giữa hai khai báo biến này là gì?Sự khác nhau giữa các biến liên kết và biến mà tôi nhập bằng && là gì?

1: num number:='&&num';
2: variable num1 number;

Vì trong cả hai trường hợp tôi có thể tham khảo num bằng cách sử dụng &num hoặc &&num vào các file khác cũng có, và trong trường hợp của các biến ràng buộc :num1.

Hơn nữa, tôi có thêm một sự nhầm lẫn: cho dù bất kỳ câu nào dưới đây khác nhau, chúng đều hợp lệ và chúng có nghĩa là giống nhau không?

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

Trả lời

29

Dường như bạn có một số nhầm lẫn về sự khác biệt giữa biến ràng buộc trong Oracle và biến thay thế trong SQL * Plus.

Hãy bắt đầu với các biến thay thế. Các biến thay thế là duy nhất đối với SQL * Plus và không phải là một phần của cơ sở dữ liệu. Chúng sẽ không hoạt động nếu bạn cố gắng sử dụng chúng với JDBC, ví dụ.

Biến thay thế chỉ có thể chứa một đoạn văn bản. Nếu SQL * Plus gặp một biến thay thế trong một dòng đầu vào, nó sẽ thay thế các biến với nội dung văn bản của nó:

 
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 

Lưu ý rằng SQL * Plus thay thế biến thay thế của chúng tôi với giá trị văn bản của nó không có liên quan cho dù đó đã cho chúng tôi SQL hợp lệ. Trong ví dụ trên, chúng tôi bỏ qua các dấu nháy đơn xung quanh &subvar và nó đã cho chúng tôi SQL không hợp lệ, vì vậy chúng tôi đã gặp lỗi.

Các dòng bắt đầu oldnew hiển thị cho chúng tôi dòng mà chúng tôi đã nhập trước và sau khi SQL * Plus áp dụng các biến thay thế. Dòng new là dòng mà cơ sở dữ liệu đã cố gắng chạy.

Bạn có thể bật hoặc tắt hiển thị các đường dây oldnew bằng cách sử dụng SET VERIFY ONSET VERIFY OFF. Bạn cũng có thể bật hoặc tắt thay thế biến thay thế bằng cách sử dụng SET DEFINE ONSET DEFINE OFF.

Nếu chúng ta muốn chạy các truy vấn trên bằng cách sử dụng biến thay thế, chúng ta phải đặt dấu ngoặc kép xung quanh nó:

 
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 

Nếu &subvar xảy ra để chứa một chuỗi đó là một số hợp lệ (ví dụ 5), sau đó chúng tôi có thể lấy đi mà không sử dụng dấu ngoặc kép, nhưng đó chỉ là vì lấy ra văn bản &subvar và thay thế nó bằng văn bản 5 xảy ra để cung cấp cho chúng tôi SQL hợp lệ.

Ví dụ, giả sử chúng ta có một bảng gọi là test với các dữ liệu sau đây trong nó:

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

Sau đó, chúng ta có thể làm

 
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 

biến Bind, mặt khác, có các loại. Chúng không phải là giá trị văn bản đơn giản. Giá trị của chúng được gửi đến cơ sở dữ liệu và cơ sở dữ liệu cũng có thể đặt giá trị của chúng.

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

PL/SQL procedure successfully completed. 

Bạn không đặt dấu ngoặc kép quanh một biến ràng buộc khi bạn muốn sử dụng nó:

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

D 
- 
X 

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

no rows selected 

Trong ví dụ thứ hai ở trên, chúng tôi đã nhận không có hàng trả lại vì bảng DUAL không có hàng với cột DUMMY chứa văn bản :bindvar.

Bạn sẽ nhận được một lỗi nếu bạn cố gắng gán một giá trị của các loại sai lầm khi một biến ràng buộc:

 
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 

biến Bind là một phần tiêu chuẩn của cơ sở dữ liệu, và bạn có thể sử dụng chúng với JDBC hoặc bất kỳ phương pháp nào kết nối với cơ sở dữ liệu bạn chọn.


Cuối cùng, variable num1 numbervar num1 number cả hai đều có cùng ý nghĩa. Cả hai đều xác định biến liên kết num1 loại number. var chỉ là viết tắt của variable.

Các vấn đề liên quan