본문 바로가기

Database/PL SQL

PL/SQL Tutorial - Record PL/SQL record는 multiple fields를 가진다. 구조체로 이해하면 편할 것 같다. 1) Declaring records DECLARE record_name table_name%ROWTYPE; 간단하다. 실제로 contats의 row 구조를 record로 저장하는 경우는 아래와 같다. DECLARE r_contact contacts%ROWTYPE; 2) Cursor-based record DECLARE record_name cursor_name%ROWTYPE; 안봐도 느낌이 커서의 구조를 가져가는 record이다. DECLARE CURSOR cur_contacts IS SELECT first_name, last_name, phone FROM contacts; r_contact cur_co..
PL/SQL Tutorial - Variables with REF CURSOR cursor variable DECLARE TYPE customer_data_t IS REF CURSOR RETURN customers%ROWTYPE; customer_cur customer_data_t; example로 이해해보자. -- function CREATE OR REPLACE FUNCTION get_direct_reports( p_manager_id IN employees.manager_id%TYPE) RETURN SYS_REFCURSOR AS c_direct_reports SYS_REFCURSOR; BEGIN OPEN c_direct_reports FOR SELECT employee_id, first_name, last_name, email FROM employees WHERE manager..
PL/SQL Tutorial - Parameters CURSOR cursor_name (parameter_list) IS cursor_query; parameter가 뭔지도 알고 cursor이 뭔지도 아는데 이걸 합치니 뭔지 모르겠다. 한 번 살펴보자. 일단 cursor open은 이렇게 한다. OPEN cursor_name (value_list); DECLARE rec_product products%ROWTYPE; CURSOR cur_product (low_price NUMBER, high_price NUMBER) IS SELECT * FROM products WHERE list_price BETWEEN low_price AND high_price; BEGIN -- mass products DBMS_OUTPUT.PUT_LINE('Mass products..
PL/SQL Tutorial - Cursor FOR LOOP CURSOR FOR LOOP는 FOR LOOP의 extension 버전이다. 기존의 FOR LOOP가 lower -> upper를 한 번씩 도는 반복문이라면 CURSOR은 반환된 행에 대해 반복을 실행한다. FOR LOOP CURSOR는 암시적으로 루프 인덱스 생성 이후 커서를 연다. FOR record IN cursor_name LOOP process_record_statements; END LOOP; 1) record - LOOP 안에서만 사용하는 INDEX 2) cursor_name - select_statement와 같다 백문이 불여일견이라 한 번 사용해보자. DECLARE CURSOR cur_product IS SELECT product_name, list_price FROM products O..
PL/SQL Tutorial - Cursor Cursor : 쿼리 결과를 가리키는 포인터 / 쿼리 결과를 잠깐 동안 저장하고 있는 변수라고 생각하면 된다. - 암시적커서 - 명시적커서 (1) Implicit cursors (암시적 커서) - SELECT INTO, INSERT, UPDATE, DELETE는 implicit cursor을 생성 - cursor는 SQL%ROWCOUNT, SQL%ISOPEN, SQL%FOUND, SQL%NOTFOUND의 status를 가지고 있음 - 만일 query가 zero or multiple row일 경우 exception을 보여줌 (2) Explicit cursors (명시적 커서) - OPEN, FETCH, CLOSE의 execution cycle을 가지고 있음. 사실 잘 이해는 안간다. 예시를 통해 이해해보도..
PL/SQL Tutorial - SELECT INTO SELECT 구조 SELECT select_list INTO variable_list FROM table_name WHERE condition; WHERE과 같이 INNER JOIN, GROUP BY, HAVING, UNION을 사용할 수 있다. 예전에 작성한 EXAMPLE 데이터베이스로 예제를 실행해보자. DECLARE v_customer_name customers.name%TYPE; BEGIN SELECT name INTO v_customer_name FROM customers WHERE customer_id = 100; DBMS_OUTPUT.PUT_LINE( v_customer_name ); END; 익명 블록이 완료되었습니다. Verizon 1. v_customer_name 은 customers...
PL/SQL Tutorial - Exception handlers 프로그램은 진행도중 언제나 예외를 만나기 마련이다. PL/SQL에서도 예외들을 처리하기 위해 exception handlers를 제공한다. exception은 3가지 종류가 있다. (1) 내부적으로 정의되어 있는 예외 (2) 미리 정의되어 있는 예외 (3) 유저 정의 예외 (1) Internally defined exceptions 자주 만날 수 있는 ORA-n Error들이다. Oracle이 에러에 대한 판단을 내려주며 어떻게 해결해야하는지 알려준다. DECLARE n_counter PLS_INTEGER; BEGIN n_counter := 2147483648; -- overflow number END; 오류 보고 - ORA-01426: 수치 오버플로우 (2) Predefined exceptions 어떠..