Procedure parameters — IN / OUT / IN OUT
Parameter mode là contract giữa caller và procedure; chọn sai mode khiến API PL/SQL khó dùng và dễ tạo side effect bất ngờ.
Ba parameter mode
IN: procedure đọc giá trị nhưng không gán lại cho formal parameter.OUT: giá trị ban đầu của biến caller không có ý nghĩa; procedure phải ghi kết quả trước khi kết thúc.IN OUT: caller truyền giá trị ban đầu và nhận lại giá trị đã được procedure thay đổi.
Nếu không ghi mode, Oracle mặc định là IN.
Positional và named notation
apply_capped_raise(1, v_raise, v_salary) phụ thuộc thứ tự. Named notation p_employee_id => 1 dài hơn nhưng an toàn khi procedure có nhiều tham số.
Có thể trộn positional trước và named sau, nhưng không được quay lại positional sau khi đã dùng named notation.
Dùng %TYPE
employees.salary%TYPE giúp biến PL/SQL tự đồng bộ kiểu với cột. Khi schema đổi kiểu salary, code ít bị lệch hơn so với hard-code NUMBER.
Ví dụ IN OUT
Caller yêu cầu tăng 900. Procedure giới hạn mức tăng tối đa 500 rồi ghi 500 ngược vào biến IN OUT; OUT trả salary mới.
IN OUT hữu ích nhưng làm API khó đoán hơn. Nếu không cần ghi ngược, ưu tiên tách thành một IN và một OUT rõ nghĩa.
Thuật ngữ (di chuột để xem giải thích)
Đang tải dữ liệu mẫu…
Ba parameter mode
IN: procedure đọc giá trị nhưng không gán lại cho formal parameter.OUT: giá trị ban đầu của biến caller không có ý nghĩa; procedure phải ghi kết quả trước khi kết thúc.IN OUT: caller truyền giá trị ban đầu và nhận lại giá trị đã được procedure thay đổi.
Nếu không ghi mode, Oracle mặc định là IN.
Positional và named notation
apply_capped_raise(1, v_raise, v_salary) phụ thuộc thứ tự. Named notation p_employee_id => 1 dài hơn nhưng an toàn khi procedure có nhiều tham số.
Có thể trộn positional trước và named sau, nhưng không được quay lại positional sau khi đã dùng named notation.
Dùng %TYPE
employees.salary%TYPE giúp biến PL/SQL tự đồng bộ kiểu với cột. Khi schema đổi kiểu salary, code ít bị lệch hơn so với hard-code NUMBER.
Ví dụ IN OUT
Caller yêu cầu tăng 900. Procedure giới hạn mức tăng tối đa 500 rồi ghi 500 ngược vào biến IN OUT; OUT trả salary mới.
IN OUT hữu ích nhưng làm API khó đoán hơn. Nếu không cần ghi ngược, ưu tiên tách thành một IN và một OUT rõ nghĩa.
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 normalize_percent(p_percent IN OUT NUMBER): nếu nhỏ hơn 0 gán 0, nếu lớn hơn 100 gán 100.
Đang tải trình soạn thảo…
Viết anonymous block gọi apply_capped_raise cho employee 4, mức tăng ban đầu 700; nhận salary mới và in cả hai biến.
Đ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)