오라클 7

Oracle (7) - 인덱스를 타는지 확인하는 방법 (EXPLAIN PLAN)

SQL을 작성하여 어떤 데이터를 만들기 위해 많은 JOIN 및 서브쿼리를 하게 되는 경우가 있습니다. 해당 과정을 반복하다 보면 쿼리 실행시 성능 문제가 발생할 수 있습니다. 특히 인덱스를 타지 못하고 FULL SCAN 하는 경우 성능이 크게 떨어집니다. 이러한 문제를 해결하기 위해 EXPLAIN PLAN을 이용하여 쿼리의 실행 계획을 확인하고, 인덱스를 잘 활용하도록 최적화하는 방법을 알아보겠습니다. EXPLAIN PLAN-- 실행 계획을 생성EXPLAIN PLAN FORSELECT * FROM TEST WHERE MAJOR = '국문학과';-- 생성된 실행 계획 확인SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);우선 EXPLAIN PLAN은 오라클에서 제공하는 기능으로, ..

컴퓨터/Oracle 2024.12.28

Python (23) - 오라클과 연동하여 Blob이미지를 다운로드 해보자 (oracledb)

직장에서 파이썬 이미지를 다운로드하는 일이 있었습니다. Toad 프로그램을 사용하는 방법도 있으나 직접 사용하기에 너무 비싸기 때문에 파이썬과 오라클을 연동하여 이미지를 설치하게 되었습니다. 바로가기 oracledb 모듈 다운로드(oracledb) 프로그램 기능 및 운영 순서 소스코드 oracledb Oracle DB와 상호 작용하기 위해 파이썬에서 사용하는 oracledb 모듈은 오라클과 효율적인 DB 통신을 담당합니다. 해당 모듈을 이용하여 DB에 연결하고 쿼리를 실행하며 결과를 처리하는 기능을 제고합니다. oracledb 모듈은 오라클 클라이언트 라이브러리를 이용하여 작동하므로 설치 및 설정이 필요합니다. 이를 통해 Python 애플리케이션은 Oracle 데이터베이스와 상호 작용하여 데이터를 검색,..

컴퓨터/Python 2024.03.26

Oracle (6) - ORA-01427 : 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다

오라클을 사용하다 보면 아래와 같은 오류를 종종 보게 됩니다. ORA-01427 : 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다 해당 오류는 주로 서브쿼리에서 1건을 초과한 레코드가 나올때 발생하는 에러입니다. 예시 데이터 STUDENT_NO (PK) NAME DEPT_NO 20240304 강감찬 100 20240305 이순신 100 20240306 이산 200 20240307 홍길동 300 문제가 있는 쿼리문을 만들어 보겠습니다. SELECT STUDENT_NO, DEPT_NO FROM EXAMPLE_TABLE T1 WHERE STUDENT_NO = ( SELECT STUDENT_NO FROM EXAMPLE_TABLE T2 WHERE DEPT_NO = 100 ) 해당 쿼리에는 문제가 있습니다...

컴퓨터/Oracle 2024.03.07

Oracle (5) - SELECT문에서 IF ELSE를 사용하기 DECODE

오라클을 사용하다 보면 case 문을 사용하는 경우가 있습니다. 지난 편에는 null을 처리하는 방법을 소개하였으나 case 문을 이용하여 if else 형식을 사용하기도 합니다. 이번에는 DECODE 함수를 소개하려고 합니다. 참고로 IF ELSE 문은 SELECT에서 사용할 수 없으며 PL/SQL에서 사용할 수 있습니다. DECODE SELECT NAME , GEND , DECODE(GEND, 'M', '남자', 'F', '여자', '제3의 성') AS GEND_DECODE FROM EXAMPLE DECODE 함수의 구조는 다음과 같습니다. DECODE(칼럼, 조건, TRUE 조건 값, ELSE 값) DECODE 함수는 또한 여러 개의 식을 사용할 수 있습니다. 여러 개의 식을 사용하는 경우 아래의 ..

컴퓨터/Oracle 2023.12.23

Oracle (4) - null값을 치환하는 방법 (NVL, NVL2, COALESCE)

오라클을 사용하 다보면 null에 따른 이벤트 처리를 많이 하게 됩니다. 저는 그동안 CASE 문을 이용하여 사용하였으나 간단하게 함수로 처리하는 방법이 있어 소개하려고 합니다. 직관적으로 알 수 있도록 CASE 문을 사용하는 경우 어떤 형식으로 작성할 수 있는지 추가로 작성하겠습니다. 예제 테이블 데이터 GRADE NAME PRICE SCORE 1 강감찬 3000 300 2 홍길동 5000 500 3 황진이 600 4 장영실 700 5 이순신 NVL SELECT NAME , CASE WHEN PRICE IS NULL THEN SCORE ELSE PRICE END AS NVL_EX FROM EX_TABLE / SELECT NAME, NVL(PRICE,SCORE) AS NVL_EX -- PRICE값이 있는..

컴퓨터/Oracle 2023.12.06

Oracle (2) - COMMIT한 데이터를 다시 가져오자 (TIMESTAMP)

Oracle을 다루다 보면 데이터를 잘못 DELETE나 UPDATE 하는 경우가 있습니다. 그런 경우 ROLLBACK을 하면 해결할 수 있습니다. 하지만 COMMIT을 하면 어떻게 될까요? 이미 데이터가 적용되어 일반적인 방법으로는 복구를  못합니다. 하지만 Oracle에는 COMMIT를 하였을 때 임시로 데이터가 저장하게 되어있고, TIMESTAMP를 이용하여 데이터를 복구할수 있습니다. TIMESTAMP구문은 아래와 같습니다.SELECT [COLUMN / *] -- 칼럼FROM [table] -- 대상 테이블AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '[NUMBER]' [SECOND/MINUTE/HOUR/DAY]);[WHERE]-- [NUMBER]은 되돌릴 기준 초, 분, 시..

컴퓨터/Oracle 2023.06.06

Oracle (1) - MERGE INTO를 이용하여 간단하게 조건있는 데이터를 다루자

우리가 A라는 데이터를 만들 때 데이터가 있고 없는 경우에 따라 나누는 경우가 있습니다. PL/SQL을 이용하여 프로시저를 만드는 방법도 있지만 MERGE INTO라는 구문을 이용하면 쉽게 만들 수 있습니다. 예제 테이블 CREATE TABLE T1 ( STU_NO VARCHAR2(10) PRIMARY KEY, --학번 STU_NAME VARCHAR2(10) NOT NULL, --이름 SCR NUMBER(5) --점수 ); CREATE TABLE T2 ( STU_NO VARCHAR2(10) PRIMARY KEY, --학번 STU_GRADE VARCHAR2(2) NOT NULL, --학년 STU_GEND VARCHAR2(2), --성별 SCR NUMBER(5) --점수 ); CREATE TABLE T3 (..

컴퓨터/Oracle 2023.05.31