[Oracle 프로시저] 대용량 데이터 고속 처리: BULK COLLECT와 FORALL

프로시저에서 커서(CURSOR)를 사용하여 수만, 수십만 건의 데이터를 한 행씩(Row-by-Row) 루프(LOOP)로 처리하는 것은 가장 직관적인 방법이지만, 데이터 양이 많아지면 심각한 성능 저하의 원인이 됩니다. 이 문제의 원인은 PL/SQL 엔진과 SQL 엔진 사이에서 발생하는 과도한 ‘컨텍스트 스위칭(Context Switching)’ 때문입니다. BULK COLLECT와 FORALL은 이 컨텍스트 스위칭을 최소화하여 대용량 데이터 처리 속도를 획기적으로 개선하는 핵심적인 성능 튜닝 기법입니다. ## … Read more

[Oracle 프로시저] 패키지(Package)로 프로시저 묶기

지금까지 프로시저를 CREATE OR REPLACE PROCEDURE를 통해 하나씩 독립된 객체로 만들어왔습니다. 하지만 실무에서는 서로 관련 있는 여러 프로시저, 함수, 변수들이 생겨나기 마련입니다. 예를 들어, ‘인사 관리’와 관련된 프로시저(신규 사원 등록, 급여 인상, 퇴사 처리)들이 그렇습니다. **패키지(Package)**는 이렇게 연관 있는 PL/SQL 객체들을 하나의 논리적인 단위로 묶어 관리하는 객체입니다. 이는 마치 관련된 파일들을 하나의 폴더에 정리하는 것과 … Read more

[Oracle 프로시저] 동적 SQL과 EXECUTE IMMEDIATE

때로는 프로시저가 실행되는 ‘런타임(Runtime)’에 SQL 문장이 만들어지거나 변경되어야 하는 경우가 있습니다. 이때 사용하는 것이 바로 **’동적(Dynamic) SQL’**입니다. Oracle PL/SQL에서 동적 SQL을 실행하는 표준 명령어는 **EXECUTE IMMEDIATE**입니다. ## 동적 SQL은 언제 사용하는가? 정적 SQL로 처리할 수 없는 특정 상황에서 동적 SQL은 필수적입니다. ## EXECUTE IMMEDIATE 사용법 1. DDL 실행 (가장 기본적인 사용) 문자열 변수에 실행할 DDL을 … Read more

[Oracle 프로시저] 커서(Cursor)를 이용한 데이터 처리

SELECT INTO는 단 한 건의 결과만 처리할 수 있다는 것을 배웠습니다. 하지만 실제 업무에서는 특정 조건을 만족하는 여러 건의 데이터를 하나씩 순회하며 복잡한 로직을 처리해야 할 때가 훨씬 많습니다. 이때 사용하는 것이 바로 **커서(Cursor)**입니다. 커서는 특정 SQL 문장의 결과 집합(Result Set)을 가리키는 **’포인터’ 또는 ‘책갈피’**와 같습니다. 커서를 사용하면, 여러 건의 조회 결과를 한 번에 메모리에 … Read more

[Oracle 프로시저] 예외 처리(Exception)

잘 만들어진 프로시저는 단순히 정상적인 경우만 처리하는 것이 아니라, 예기치 않은 오류가 발생했을 때 비정상적으로 종료되지 않고 우아하게 문제를 처리할 수 있어야 합니다. 이때 사용하는 것이 바로 예외(Exception) 처리 구문입니다. 예외 처리는 SELECT INTO 문에서 데이터가 없거나(NO_DATA_FOUND), 0으로 나누는 등 예상치 못한 오류가 발생했을 때, 프로그램의 흐름을 제어하고 미리 정의된 대체 로직을 수행하도록 만드는 필수적인 … Read more

[Oracle 프로시저] 파라미터 완벽 이해: IN, OUT, IN OUT

프로시저의 진정한 힘은 외부와 데이터를 주고받으며 동적으로 작동할 때 발휘됩니다. 이 데이터 교환의 통로가 바로 **파라미터(Parameter)**입니다. 파라미터는 프로시저를 호출할 때 값을 전달받거나, 프로시저의 처리 결과를 외부로 반환하는 역할을 합니다. Oracle 프로시저의 파라미터는 그 역할에 따라 IN, OUT, IN OUT 세 가지 모드로 나뉩니다. 각 모드의 특징과 사용법을 명확히 이해하는 것은 매우 중요합니다. ## 1. IN … Read more

[Oracle 프로시저] 기본 구조와 생성, 실행 방법

프로시저는 정해진 문법 구조에 따라 작성해야 하며, 생성(Create)과 실행(Execute)은 별개의 과정으로 이루어집니다. 이번 포스팅에서는 프로시저를 만드는 가장 기본적인 뼈대와 실행 방법을 알아보겠습니다. ## 프로시저의 기본 구조 (뼈대) 🏗️ 모든 PL/SQL 블록은 기본적으로 선언부, 실행부, 예외 처리부로 나뉩니다. 프로시저 역시 이 구조를 따릅니다. ## 프로시저 생성하기: “Hello, World!” 가장 간단한 예제로, 화면에 ‘Hello, World!’를 출력하는 프로시저를 … Read more

[Oracle 프로시저] Stored Procedure란 무엇인가? (개념과 장점)

Oracle 데이터베이스를 다룰 때 우리는 보통 SQL Developer나 SQL*Plus 같은 툴을 이용해 SQL 쿼리를 한 줄씩 실행합니다. 하지만 여러 개의 SQL 문을 하나의 논리적인 작업 단위로 묶어 처리해야 할 때가 많습니다. 이때 사용하는 것이 바로 **저장 프로시저(Stored Procedure)**입니다. 저장 프로시저는 특정 작업을 수행하는 PL/SQL 코드 블록에 이름을 붙여 데이터베이스 안에 저장해 둔 것입니다. 마치 자주 … Read more

[Oracle] ORA-00932: inconsistent datatypes (데이터 유형 불일치)

ORA-00932: inconsistent datatypes: expected CHAR got CLOB 와 같은 형식의 이 오류는 SQL 연산에서 서로 호환되지 않는 데이터 타입을 함께 사용하려고 할 때 발생합니다. ORA-01722(invalid number)가 문자열과 숫자 사이의 변환 문제에 초점을 맞춘다면, ORA-00932는 더 광범위한 데이터 타입 간의 충돌을 다룹니다. 특히 이 오류는 대용량 텍스트(CLOB)나 바이너리 데이터(BLOB)를 일반적인 함수나 연산자에 사용하려 할 때 자주 … Read more

[Oracle] ORA-12899: value too large for column 해결하기

ORA-12899: value too large for column “SCHEMA”.”TABLE”.”COLUMN” 오류는 INSERT 또는 UPDATE 하려는 데이터의 길이가 대상 컬럼에 정의된 크기보다 클 때 발생하는, 매우 직관적인 오류입니다. 하지만 이 오류가 까다로운 이유는 눈에 보이는 글자 수와 데이터베이스가 내부적으로 처리하는 바이트(Byte) 수가 다른, 다국어 환경(UTF-8 등)에서 자주 발생하기 때문입니다. ## 주요 발생 원인 및 진단 1. 단순 길이 초과 … Read more