Cảnh báo nhẹ: Bài viết được viết theo văn phong thời sinh viên, giọng văn hơi bị chuối ^^

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:

CREATE OR REPLACE PROCEDURE ten_procedure (đối số 1 kiểu,đối số 2 kiểu,…..)AS

//khai bao cac bien

BEGIN

EXCEPTION

END;

Chạy 1 proc trong sqlplus như sau

EXEC tenprocedure

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

  • IN : mặc định không ghi gì hết thì chúng ta tự hiểu là IN, khi ta cho thêm thông số này vào sau tên biến, khi proc được thực thi, giá trị của truyen vào sẽ được gán cho biến (pass by value)

  • OUT: giá trị của biến sẽ trả ngược ra cho chương trình

  • IN OUT : truyền giá trị vào và trả ngược lại kết quả cho chương trình

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

create or replace procedure hoanvi(a number, b number)
as
    v_temp number;
begin
    v_temp:=a;
    a:=b;
    b:=v_temp;
end;

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:

    LINE/COL ERROR
    ——– —————————————————————–
    6/7 PL/SQL: Statement ignored
    6/7 PLS-00363: expression ‘A’ cannot be used as an assignment target
    7/7 PL/SQL: Statement ignored
    7/7 PLS-00363: expression ‘B’ cannot be used as an assignment target

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.

    create or replace procedure hoanvi(a in out number, b in out number)
    as
    v_temp number;
    begin
        v_temp:=a;
        a:=b;
        b:=v_temp;
    end;

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

    declare
    v_a number:=9;
    v_b number:=100;
    begin
        dbms_output.put_line(v_a||’ ‘||v_b);
        hoanvi(v_a,v_b);
        dbms_output.put_line(v_a||’ ‘||v_b);
    end;

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

    SQL> /
    9 100
    100 9

    _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!