ORA-12704: 문자 집합이 일치하지 않습니다.


이 에러를 처음 접한 곳은 PL/SQL


즉 프로시저를 사용하면서 접하게된 에러이다.


실제로 발생한 에러 문구는


PL/SQL: ORA-12704: 문자 집합이 일치하지 않습니다


이런식의 내용이였다.


에러의 발생 과정은


개발 서버에서 사용중이던 프로시저를 수정하게 되어


수정사항을 그대로 운영서버에 적용하고 나서 생긴 오류였다.


개발서버에서는 잘 돌아갔는데 운영서버에서 에러가 발생한 이유가 무었일까 하던찰나


"문자 집합이 일치하지 않습니다."


라는 문구를 보고 해당 컬럼의 타입을 살펴보니


VARCHAR2NVARCHAR2 로 


개발서버와 운영서버의 타입이 차이가 있었다.


해결 방법은 찾아보니 간단했다.


VARCHAR2 컬럼의 데이터를 가지고 NVARCHAR2에 사용하고자한다면


UNISTR(VARCHAR2 컬럼) 을 사용하면


에러 없이 잘 돌아간다.


반응형

- MERGE INTO

ORACLE에서 제공하는 MERGE INTO 구문에 대해 알아보자.

 

테이블에 데이터가 이미 있으면 업데이트를 실행하고, 없을경우 값을 넣어줘야 하는 경우에

MERGE INTO 구문을 사용하지 않는다면, 

 

1. 값이 있는지 확인

2. 있으면 UPDATE

3. 없으면 INSERT

 

이렇게 3개를 선언을 해줘야 한다.

오라클에서는 이런 작업을 한번에 처리를 할 수 있도록 도와주는 구문을 제공하는데 이게 바로 MERGE INTO 구문이다.

 

하나하나 자세히 알아가보도록 하자.


▷ [구문] 

MERGE INTO [TABLE / VIEW] - update 또는 insert할 테이블 혹은 뷰
    USING [TABLE / VIEW / DUAL] - 비교할 대상 테이블 혹은 뷰 (위 테이블과 동일할 경우 DUAL을 사용)
    ON [조건] - UPDATE 와 INSERT 처리할 조건문 (조건이 일치하면 UPDATE / 불일치 시 INSERT)
    WHEN MATCHED THEN 
          UPDATE SET
          [COLUMN1] = [VALUE1],
          [COLUMN2] = [VALUE2],
          ...
          (DELETE [TABLE] WHERE [COLUMN 1] = [VALUE 1] AND ...) - UPDATE 뿐만 아니라 DELETE 구문도 사용 가능
    WHEN NOT MATCHED THEN
         INSERT (COLUMN1, COLUMN2, ...)
         VALUES (VALUE1, VALUE2, ...)

 

구문에 대해 알아봤으니 이제 예제 코드를 통해 접근해보자.

 

예제 1) 서로 다른 테이블 비교 후 MERGE INTO

MERGE INTO employee emp
  USING (SELECT salary, dev, age
      FROM develop
      WHERE emble = '0010') t
  ON (emp.dev = t.dev)
  WHEN MATCHED THEN
  	UPDATE SET emp.emble = '0701' , emp.rog = 'snake'
  WHEN NOT MATCHED THEN
  	INSERT (emp.emble, emp.rog, emp.tag)
  	VALUES (#{emble}, #{rog}, #{tag})

 

예제 2) 같은 테이블 비교 후 MERGE INTO

