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.
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_department và p_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 PROCEDURElà 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)
Đang tải dữ liệu mẫu…
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_department và p_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 PROCEDURElà 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)
Đang tải dữ liệu mẫu…
Oracle PL/SQL. Browser không có Oracle Server; editor dùng dialect PL/SQL và nút bên dưới chạy mô phỏng trên dữ liệu mẫu.
Đang tải trình soạn thảo…
Tạo procedure give_bonus nhận p_department IN VARCHAR2, p_amount IN NUMBER, p_count OUT NUMBER; tăng salary rồi gán SQL%ROWCOUNT vào p_count.
Đang tải trình soạn thảo…
Viết anonymous block gọi give_bonus cho phòng Engineering với mức 200, nhận OUT vào v_count và in v_count bằng DBMS_OUTPUT.PUT_LINE.
Đang tải trình soạn thảo…
- Chạy thử truy vấn mẫu
- Hoàn thành bài tập (0/2)