728x90
728x90

 

단순하게도 .. 뭔가 하나 빠져있거나 추가 되었을 때 이런 오류가 나타난다

예를들면 나의 경우 SELECT 절에 맨 마지막으로 불러오는 항목에 쉼표(,)를 붙여서

위 오류가 발생했다!

추가적으로 ,,0이렇게 되었을 때도 오류가 나왔다

 

한번 짝이 다들 맞나 쉼표가 더 들어간 곳은 없나 확인해보길!!!

728x90
728x90
728x90

UNION ALL 등으로 연결해준 SELECT 문일 경우
위의 대응하는 갯수와 아래 대응하는 갯수가 일치해야 하며
각 순서의 데이터 유형도 동일해야 합니다!!!

예를들어 설명하자면 

SELECT 0 AS A1
  FROM DUAL
UNION ALL
SELECT '가나다' AS A1
   FROM DUAL



위 SELECT 문을 조회해보면 오류가 나타나는 것을 볼 수 있습니다~~
아래 SELECT 문의 '가나다'를 1로 변경하여 돌려보시면 
위 SELECT문의 첫번째 조회 값인 것과 데이터 유형(NUMBER)가 동일하여 오류가 발생되지 않습니다!!

해결 끝------ ( ̄︶ ̄)↗ 

728x90
728x90
728x90

간단하지만 은근히 놓치는 오류인데요,
우리가 PK, UK, FK 등으로 중복되는 키를 생성하지 못하도록 설정을 해놓는데
테이블에 동일한 데이터를 2개 이상을 만들려고 하면 이 오류가 발생이 됩니다!

예를들어 EMP 테이블에 키가 EMPNO(사번) 일 경우,
EMPNO 1이 존재하는데 1을 사번으로 하여 추가 하려고 할 때 오류가 발생이 됩니다!

ALL_CONSTRAINT 테이블에서 해당하는 테이블을 조회하고 
어떤 제약조건이 걸려있는지 확인하고 해결하는 경우도 존재합니다!

우선 이 오류가 발생하였을 때는 INSERT나 UPDATE하려는 문의 조건으로 넣어서 조회되는 내역이 있는지 확인 해주세요!

SELECT * 
  FROM EMP
WHERE EMP = '1'

2021.04.22 - [하루모아태산─[공부]/함께 하는 SQL 공부.] - SQL_ CONSTRAINT

728x90
728x90
728x90

 

XA 트랜젝션 관련 즉, 분산 트랜젝션 관련 문제라고 한다.

나같은 경우 왜 이런 오류가 발생하였냐면 @를 통해 다른 DB서버와 연결을 해주는데

몇개는 A라는 서버고 B라는 서버고 이런식으로 하다보니까 저런 오류가 발생했다

확인하고나서 얼마나 놀랬던지 휴,,

728x90
728x90
728x90

 

나같은 경우는 이런 오류가 발생한 원인은 이미 테이블에 데이터가 있는 상태에서
기본키 내 컬럼을 뺐더니 중복되는 데이터 값이 존재해서 불가능하였다.

예를들면 테이블 A가 방문일자, 방문시간, 이름 ... 이 런식으로 컬럼이 존재한다고 했을 때
기존에는 방문일자, 방문시간, 이름이 기본키 그룹에 해당하고, 방문일자, 방문시간이 새로운 기본키 그룹으로 만들려고 했을 때
테이블 내 방문일자, 방문시간이 동일한 데이터가 존재해서 오류가 발생하는 것이다!

그래서 기본키가 3개일때에서 갯수를 +1, +2하는건 오류가 발생하지 않으나 -1, -2 였을때는 오류가 발생하니 
이점 유의해서 사용해주면 된다!!

 

 

728x90
728x90
728x90

CREATE TABLE TABLE명
SELECT *
FROM TABLE 명 

나같은 경우는 CREATE와 SELECT 사이에 AS 가 들어가야 하나 들어가지 않아서 이러한 오류가 발생했다

INSERT INTO VALUES등과 같이 들어가야 하나 들어가지 않은 부분이 있을 경우 이러한 오류가 발생될 수 있으니 한번 확인해보자!

728x90
728x90

오류 사항을 아무리 검색해봐도 나오지 않고
뭐 이 단계에서 해당 체인이 있는지 여부를 확인하라고 하는데 뭔 말인지 모르겠었다.

우선 나의 경우 오류가 발생한 원인은
MERGE INTO를 사용할 때
WHEN MATCHED THEN
UPDATE
SET
문에서 SET에 PRIMARY KEY가 포함되어 있어서 오류가 발생했다.

PRIMARY KEY를 제외하고 돌리니 정상적으로 실행이 되었다.


728x90
728x90
728x90

 

MS-SQL같은 경우는 DATEDIFF 같은 함수가 존재하여 차이를 구할 수 있다고 하는데
ORACLE은 함수가 존재하지 않아 계산을 해줘야 한다.

 

[그림1]을 참고하여 설명을 해보도록 하겠다

TO_DATE를 이용해서 우선 이게 날짜 함수라는걸 인식하게 해준다.
TO_DATE이 형식을 우선 정리하자면 아래와 같다.
 - YYYY : 년도
 - MM   : 월
 - DD    : 일
 - HH24/ HH : 시간
 - MI     : 분
 - SS     : 초

이걸 이용해서 시간 차이를 구해주면 된다

TO_DATE를 이용하여 시간을 빼주는데 이때 나온 결과 값에 * 24를 해줘야 하루 24시간에 맞춰 총 시간을 알 수 있다.
여기에 1시간이 60분이니 * 60을 해주면 총 몇분인지 알 수 있고
*60을 추가로 더 해주면 총 몇초인지 알 수 있게 된다.

728x90
728x90

예를들어
CASE WHEN 조건 THEN (RETURN VARCHAR 값) ELSE (RETURN NUMBER 값) END
로 하였을 경우 THEN 과 ELSE 내의 RETURN 하는 자료형이 맞지 않아 이러한 오류가 발생한다
데이터 유형이 일관해야 하므로 RETURN VARCHAR에 TO_NUMBER을 해주거나 
RETURN NUMBER에 TO_CHAR을 사용하여 넣어주면 된다

 

자료형이 일치하는지를 우선적으로 보면 해결되는 SQL 오류!

728x90
728x90

예제로 하나 먼저 보여주자면
TO_CHAR('12','FM99')
이렇게 사용이 된다

* FM 에서
- 9 :: 내용이 없다면 그냥 생략
- 0 :: 내용이 없더라도 포함해서 자리수 만들어주기 ( 소수점에서 0도 내용이 없다고 판단 )

예시
1) 2 ▶ 'FM9900' , 'FM0099'

SELECT TO_CHAR('2','FM9900'),TO_CHAR('2','FM0009')
FROM DUAL


0이 2번째자리까지 있으니 02로 나오고
0이 4번째자리까지 있으니 0002로 나오게 된다

2) 5 ▶ 'FM0.9', 'FM9.0'

SELECT TO_CHAR('5','FM0.9') , TO_CHAR('5','FM9.0')
FROM DUAL


소수점 아래로 내용이 없으니 5.
상관없이 나와야하니 5.0

3) 0.12 ▶ 'FM09.99', 'FM90.99', 'FM99.99'

SELECT TO_CHAR('0.12','FM09.99'), TO_CHAR('0.12','FM90.99'), TO_CHAR('0.12','FM99.99')
FROM DUAL


소수점 위 두번째 자리까지 존재하니 00.12
소수점 위 첫번째 자리까지 존재하니 0.12
소수점 위에는 없으니 .12

728x90

+ Recent posts