Procedure trong Oracle

Mai thi Oracle rồi, Bữa nay tranh thủ ôn lại bài. Đụng đến phần Procedure, tranh thủ viết bài viết lên blog của mình để trình bày lại những j mình hiểu, rèn luyện kỹ năng viết lách.

Procedure bản chất là 1 khối PL/SQL có tên và có đối số nhằm thực hiện một 1 số lệnh nào đó tùy theo mục đích của người viết ra nó.
Cú pháp:

Chạy 1 proc trong sqlplus như sau

Chú ý các thông số khai báo không được ràng buộc điều kiện cho chúng ví dụ : v_a number(3) là sai, mà đúng ra là v_a number — không có giới hạn số chữ số
Đặc biệt trong procedure ta cần chú ý tới phần parameter trong phần khai báo. Có 3 loại parameter trong oracle mà ta cần chú ý. Đó là IN, OUT, IN OUT

Chúng ta làm ví dụ sau để hiểu rõ hơn
Bạn tao 1 proc sau:

Trước khi chạy, ta hay xem ý định của ví dụ này là gì, dze ẹt đó là hoán vị 2 số a,b. Bạn thử đoán xem nó có chạy được không và nếu chạy được thì giá trị của a và b sau bước này có được hoán vị cho nhau không

Câu trả lời là không chạy được proc trên và báo lỗi sau

Lý do là vì là vì tham số a b ta chỉ được đọc giá trị của nó và gán vào biến temp(dòng 6 và 7 ), mặc định sau khi khai báo biến nếu ta không ghi gì hết thì ORACLE sẽ ngầm thêm IN đằng sau biến và khi đó ta chỉ được đọc giá trị của biến này thôi (read value) và gán giá trị này cho biến khác (v_temp:=a) cái này là pass by value(chỉ truyền trị số)
Để khác phục lỗi này ta làm như sau, rất đơn giản chỉ cần thêm IN OUT đằng sau khi khai báo biến, tại sao lại thêm như thế, thật đơn giản khi thêm IN OUT giá trị của biến a sẽ được đọc và gán vô biến v_temp, sau đó giá trị của biến a,b có thể được ghi đè lên. Đó là tại sao oracle lại thêm IN, OUT vào. Tuy rắc rối nhưng rất hữu ích trong 1 số trường hợp sau này khi ta cần sử dụng đến chúng.

Chạy thử OK, Procedure created.
Xong ta thử viết 1 unnamed proc đẻ chạy thủ hàm hoanvi này

Và kết quả trả về là

PL/SQL procedure successfully completed.

Xong, với ví dụ trên thì chắc hẳn các bạn và mình sẽ hiểu rõ hơn về tham số truyền vào Procedure trong Oracle.
Có ý kiến j đóng góp comment cùng trao đổi nha!