https://www.udemy.com/course/plsql-by-example/learn/lecture/3226718#overview
Implicit cursor
Explicit cursor
PL/SQL에서 가장 최근의 implicit cursor는 SQL이라는 이름으로 참조할 수 있고, 아래의 속성들을 가진다.
%FOUND
%ISOPEN
%NOTFOUND
%ROWCOUNT
-- 앞서 C,U,D 혹은 INSERT INTO 작업이 선행되어야 한다.
IF sql%found THEN
머시기;
END IF;
Declare
Open
Fetch one or more times
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;
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;
하나의 프로시져나 함수에서 다른 프로시져나 함수로 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;
CURSOR_ALREADY_OPEN
INVALID_CURSOR