Cursors

WooBuntu·2021년 10월 4일
0

알고쓰자 PL/SQL

목록 보기
7/8

https://www.udemy.com/course/plsql-by-example/learn/lecture/3226718#overview

Cursor

  • Implicit cursor

  • Explicit cursor

Implicit cursor

PL/SQL에서 가장 최근의 implicit cursor는 SQL이라는 이름으로 참조할 수 있고, 아래의 속성들을 가진다.

  • %FOUND

  • %ISOPEN

  • %NOTFOUND

  • %ROWCOUNT

-- 앞서 C,U,D 혹은 INSERT INTO 작업이 선행되어야 한다.
IF sql%found THEN
    머시기;
END IF;

Explicit cursor

  1. Declare

  2. Open

  3. Fetch one or more times

  4. Close

CREATE OR REPLACE PROCEDURE 머시기
(
c_id IN customer.customer_id%type
)
IS
    cursor explicitCursor is SELECT * FROM customer
    WHERE customer_id = c_id;
    
    customer_record explicitCursor%rowtype;
    
BEGIN
    open explicitCursor;
    fetch explicitCursor INTO customer_record;
    close explicitCursor;
CREATE OR REPLACE PROCEDURE 머시기
(
c_id IN customer.customer_id%type
)
IS
    cursor explicitCursor is SELECT * FROM customer
    WHERE customer_id = c_id;
    
    customer_record explicitCursor%rowtype;
BEGIN
    open explicitCursor;
    LOOP
        fetch explicitCursor INTO customer_record;
        EXIT WHEN explicitCursor%NOTFOUND;
    -- 여기서 로그를 찍든지 암튼 로직 수행
    END LOOP;
    close explicitCursor;

Cursor FOR LOOP

FOR customer_record IN
    (SELECT * FROM customer WHERE customer_id = 10)
LOOP
    DBMS_OUTPUT.PUT_LINE(customer_record.last_name);
END LOOP;
CREATE OR REPLACE PROCEDURE 머시기
(
c_id IN customer.customer_id%type
)
IS
BEGIN
    FOR customer_record IN (SELECT * FROM customer WHERE customer_id=c_id)
    LOOP
    -- 여기서 로그를 찍든지 암튼 로직 수행
    END LOOP;

Cursor variable and Reference Cursor

하나의 프로시져나 함수에서 다른 프로시져나 함수로 Resultset을 전달하기 위해 사용하는 변수

CREATE OR REPLACE FUNCTION get_names
(
    custId IN NUMBER
) RETURN SYS_REFCURSOR
IS
    l_return SYS_REFCURSOR;
BEGIN
    OPEN l_return 
    FOR SELECT first_name, last_name FROM customer WHERE customer_id = custId;
END get_names;

CREATE OR REPLACE PROCEDURE DISPLAY_NAMES
IS
    C_REC SYS_REFCURSOR;
    FNAME VARCHAR2(50);
    LNAME VARCHAR2(50);
BEGIN
    C_REC := GET_NAMES(10);
    
    -- get_names에서 이미 open했으니 display_names에서 또 open해줄 필요는 없다. 
    LOOP
        FETCH C_REC INTO FNAME, LNAME;
        EXIT WHEN C_REC%NOTFOUND;
    END LOOP;
    
    CLOSE C_REC;
    -- 다만, close는 여기에서 해줘야 한다.
END;

Exceptions For Cursor

  • CURSOR_ALREADY_OPEN

  • INVALID_CURSOR

0개의 댓글