[Oracle] 오라클 ORA-01722 "수치가 부적합합니다" / 숫자형 변환 TO_NUMBER 오류 발생 시 해결 방법 / 정규식으로 유효한 숫자만 추출
·
DataBase/Oracle Error
숫자형 변환 시 유효한 형식숫자로 이루어진 정수, 소수형 (특수문자로 입력된 숫자 불가능)문자는 + - . 사용 가능 공백은 숫자의 앞/뒤에 존재 시 변환 가능숫자나 . 의 중간에 공백이 존재하는 경우 오류 발생데이터 입력 시 실수로 마침표(.) 가 아닌 쉼표(,)를 사용하는 경우 오류 발생정규식으로 유효한 숫자만 추출 후 변환SELECT TO_NUMBER(REGEXP_REPLACE('16,7', '[^0-9.-]', '')) AS NUM2 , TO_NUMBER(REGEXP_REPLACE(REPLACE('16,7',',','.'), '[^0-9.-]', '')) AS NUM2 FROM DUAL정규식으로 숫자, 마침표(.), 마이너스(-) 만 추출실수로 입력되는 쉼표는 REPLACE로 별도 치..
[Oracle] 오라클 순번 매기기 (행, 그룹별 순번) / ROWNUM, ROW_NUMBER()
·
DataBase/Oracle
오라클에서 행에 순번을 부여하는 방법 중 가장 기본적인 2가지를 알려 드리겠습니다. ROWNUM 사용 방법 (정렬 미적용)SELECT ROWNUM , A.* FROM EMP A WHERE JOB IN ('MANAGER','CLERK','ANALYST')ROWNUM을 선언하면 해당 테이블의 행 적제 순서대로 행 번호가 순번으로 부여ORDER BY로 정렬하기 전에 순번이 부여ROWNUM 사용 방법 (정렬 적용)SELECT ROWNUM , A.* FROM ( SELECT * FROM EMP WHERE JOB IN ('MANAGER','CLERK','ANALYST') ORDER BY SAL ) A사용자가 임의로 정렬한 순서대로 순번 ..
[Oracle] 오라클 COUNT OVER 사용 방법 / 그룹별 중복 행(값) 찾기
·
DataBase/Oracle
COUNT와 OVER를 같이 사용하면 GROUP BY 로 그룹화하지 않아도 건수 집계 및 분석이 가능합니다.COUNT만 사용하는 경우 GROUP BY 사용COUNT() OVER() 로 사용하는 경우 GROUP BY 없이 사용전체 행의 개수 구하기 / 조건 부여SELECT EMPNO , ENAME , JOB , SAL , DEPTNO , COUNT(*) OVER() AS TOT_CNT , COUNT(CASE WHEN SAL >= 2000 THEN EMPNO END) OVER() AS CNT_2000 FROM EMP WHERE JOB IN ('MANAGER','CLERK','ANALYST')OVER() 안을 공란으로 두면 전체 행의 개수 집계COUNT()..
[Oracle] 오라클 초를 분(MI), 시간(HH), 일(DD)로 변환하기
·
DataBase/Oracle
초 단위로만 집계된 데이터를 분 / 시간 / 일 단위로 변환하는 방법을 알려 드리겠습니다.초단위 변환SELECT 86400 AS 초 , FLOOR(86400 / 60 ) AS 분 , FLOOR(86400 / (60 * 60) ) AS 시간 , FLOOR(86400 / (60 * 60 * 24) ) AS 일 FROM DUALFLOOR 함수로 소수점 이하를 내림처리 하여 변환 가능합니다.같은 원리로 TRUNC 함수로 소수점 이하를 버림 처리하여 변환 가능합니다.분, 시간, 일 을 따로 곱하면 상세한 계산을 쉽게 처리할 수 있습니다.초단위 집계 SSSSS 활용 방법SELECT SYSDATE , TO_C..
[Oracle] 오라클 ORA-04091 "테이블이 변경되어, 트리거/함수가 볼 수 없습니다" 오류 해결 방법 / "table is mutating, Trigger/Fuction may not see it"
·
DataBase/Oracle Error
원인ORA-04091 오류는 트리거가 참조하고 있는 테이블의 변경 사항이 확정되지 않은 상태에서 동일한 테이블을 다시 참조하려고 할 때, 데이터 일관성을 보장하기 위해 발생대부분 행 수준 트리거(Row-Level Trigger)에서 발생트리거에서 참조하는 테이블과 동일한 테이블을 DML(SELECT, UPDATE, DELETE, INSERT) 하여 접근하는 경우트리거가 직접 또는 간접적으로 다시 호출(재귀 호출)되어 동일한 테이블을 접근하는 경우위의 경우 변경된 내용을 다시 트리거가 참조하게 되어 무한 루프가 발생하기 때문에 오라클이 오류가 발생시킵니다. 해결 방법트리거를 문장 수준 트리거(Statement-Level Trigger)로 변경CREATE OR REPLACE TRIGGER STATEMENT_..
[Oracle] 오라클 ORA-04092 "트리거 안에 COMMIT를 할 수 없습니다" 오류 해결 방법
·
DataBase/Oracle Error
ORA-04092: 트리거 안에 COMMIT를 할 수 없습니다. / 트리거 안에 ROLLBACK을 할 수 없습니다. 위와 같은 오류가 발생하는 경우 해결하는 방법을 알려 드리겠습니다. 원인트리거(TRIGGER) 는 오류가 있으면 ROLLBACK, 오류가 없으면 COMMIT 이 자동으로 처리즉, 트리거 적용 시 AUTO COMMIT 수행되고 있으니 COMMIT / ROLLBACK 명령어가 필요 없다.COMMIT 이나 ROLLBACK 필요 없으므로 삭제해결 방법COMMIT 이나 ROLLBACK이 명령어 삭제 (권장)트리거 내부에서 프로시저를 호출하는 경우 해당 프로시저 안에 있는 COMMIT, ROLLBACK 명령어도 삭제트리거 내에 AUTO COMMIT 해제 기능 추가 (코드가 너무 복잡해서 수정 불가능한..