MERGE INTO employee
  USING DUAL ON (dev = #{dev} AND rog = #{rog})
  WHEN MATCHED THEN
  	UPDATE SET emble = #{emble} , rog = #{rog}
  WHEN NOT MATCHED THEN
  	INSERT (emp.emble, emp.rog, emp.tag)
  	VALUES (#{emble}, #{rog}, #{tag})

이렇게 두가지 경우에 대해 예제를 통해 알아봤는데,

MERGE INTO 구문은 개발하다보면 많이 사용할테니 알아두면 좋을것이다.

 

사용하기에 앞서 몇가지 알아둬야할게 있다.

 

해당 MERGE INTO 구문은 오라클 9i 버전 이상부터 사용 가능하며,

ON 조건절에 사용된 컬럼은 UPDATE가 불가능하다.(되도록 PK로만 비교하자)

 

그리고 구문에서 설명한것처럼 DELETE 구문을 사용할 수 있다고 하였는데, 이는 오라클 10g 버전 이상부터 사용 가능하다.

 

애초에 9i버전은 merge into구문이 불안전 하다는 말이 있어 안전하게 10버전이상부터 사용을 권장한다.

merge into문을 통해 많은 데이터를 다룰 경우에는 성능이 저하될 수 있으니 잘 사용하자.

 

반응형

- 오라클 버전 확인하기 -


쿼리문을 통해 현재 사용중인 오라클 버전이 무엇인지 확인하는 방법에 대해 알아보자.


SELECT * FROM PRODUCT_COMPONENT_VERSION;

▷ 결과


SELECT * FROM v$version;

▷ 결과

 

위 두개의 쿼리문을 사용하면 결과 처럼 오라클의 버전, 서버 운영체제 및 버전 등을 확인할 수 있다.

 

하나하나 다 확인하기 귀찮다면 그냥 Oracle 관련한것만 뽑아서 쓰면 된다.

SELECT * FROM v$version WHERE banner LIKE 'Oracle%';

추가적으로 sqlplus 를 사용하여 버전을 확인하는 방법이 있어 기록해둔다.(출처제타위키)

 

반응형

업무를 하다보면 중복된 데이터를 찾는 상황이다 해당 중복된 데이터들이 필요한 순간이 온다


실제로 그런 순간이 와서 찾아본 결과


괜찮게 정리된 블로그가 있어 기록해둔다.


이제 중복된 데이터를 찾는 방법에 대해 알아보자


출처 : https://aljjabaegi.tistory.com/86 [알짜배기 프로그래머]



대한민국 법정동코드가 들어있는 CM_KIK_B 라는 테이블을 가지고 예를 들어보자



간단하게 중복된 데이터를 찾는 방법은


찾고자 하는 중복된 데이터 컬럼을 대상으로 GROUP BY 한 후에


HAVING 절로 COUNT가 1 이상인 것을 가져오면 된다.


그럼 전국적으로 중복되는 "동(KIKB_DONG_NM)" 을 찾아보도록 하자


SELECT T1.KIKB_DONG_NM, COUNT(*)

  FROM CM_KIK_B T1

 GROUP BY T1.KIKB_DONG_NM

 HAVING COUNT(*) > 1 ;


[결과]



GROUB BY  ~ HAVING 절 말고도


분석함수를 사용하여 중복된 데이터를 가져올 수 있다.


SELECT T1.*

  FROM (

        SELECT S1.KIKB_DO_NM , S1.KIKB_DONG_NM

 , COUNT(*) OVER(PARTITION BY S1.KIKB_DONG_NM) AS OVERLAP

          FROM CM_KIK_B S1

          ) T1

  WHERE T1.OVERLAP > 1 ;


[결과]




출처 : https://aljjabaegi.tistory.com/86 [알짜배기 프로그래머]


반응형

SQL Developer를 사용하다가


테이블의 데이터 혹은 특정 조건으로 뽑아낸 데이터를


엑셀 파일로 가져와야할 필요가 있는 상황이 닥친다.


SQL Developer는 해당 데이터를 엑셀로 export해주는 기능이 있는데


한번 알아보도록 하자.



특정 조건을 만족하는 데이터들을 뽑고자 한다




조건을 입력해 출력된 데이터목록에 마우스 우클릭을하고

[익스포트] 를 클릭해주자





그럼 아래와 같은 익스포트 마법사 라는 창이 뜨는데

우선 형식을 excel 2003+ (xlsx) 로 변경해주도록 하자.





형식을 바꾸었다면 이제

워크시트의 이름을 설정해주고

파일을 내보낼 위치를 지정하고 다음을 눌러주도록 하자





익스포트 마법사 - 단계 2/2 

로 넘어왔다면 해줄건 딱히 없다 완료를 눌러주자






이제 파일 추출한 경로를 따라 엑셀파일을 열어보면

그대로 추출되는것을 확인할 수 있다.






모든 데이터를 엑셀로 추출하고 싶으면

모든 데이터를 select 해서 위와같이 하거나


좌측에 해당 테이블에 마우스 우클릭하고 절차대로 엑셀로 익스포트 해주면 된다.



반응형

WITH

- WITH 구문은 보통 서브쿼리를 사용할때 많이 사용하고는 한다. (가독성과 성능면에서 우수하다.)

- 일반 서브쿼리는 서로를 참조할 수 없지만 WITH절은 서로 참조가 가능하다.

- 오라클 9버전 이상에서 지원하는 구문이다.

- WITH 구문을 사용한 쿼리는 인라인뷰나 임시 테이블로 여긴다.


예제 1) WITH 구문의 일반적인 사용방법

-- 구문
-- WITH ALIAS명 AS (SUB 쿼리)
-- SELECT 컬럼명 FROM ALIAS명;

WITH TEST AS (SELECT a.deptno , b.emptno FORM a,b)
SELECT * FROM TEST;

 

예제 2) WITH 구문 안에서 두개의 쿼리문 사용

-- 구문
-- WITH ALIAS명 AS (SUB 쿼리),
--      ALIAS명 AS (SUB 쿼리)
-- SELECT 컬럼명 FROM ALIAS명1, ALIAS명2 WHERE 조인조건;

WITH TEST AS (SELECT a.deptno AS deptno1 , b.emptno FORM a,b) ,
     TEST2 AS (SELECT a.deptno AS deptno2, a.salaray , c.voc , c.label FROM a,c)
SELECT * FROM TEST, TEST2 WHERE TEST.deptno1 = TEST2.deptno2;

이렇게 두개의 예제를 통해 오라클 WITH 구문에 대해 알아봤는데,

예제 처럼 서브쿼리를 많이 사용할때 사용해주면 가독성 측면에서 매우 좋을것이다.

반응형