Breaking News
Loading...
10/12/2013

Cursor trong SQL Server, Oracle

Trong SQL Server, sau đây là 1 ví dụ đơn giản về Cursor, chỉ có 1 cú pháp duy nhất:

http://blog.sqlauthority.com/2007/01/01/sql-server-simple-example-of-cursor/

Trong Oracle, có vẻ việc sử dụng cursor linh động hơn, có 3 dạng sau:

1. Implicit Cursor: có nghĩa là dùng cursor một cách không tường minh

DECLARE
  l_descr hardware.descr%type;
BEGIN
  SELECT descr INTO l_descr FROM hardware WHERE aisle = 1 AND item = 1;
END;

2. Explicit Fetch Calls: dùng cursor lấy data một cách tường minh. Nếu dùng cách này có 3 keyword chủ chốt là Open, Fetch, và Close.

DECLARE
  CURSOR c_tool_list
  IS
    SELECT descr FROM hardware WHERE aisle = 1 AND item BETWEEN 1 AND 500;
BEGIN
  OPEN c_tool_list;
  LOOP
    FETCH c_tool_list INTO l_descr;
    EXIT
  WHEN c_tool_list%notfound;
  END LOOP;
  CLOSE c_tool_list;
END;

3. Implicit Fetch Calls: dung cursor lấy data một cách không tường minh

BEGIN
  FOR i IN
  ( SELECT descr FROM hardware WHERE aisle = 1 AND item BETWEEN 1 AND 500
  )
  LOOP
    
  END LOOP;
END;
Nhưng cursor trong Oracle chưa dừng lại ở đây, tương ứng với 3 cách trên, có 3 cách tương ứng nhưng viết dưới dạng bulk sql, tức là xử lý nhiều record cùng 1 lúc.

1. Implicit Cursor BULK Mode: tương ứng cách 1 ở trên

DECLARE
type t_descr_list
IS
  TABLE OF hardware.descr%type;
  l_descr_list t_descr_list;
BEGIN
  SELECT descr bulk collect
  INTO l_descr_list
  FROM hardware
  WHERE aisle = 1
  AND item BETWEEN 1 AND 100;
END;

2. Explicit Fetch Calls BULK Mode: tương ứng cách 2 ở trên


DECLARE
  CURSOR c_tool_list
  IS
    SELECT descr FROM hardware WHERE aisle = 1 AND item BETWEEN 1 AND 500;
type t_descr_list
IS
  TABLE OF c_tool_list%rowtype;
  l_descr_list t_descr_list;
BEGIN
  OPEN c_tool_list;
  FETCH c_tool_list bulk collect INTO l_descr_list;
  CLOSE c_tool_list;
END;
Còn cách 3 ở trên không có gì thay đổi.

Khi dùng cursor trong Oracle, ta có thể đếm số dòng đã được lấy như sau:

cursorName%RowCount;

0 comments:

Post a Comment

 
Toggle Footer