Dường như bạn có chút 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 cho SQL * Plus và không phải là một phần của cơ sở dữ liệu. Chẳng hạn, chúng sẽ không hoạt động nếu bạn cố sử dụng chúng với JDBC.
Các 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ế biến đó bằng 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 bằng giá trị văn bản của nó mà không quan tâm đến việc liệu nó có cung cấp cho chúng tôi SQL hợp lệ hay không. Trong ví dụ trên, chúng tôi đã bỏ qua các dấu ngoặc kép xung quanh &subvar
và nó cung cấp 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 old
và new
hiển thị cho chúng tôi dòng chúng tôi đã nhập trước và sau khi SQL * Plus áp dụng các biến thay thế. new
dòng 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ị old
và new
các dòng sử dụng SET VERIFY ON
và SET VERIFY OFF
. Bạn cũng có thể bật hoặc tắt thay thế các biến thay thế bằng cách sử dụng SET DEFINE ON
và SET DEFINE OFF
.
Nếu chúng ta muốn chạy 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
If &subvar
tình cờ chứa một chuỗi là một số hợp lệ (ví dụ:5
), sau đó chúng ta có thể thoát ra mà không cần 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
tình cờ cung cấp cho chúng tôi SQL hợp lệ.
Ví dụ:giả sử chúng ta có một bảng được gọi là test
với dữ liệu sau:
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
Mặt khác, các biến ràng buộc có các kiểu. 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 xung 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 không có hàng nào được trả về vì DUAL
bảng không có hàng nào có DUMMY
cột chứa văn bản :bindvar
.
Bạn sẽ gặp lỗi nếu bạn cố gắng chỉ định một giá trị không đúng loại cho một biến liên kết:
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 ràng buộc 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 kết nối nào với cơ sở dữ liệu bạn chọn.
Cuối cùng, variable num1 number
và số var num1 number
cả hai đều có nghĩa giống nhau. Cả hai đều xác định một biến liên kết num1
thuộc loại number
. var
chỉ là chữ viết tắt của variable
.