Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sự khác biệt giữa biến ràng buộc và biến thay thế (mà tôi nhập bằng cách sử dụng &&) là gì?

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 oldnew 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ị oldnew các dòng sử dụng SET VERIFY ONSET 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 ONSET 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 .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Số Oracle thành số thập phân C #

  2. dbms_output.put_line

  3. Sử dụng dung lượng cao từ crfclust.bdb

  4. Buộc sử dụng chỉ mục trong Oracle

  5. Sử dụng chuỗi chứa hàm trong truy vấn SQL oracle