Nâng caoOracle PL/SQL ~18 phút

Stored Procedure trên Oracle

Stored procedure là chương trình PL/SQL có tên, được biên dịch và lưu trong schema Oracle để nhiều ứng dụng có thể gọi lại.

Lý thuyết

Stored procedure là gì?

Procedure gom nhiều lệnh SQL và logic PL/SQL thành một đơn vị có tên. Oracle biên dịch nó khi tạo và lưu metadata/mã đã biên dịch trong schema.

Cú pháp khung: CREATE OR REPLACE PROCEDURE ten (...) AS BEGIN ... END; /.

Dấu / không thuộc PL/SQL; đó là lệnh của SQL*Plus, SQLcl hoặc SQL Developer để gửi block vừa nhập sang Oracle.

Cấu trúc một procedure

  • Header: tên procedure và danh sách tham số.
  • Declaration (sau AS/IS): biến, constant, cursor — phần này có thể rỗng.
  • Executable section (BEGIN ... END): nơi chạy IF, UPDATE, SELECT INTO...
  • Exception section (EXCEPTION): tùy chọn, xử lý lỗi có chủ đích.

Tham số IN, OUT, IN OUT

  • IN: nhận dữ liệu từ caller; đây là mode mặc định.
  • OUT: procedure ghi kết quả để trả về caller.
  • IN OUT: vừa nhận giá trị ban đầu vừa ghi giá trị mới.

Trong ví dụ, p_departmentp_amount là IN; p_updated là OUT.

SQL%ROWCOUNT

SQL%ROWCOUNT là implicit cursor attribute cho biết lệnh SQL gần nhất đã tác động bao nhiêu dòng. Sau UPDATE, ta gán nó vào p_updated.

Gọi procedure

Một anonymous block DECLARE ... BEGIN ... END; / khai báo biến nhận OUT, truyền tham số theo tên bằng =>, rồi in kết quả qua DBMS_OUTPUT.PUT_LINE.

SET SERVEROUTPUT ON là lệnh của client để hiện nội dung DBMS_OUTPUT.

Transaction và quyền

  • UPDATE bên trong procedure vẫn thuộc transaction của caller. Thông thường procedure dùng chung không tự COMMIT, để caller quyết định COMMIT hay ROLLBACK.
  • CREATE OR REPLACE PROCEDURE là DDL và gây implicit commit trong Oracle.
  • Schema khác muốn gọi cần quyền: GRANT EXECUTE ON raise_department_salary TO app_user;.
Trình duyệt này không nhúng Oracle Server. Nút Mô phỏng dùng dữ liệu mẫu thật để diễn giải luồng PL/SQL; muốn chạy câu lệnh nguyên bản hãy dùng Oracle Database + SQL Developer/SQLcl.

Thuật ngữ (di chuột để xem giải thích)

Dữ liệu mẫu

Đang tải dữ liệu mẫu…