Câu lệnh TCL trong PL / SQL là gì?
TCL là viết tắt của Giao dịch Kiểm soát Tuyên bố. Nó sẽ lưu các giao dịch đang chờ xử lý hoặc khôi phục giao dịch đang chờ xử lý. Các câu lệnh này đóng vai trò quan trọng bởi vì trừ khi giao dịch được lưu, các thay đổi thông qua các câu lệnh DML sẽ không được lưu trong cơ sở dữ liệu. Dưới đây là các câu lệnh TCL khác nhau.
CAM KẾT | Lưu tất cả giao dịch đang chờ xử lý |
ROLLBACK | Hủy tất cả giao dịch đang chờ xử lý |
SAVEPOINT | Tạo một điểm trong giao dịch cho đến khi việc hoàn tiền có thể được thực hiện sau |
QUAY LẠI ĐẾN | Hủy tất cả giao dịch đang chờ xử lý cho đến khi <điểm lưu> được chỉ định |
Giao dịch sẽ hoàn tất theo các tình huống sau.
- Khi bất kỳ tuyên bố nào ở trên được ban hành (ngoại trừ SAVEPOINT)
- Khi các câu lệnh DDL được phát hành. (DDL là các câu lệnh cam kết tự động)
- KHI các tuyên bố DCL được phát hành. (DCL là các câu lệnh cam kết tự động)
Giao dịch tự trị là gì
Trong PL / SQL, tất cả các sửa đổi được thực hiện trên dữ liệu sẽ được gọi là một giao dịch. Một giao dịch được coi là hoàn tất khi lưu / hủy được áp dụng cho nó. Nếu không có lưu / hủy nào được đưa ra, thì giao dịch sẽ không được coi là hoàn tất và các sửa đổi được thực hiện trên dữ liệu sẽ không được thực hiện vĩnh viễn trên máy chủ.
Bất kể một số sửa đổi được thực hiện trong một phiên, PL / SQL sẽ coi toàn bộ sửa đổi là một giao dịch duy nhất và việc lưu / hủy giao dịch này ảnh hưởng đến toàn bộ các thay đổi đang chờ xử lý trong phiên đó. Giao dịch tự động cung cấp một chức năng cho nhà phát triển, trong đó nó cho phép thực hiện các thay đổi trong một giao dịch riêng biệt và lưu / hủy giao dịch cụ thể đó mà không ảnh hưởng đến giao dịch phiên chính.
- Giao dịch tự trị này có thể được chỉ định ở cấp chương trình con.
- Để làm cho bất kỳ chương trình con nào hoạt động trong một giao dịch khác, từ khóa 'PRAGMA AUTONOMOUS_TRANSATION' phải được đưa ra trong phần khai báo của khối đó.
- Nó sẽ hướng dẫn trình biên dịch đó coi đây là giao dịch riêng biệt và việc lưu / hủy bên trong khối này sẽ không phản ánh trong giao dịch chính.
- Việc phát hành COMMIT hoặc ROLLBACK là bắt buộc trước khi chuyển từ giao dịch tự trị này sang giao dịch chính vì bất kỳ lúc nào cũng chỉ có một giao dịch có thể hoạt động.
- Vì vậy, khi chúng tôi đã thực hiện một giao dịch tự trị, chúng tôi cần phải lưu nó và hoàn thành giao dịch, sau đó chỉ chúng tôi mới có thể quay lại giao dịch chính.
Cú pháp:
DECLAREPRAGMA AUTONOMOUS_TRANSACTION;.BEGIN[COMMIT|ROLLBACK]END;/
- Trong cú pháp trên, khối đã được thực hiện như một giao dịch tự trị.
Ví dụ 1 : Trong ví dụ này, chúng ta sẽ hiểu cách giao dịch tự quản hoạt động.
DECLAREl_salary NUMBER;PROCEDURE nested_block ISPRAGMA autonomous_transaction;BEGINUPDATE empSET salary = salary + 15000WHERE emp_no = 1002;COMMIT;END;BEGINSELECT salary INTO l_salary FROM emp WHERE emp_no = 1001;dbms_output.put_line('Before Salary of 1001 is'|| l_salary);SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;dbms_output.put_line('Before Salary of 1002 is'|| l_salary);UPDATE empSET salary = salary + 5000WHERE emp_no = 1001;nested_block;ROLLBACK;SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001;dbms_output.put_line('After Salary of 1001 is'|| l_salary);SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;dbms_output.put_line('After Salary of 1002 is '|| l_salary);end;
Đầu ra
Before:Salary of 1001 is 15000Before:Salary of 1002 is 10000After:Salary of 1001 is 15000After:Salary of 1002 is 25000
Giải thích mã:
- Dòng mã 2 : Khai báo l_salary là NUMBER.
- Dòng mã 3 : Khai báo thủ tục nested_block
- Dòng mã 4 : Làm thủ tục lồng nhau_block dưới dạng 'AUTONOMOUS_TRANSACTION'.
- Dòng mã 7-9: Tăng lương cho nhân viên số 1002 thêm 15000.
- Dòng mã 10: Đang thực hiện giao dịch.
- Dòng mã 13-16: In chi tiết lương của nhân viên 1001 và 1002 trước khi thay đổi.
- Dòng mã 17-19: Tăng 5000 nhân viên số 1001 lên 5000.
- Dòng mã 20: Gọi thủ tục lồng nhau;
- Dòng mã 21: Hủy giao dịch chính.
- Dòng mã 22-25: In chi tiết lương của nhân viên 1001 và 1002 sau khi thay đổi.
- Việc tăng lương cho nhân viên số 1001 không được phản ánh vì giao dịch chính đã bị hủy. Việc tăng lương cho nhân viên số 1002 được phản ánh vì khối đó đã được thực hiện như một giao dịch riêng biệt và được lưu vào cuối.
- Vì vậy, bất kể lưu / hủy tại giao dịch chính, các thay đổi tại giao dịch tự động đã được lưu mà không ảnh hưởng đến các thay đổi của giao dịch chính.