저장 서브프로그램 개요 지금까지 앞에서 살펴본 PL/SQL 프로그램은 대부분 서버에 저장되지 않는 프로그램들이었다. 저장되지 않는 프로그램은 일회성으로 실행되며 서버에 저장되지 않기 때문에 다른 사용자와 공유하거나 재사용할 수 없다. 반면에 저장 서브프로그램은 데이터베이스 서버에 저장되며 다른 사용자에 의해 호출하여 실행할 수 있으므로 동일한 소스코드를 여러 사용자가 공유할 수 있다. 저장 서브프로그램을 사용하는 이유 재사용성: 프로그램이 한 번 작성되어 데이터베이스에 저장되면 이후로는 소스코드를 다시 작성하거나 다른 프로그램에 포함시킬 필요 없이 그 이름만 알면 언제라도 실행할 수 있다. 유지보수성: 소스코드를 다수의 개별 프로그램에 중복하여 저장하지 않고 데이터베이스 서버에 단 한 번만 저장할 수 있다. 이렇게 하면 프로그..
예외처리 - 2 예외 처리기에서의 오류 조회 함수 예외 처리기에서는 기본적으로 발생한 예외와 관련되는 오류 번호와 오류 메세지를 조회하는 함수를 사용하여 오류 정보를 확인할 수 있다. 오류 번호를 조회하는 함수는 SQLCODE고, 오류 메세지를 조회하는 함수는 SQLERRM이다. 이 외에도 오류 관련된 정보를 출력하는 데 사용할 수 있는 추가적인 세 개의 함수가 내장 패키지 DBMS_UTILITY에 정의되어 있다. FORMAT_ERROR_BACKTRACE 패키지 DBMS_UTILITY의 서브함수 FORMAT_ERROR_BACKTRACE는 오류가 발생한 지점에서부터 해당 예외를 처리하는 예외 처리기까지의 백트레이스(Backtrace)를 반환한다. DECLARE PROCEDURE p IS BEGIN RAISE_APPLICA..
예외 처리 - 1 예외 처리 방법 오라클 PL/SQL에서는 EXCEPTION절을 사용한다. BEGIN .... EXCEPTION WHEN 예외명 THEN -- 예외 처리문 ... END; 예외 처리를 하지 않는 경우에는 실행되던 SQL이나 PL/SQL이 즉시 종료되고 사용자에게는 오류가 전달된다. 실제 프로그램 작성 시에는 특정 예외가 발생하면 이에 적절한 처리를 하고 프로그램을 계속하는 경우가 많다. 예외 처리가 없다면 의도하지 않은 위치나 시점에서 프로그램이 종료되어 버리므로 예외 처리 없이 본격적인 PL/SQL 프로그램을 작성하는 것은 거의 어렵다고 볼 수 있다. 예외 처리를 사용하면 여러 문장에서 발생하는 예외를 하나의 예외 처리기로 대응할 수 있다. 여러 개의 문장(SQL문과 PL/SQL문을 모두 포함)이 있을 ..
동적 SQL - 정적 SQL과 동적 SQL의 비교 항목 정적SQL 동적SQL 사용방법 PL/SQL 프로그램 안에 SQL문을 직접 삽입 실행 중 변경 가능한 문자열 변수 또는 문자열 상수로 제공된 SQL문을 실행 사용 예 SELECT COUNT(*) INTO v_cnt FROM EMP; EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM emp' INTO v_cnt; 사용 가능한 SQL -DML(SELECT, INSERT, UPDATE, DELETE, MERGE) - TCL(COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION, LOCK TABLE) - 모든 SQL문(DML, TCL, DDL, DCL) 장점 - 프로그램을 작성하기 쉽다 - 성능이 더 높다 - 사전에 정의되..
Cursor(커서) - 2 커서 칼럼의 앨리어스 사용 칼럼의 앨리어스(Alias)는 칼럼의 이름을 변경하거나 단순 칼럼이 아니고 표현식인 칼럼에 이름을 지정하기 위해서 사용된다. 커러의 칼럼에 계산식이 사용된 경우에 반드시 앨리어스를 사용해야 하는 것은 아니다. 하지만 다음과 같은 경우에는 반드시 앨리어스를 사용해야 한다. CURSOR FOR LOOP에 사용된 커서에서 칼럼에 계산식이 사용된 경우 선언된 커서를 %ROWTYPE을 사용하여 앵커로 참조하는 경우 DECLARE -- 명시적 커서 CURSOR emp_cursor IS SELECT empno사번 , ename이름 , sal+NVL(comm,0) 총급여 -- 앵커로 참조되는 칼럼이 표현식이라면 앨리어스가 필요 FROM emp; v_emp_rec emp_cursor%ROWTY..
Cursor(커서) - 1 SELECT문이건 DML문이건 쿼리가 실행되려면 DB 서버에 의해 파싱되어 실행 가능한 구조로 SGA(System Global Area)에 저장되어야 한다. 커서는 DB 서버의 SGA에 저장되어 있는 특정 쿼리를 실행하기 위한 정보를 저장하는 PGA(Program Global Area) 내부의 Private SQL Area에 대한 포인터로 클라이언트 메모리에 존재하는 자료구조이다. 사실은 파싱되어 SGA에 저장되어 있는 쿼리문에 관련된 데이터 구조인 Shared SQL Area도 커서라고 불린다. 여기서 말하는 커서는 클라이언트 메모리에 존재하는 자료구조이다. PL/SQL에서 SELECT, INSERT, UPDATE, DELETE, MERGE와 같은 DML 쿼리나 CREATE/ALTER/DROP과 같은 ..
레코드(Record) 레코드를 사용하면 데이터 타입이나 길이가 다른 여러 변수들을 논리적으로 하나의 그룹으로 묶을 수 있다. 로우 앵커(%ROWTYPE)를 사용하면 기존의 테이블 또는 뷰와 돌일한 구조의 레코드를 쉽게 정의하고 사용할 수 있다. 또한 레코드를 사용하면 SQL문을 훨씬 간단하게 작성할 수 있다. 레코드 사용 레코드를 사용하기 위해서는 컬렉션과 마찬가지로 먼저 레코드 타입을 선언하고 이 타입을 이용해서 레코드 변수(인스턴스)를 선언해야 한다. TYPE 타입명 IS RECORD (필드목록); 레코드변수명 타입명; 여기에서 필드목록은 레코드의 필드 목록을 선언하는 부분으로 형식은 CREATE TABLE문의 컬럼선언과 유사한 형태를 가진다. DECLARE TYPE emp_type IS RECORD(--세 개의 필드를 ..
컬렉션 - 2 컬렉션 연산 컬렉션 변수 간의 할당 컬렉션은 할당 연산자 :=를 사용하여 동일 타입의 변수 간에 값의 복사가 가능하다, DECLARE TYPE string_array IS TABLE OF VATCHAR2(100); v_arr1 string_array; v_arr2 string_array; PROCEDURE p_print_collection_count(a_title VARCHAR2, a_coll string_array) IS BEGIN IF a_coll IS NULL THEN DBMS_OUTPUT_PUT_LINE(a_title || ': '|| '컬렉션이 NULL입니다.'); ELSE DBMS_OUTPUT_PUT_LINE(a_title || ': '|| '컬렉션항목이' || a_coll.COUNT|| '건..
컬렉션(Collection) - 1 오라클 PL/SQL은 컴포지트 테이터 타입으로 컬렉션(Collection)과 레코드(Record) 두 가지를 지원한다. 컬렉션은 동일한 데이터 타입이 반복되는 데이터를 저장하는 자료구조이고, 레코드는 서로 다른 데이터 타입의 데이터를 모아 놓은 자료구조이다. 여기서는 컬렉션을 알아보자. 컬렉션의 대표적인 예는 배열이다. 컬렉션 타입 종류 -컬렉션 타입 특성 비교 비교항목 Associative Array VARRAY Nested Table 컬렉션 항목 개수 미지정 지정 미지정 인덱스 유형 문자열 또는 정수 정수 정수 초기화되지 않은 상태 Empty NULL NULL ADT(Abstract Data Type) 정의 불가능 가능 가능 컬렉션 항목의 개수가 미지정이면 항목의 개수에 한계가 없음을 의미한다. VA..
제어문 - 2 레이블 레이블(Label)은 소스 코드 내의 특정 문장을 가리키는 식별자이다. GOTO문에서 다음 실행할 위치를 지정하기 위해서는 반드시 레이블을 사용해야만 한다. 뒤에서 설명할 LOOP문에서도 옵션으로 레이블이 사용된다. 레이블명으로 사용가능한 문자열의 기준은 변수명의 기준과 동일하며 한글도 사용가능하다. 변수명과 마찬가지로 레이블명에 공백문자나 특수 문자를 사용할 수 없고, 대소문자를 구별하지 않지만, 역시 변수명과 마찬가지로 큰따옴표로 레이블명을 둘러싸는 경우에는 어떤 문자라도 사용 가능하고 대소문자도 구별하게 된다. 레이블 다음에는 반드시 블록 또는 실행 가능한 문장이 따라와야 한다. DECLARE v_num NUMBER := 0; BEGIN IF v_num = 0 THEN GOTO block_l..
제어문 - 1 -PL/SQL 언어의 제어문 종류 유형 설명 종류 조건 분기문 주어진 조건에 따라 서로 다른 문장을 실행할 수 있도록 하는 제어문 IF문, CASE문 무조건 분기문 조건 없이 프로그램의 다음 실행 위치를 변경하는 제어문 GOTO문 순환문 주어진 조건을 만족하는 동안 특정 범위의 문장들을 반복적으로 실행할 수 있도록 하는 제어문 기본 LOOP문, WHITE LOOP문, FOR LOOP문, EXIT문, CONTINUE문 조건 분기문 조건 분기문에는 IF문과 CASE문이 있다. IF문 IF문은 주어진 조건에 따라 서로 다른 문장을 실행할 수 있도록 하는 제어문. DECLARE v_cnt NUMBER; v_type STRING(10); BEGIN -- 테이블 emp가 생성되어 있는지 확인. -- 딕셔너리 뷰 u..
CLOB 오라클 DB에 문자열 값을 저장하기 위해 일반적으로 사용하는 데이터타입 VARCHAR2의 최대길이는 4000byte이다. 오라클 12c부터는 초기화 파라미터 MAX_STRING_SIZE=EXTENDED로 설정하면 SQL 데이터타입 VARCHAR2의 크기를 최대 32,767byte까지 지정할 수 있다. 하지만 4000바이트를 넘는 경우 내부적으로는 CLOB(Character Large Object)를 사용하므로 진정한 VARCHAR2라고 볼 수는 없다. VARCHAR2 타입에 비해 CLOB 데이터타입이 가지는 단점(기능상 제약, 성능 저하)을 모두 가지고 있다고 볼 수 있다. C나 비주얼 베이직, 자바와 같은 언어에서 CLOB 데이터타입을 사용할 때는 언어에 따라 다소 차이가 있지만 다른 데이터타입에 비해..