oracle 8

Oracle (8) - 커서(Cursor)

오라클을 사용하다 보면 여러 행의 데이터 처리해야 하는 경우가 있습니다.  커서를 활용하면 효율적으로 데이터를 다룰 수 있습니다. 커서는 데이터를 반환하는 것뿐만이 아니라 데이터를 한 행씩 읽으면서 특정 로직을 적용하거나 조건에 맞게 가공할 수 있습니다. 프로시저나 트랜잭션 작업에서 데이터를 유연하게 처리할 수 있습니다. 커서(Cursor)커서는 SQL의 데이터 셋을 순차적으로 접근할 수 있는 메모리 영역입니다. 이를 이용하여 쿼리 결과를 한 행씩 처리할 수 있도록 합니다. 쉽게 말하면 C에서 포인터와 같은 기능을 합니다. 이를 활용하면 다음과 같은 이점을 얻을 수 있습니다.다중 행 처리: 여러 행의 데이터를 한 번에 여러 행을 반환하거나 각 행을 개별적으로 처리할 수 있습니다.복잡한 로직 구현: 프로시..

컴퓨터/Oracle 2025.01.09

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

Mybatis - INSERT SELECT에서 ORA-00933 에러

회사에서 업무를 하던 중 쿼리를 만들다 다소 신기한 방식으로 해결하였습니다.insert에서 update로 변경하는 것만으로 에러가 해결되어 공유하려고 합니다. 한줄요약 : INSERT SELECT 구문에서 실행이 안 되는 경우 태그를 insert에서 update로 바꾸어보자 ORA-00933ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다해당 오류는 SQL 구문 작성 오류 시 문법 오류로 인한 것입니다. 오라클에서 필요한 명령어 쉼표, AND 등 명령어가 빠져 있거나 오타가 난 경우 발생할 수 있습니다. Mybatis에서 발견한 오류IDE에서 쿼리로 작성 할 때 실행시 문제가 없었으나 Mybatis에서 쿼리를 동일한 쿼리를 실행할 때  ORA-00933에러가 계속 발생하였습니다. 아래와 같..

컴퓨터/기타 2024.05.29

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 (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 (3) - 순위처리를 해보자 (RANK, DENSE_RANK, ROW_NUMBER)

쿼리를 작업할 때 성적 및 순위 처리할 일들이 있습니다. 해당 데이터를 RANK 함수를 이용하여 순위처리 하는 방법을 정리하려고 합니다. 예시 테이블 STNT_NO GRADE KOREAN MATH ENGLISH TOTAL 2017111 3 100 90 80 270 2018112 2 90 90 90 270 2019113 3 50 50 60 160 2020114 1 60 70 80 210 RANK, DENSE_RANK, ROW_NUMBER SELECT STNT_NO , TOTAL , RANK() OVER (ORDER BY TOTAL DESC) AS RANK , DENSE_RANK() OVER (ORDER BY TOTAL DESC) AS DENSE_RANK , ROW_NUMBER() OVER (ORDER BY..

컴퓨터/Oracle 2023.11.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
1