728x90

 기본 환경: IDE: SQL Developer, Language: Oracle SQL

 

 

발생 Error

Oracle SQL로 다음 Source Code를 실행할 경우,

⚠️ 다음과 같은 Error 발생

ORA-00918: 열의 정의가 애매합니다
00918. 00000 -  "column ambiguously defined"

 

 

발생 원인

TABLE JOIN 시, COL_NAME: SNO, CNO이 2개 이상의 TABLE에 존재하여, SELECT COL_NAME 시 어떤 TABLE에서 COL을 참조해야할지가 불분명함

 

 

해결 방법

중복되는 COL_NAME에는 TABLE_NAME을 명시적으로 지정

 

728x90
728x90

 기본 환경: IDE: SQL Developer, Language: Oracle SQL

 

 

발생 Error

Oracle SQL로 다음 Source Code를 실행할 경우,

⚠️ 다음과 같은 Error 발생

ORA-00934: 그룹 함수는 허가되지 않습니다
00934. 00000 -  "group function is not allowed here"

 

 

발생 원인

WHERE 조건절은 RECORD(ROW) 1개씩 검토하므로 그룹함수*(SUM, AVG, MAX 등)를 사용할 수 없음

* 그룹 함수: 테이블의 전체 행을 하나 이상의 컬럼을 기준으로 컬럼값에 따라 그룹화하여 그룹별로 결과를 출력하는 함수

 

 

해결방법

HAVING 절을 추가적으로 사용

728x90
728x90

👉 기본 환경

- Language: Oracle

 

 

⌨️ 코드

1
2
3
4
5
6
7
  SELECT TO_CHAR(DATETIME'hh') HOUR, COUNT(*) COUNT
    FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME'hh')
  HAVING TO_CHAR(DATETIME'hh24'>= '09' AND TO_CHAR(DATETIME'hh24'< '20'
ORDER BY HOUR
;
 
 

 

 

🖨️오류

ORA-00979: not a GROUP BY expression

 

 

📡 원인

집계함수(SUM, AVG 등)를 제외하고 GROUP BY절에 없는 열을 SELECT에서 조회하거나 HAVING에서 사용

 

 

📰 해결 방법

1
2
3
4
5
6
7
  SELECT TO_CHAR(DATETIME'hh') HOUR, COUNT(*) COUNT
    FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME'hh')
  HAVING TO_CHAR(DATETIME'hh'>= '09' AND TO_CHAR(DATETIME'hh'< '20'
ORDER BY HOUR
;
 
 

 

728x90
728x90

이 글은 뉴렉쳐 오라클 데이터베이스 SQL 강의 수강하며 정리한 글입니다.

 

 

13강 Transaction 처리를 위한 Commit/RollBack

Transaction: 업무 실행단위 / 논리 명령단위
1. 업무적인 단위
‘계좌이체’ 처리
2. 물리적인 명령어 단위
2개 이상의 Update(명령어) 처리 필요
(송금인 계좌-, 수금인 계좌+ 등)
⚠️ 송금인의 계좌에 잔액이 부족한 경우 문제가 발생
→ 모든 쿼리 문장이 문제가 없다는 것이 판명이 되고 사용자의 계좌에 적용이 되어야 함

⭐ 하나의 업무적인 단위인 ‘계좌이체’를 실행하기 위한 물리적인 명령어 단위인 ‘UPDATE’가 한 번에 실행되어야 함
= 하나의 업무적인 단위인 TRANSACTION이 깨지게 해서는 안됨

 

⭐ TRANSACTION이 깨지지 않기 위한 해결 방법
→ 2개이상의 명령어 집합이 하나인 것처럼 묶어서 실행
1. 현재 세션을 위한 임시저장소에서 테스트
= 사용자에게는 모든 명령이 완료되고나서 노출되어야 함
2. 테스트 중 다른 세션이 건드리지 못하도록 LOCK → UNLOCK

 

INSERT한 내용을 다른 사용자에게 노출시켜도 문제가 없을 것이라고 생각이 들면 COMMIT; 입력

 

 

만일, TEST한 내용을 다른 SESSION에 보이고 싶지 않을 경우에는?

 

하나의 세션에서 자료A를 수정하는 도중(COMMIT과 ROLLBACK 아무것도 하지 않은 작업중의 상태) 다른 SESSION에서 수정 또는 삭제를 하려는 경우

→ 작업중인 SESSION에서 COMMIT OR ROLLBACK을 해야 다른 SESSION 작업이 시작될 수 있음

 

→ COMMIT OR ROLLBACK 실행 시, 다른 SESSION의 대기중인 명령문 실행

 

 

⭐ 정리
1. TRANSACTION 단위로 업무 수행을 위해 임시 저장소에서 1개의 TRANSACTION을 수행하기 위한 다수의 명령어 수행
2. 작업 중 다른 SESSION에서 동시에 접근하지 못하도록 LOCK을 걸어둠
3. 작업이 종료되고나서 공유 여부에 따라 COMMIT(다른 SESSION과 최종 결과 공유) OR ROLLBACK(다른 SESSION에 공유하지 않고 수행 결과 삭제) 실행
4. 만일 한 SESSION에서 TEST 중 다른 SESSION이 같은 부분에 대해 접근할 경우, 대기 상태를 유지하고 COMMIT OR ROLLBACK 후, 다른 SESSION이 TEST 수행
→ 이 경우, SESSION간 Data의 차이가 발생할 수 있음

 

 

 

소스 코드

🔗 HJ0216/TIL/OracleSQL

728x90
728x90

 기본 환경: IDE: SQL Developer, Language: Oracle SQL

 

 

발생 Error

Oracle SQL로 다음 Source Code를 실행할 경우,

⚠️ 다음과 같은 Error 발생

ORA-30076: 발췌 소스에 발췌 필트가 부적당합니다

30076. 00000 -  "invalid extract field for extract source"
*Cause:    The extract source does not contain the specified extract field.

 

 

발생 원인

EXTRACT() 사용 시, 데이터 형식에 유의

(일자) YEAR, MONTH, DAY: DATA TYPE = DATE OR DATATIME

(시간) HOUR, MINUTE, SECOND ...: DATA TYPE = DATETIME

 

SYSDATE: DATE TYPE > EXTRACT()로 시간을 추출 할 수 없음

 

 

해결 방법

SYSDATE 대신 SYSTIMESTAMP 형식 사용

 

 

참고 자료

📑 [Oracle] ORA-30076: 발췌 소스에 발췌 필트가 부적당합니다. 해결방법

 

728x90