Hãy xem xét đoạn mã này của C #:
int v_empno = 7369;
string v_ename;
OracleCommand cmd = con.CreateCommand();
cmd.Parameters.Add("paramEmpno", OracleDbType.Decimal, v_empno, ParameterDirection.Input);
cmd.CommandText = "select e.ename from scott.emp e where e.empno = :1";
v_ename = cmd.ExecuteScalar().ToString();
v_empno
và v_ename
là các biến máy chủ. Tại đây, bạn tạo rõ ràng biến liên kết của mình để sử dụng làm :1
trong tuyên bố của bạn.
Hãy xem xét đoạn mã PL / SQL này:
declare
v_empno number := 7369;
v_ename varchar2(10);
begin
select e.ename
into v_ename
from scott.emp e
where e.empno = v_empno;
dbms_output.put_line(v_ename);
end;
/
Một lần nữa các biến đã khai báo v_empno
và v_ename
có thể được coi là biến máy chủ, nhưng khi chúng được sử dụng trong SQL tĩnh trong mã PL / SQL, chúng sẽ tự động được chuyển thành biến ràng buộc bởi trình biên dịch / engine PL / SQL - bạn không phải tạo thủ công biến liên kết của mình như trong Ví dụ C #. Nếu bạn kiểm tra SQL thực sự được thực thi bởi đoạn PL / SQL này, nó sẽ trông giống như sau:
select e.ename
from scott.emp e
where e.empno = :B1
Đó là trình biên dịch PL / SQL đã tự động tạo :B1
biến ràng buộc cho v_empno
của bạn Biến PL / SQL. Và đó là những gì Tom Kyte có nghĩa là bạn không thể thực sự phân biệt chính xác giữa biến máy chủ và biến liên kết trong PL / SQL. Khi bạn viết PL / SQL, các biến là biến chủ khi được sử dụng trong mã PL / SQL và đồng thời chúng là biến ràng buộc khi được sử dụng trong mã SQL nhúng. Bạn không cần phải phân biệt trong PL / SQL, trình biên dịch sẽ lo việc đó cho bạn.