테이블의 데이터를 다른 테이블로 그대로 옮겨야 할 때가 있다.

Excel Export / Inport를 통한 방법이나 기타 여러 방법들이 있긴 한데 아무래도 귀찮은 방법이기도 하고. 그래서 Select Insert Query를 주로 사용한다.


1
2
INSERT INTO A_TABLE a
SELECT * FROM B_TABLE b WHERE b.no = '1'
cs


가장 기본적으로 위와 같은 구성으로 시작할 수 있다. A_TABLE에 B_TABLE의 데이터 중, no가 1인 항목만을 넣는 쿼리이다.


만약, 특정 컬럼에 대해서만 select insert를 한다면? 다음과 같다.


1
2
3
4
5
6
7
8
INSERT INTO A_TABLE a
    ( no , title , content , insert_date , insert_user )
SELECT 
    no , title , content , insert_date , insert_user
FROM
    B_TABLE
WHERE
    no = '1'
cs


위와 별개로, 다른 user에 할당된 테이블에 넣기 위해서는? 

회사에서는 하나의 DB에 user 단위로 운용/개발 DB가 분리되어있다. 당연하게도 dba 권한으로 아래의 쿼리를 이용해주면 된다.


1
2
3
4
5
6
7
8
INSERT INTO user_1.A_TABLE a
    ( no , title , content , insert_date , insert_user )
SELECT 
    no , title , content , insert_date , insert_user
FROM
    user_2.B_TABLE
WHERE
    no = '1'
cs


user_1은 user_2에 접근할 수 없기에 dba 권한으로 둘 다 접속이 가능한 상태에서 select / insert를 수행해주면 된다.


블로그 이미지

김생선

어장에서 바라보는 세상

지난글, 2013/06/26 - [어장 프로그래밍/어장 DBA] - [MSSQL] MAX 함수 NULL 일 때 치환 에서는 MSSQL을 기준으로 글을 작성하였다.

현재 개발중인 플젝의 DB는 informix로 되어있고, 위와 같은 방식으로 max null 값을 구하려 했더니 informix 에서는 isnull 함수가 사용불가능하더라.


검색 해 보니 NVL 이란 함수가 있었고, 아래와 같은 방식으로 사용하였다.



SELECT NVL(MAX(testColumn), '0')+1 tempName FROM testTableName


testColumn의 MAX 값을 구하고, 이 값이 null 일 경우에는 0으로 치환한 후, 그 값에 +1을 하여 tempName 이라는 임시 컬럼명으로 Select 한다는 내용이다.(내가 써놓고 뭔가 어정쩡한 설명이란 생각이 든다.)


아무튼, 테스트를 해 보니 testColumn 값이 null 이 아니더라도 정상적으로 쿼리가 작동하기 때문에 만족하고 사용중. 뭐 이렇게 하면 된다.


블로그 이미지

김생선

어장에서 바라보는 세상

where 조건을 줄 때, form 에서 영문자를 받을 일이 흔하다.

그리고 이 영문자로 where 조건을 주게 되는데, like 검색을 할 때에는 대소문자를 구분한다.


가령 컬럼에 KimFish 라고 값이 입력이 되어있고, form 에 입력된 조건이 kimfish 일 경우엔 조회가 안된다는 말.

따라서 like 쿼리에 대소문자 구분 없이 값을 입력해주는 function을 지정해줘야 하는데, 이것이 바로 upper function 되시겠다.


SELECT 

*

FROM

   테이블명 

WHERE 

upper(조회할 컬럼명) LIKE '%'||upper('입력받은 조건')||'%'


뭐 이런식.


내가 알기로는 대부분의 디비툴에서 사용 가능한 것으로 알고 있다.


** 추가 **

검색해본 적용 가능한 DBA

Oracle , MySql , MsSql, Informix

블로그 이미지

김생선

어장에서 바라보는 세상

java.lang.OutOfMemoryError: Java heap space


2013:08:02 14:19:00



프로그램에서 서버 쿼리를 실행중에 위와 같은 에러가 발생하였다면 자신의 톰캣 서버 메모리를 의심해보아야 한다.


그리고 문제 해결 방법은 아래와 같다.


1. 이클립스 서버탭


이클립스 서버탭의 해당 톰캣 서버를 더블클릭한다.


2013:08:02 14:22:00

(이미지 설명 : 이 글에서는 Started 된 서버를 더블클릭 한다)



2. Server Overview


2013:08:02 14:24:39

(이미지 설명 : 톰캣 서버를 더블클릭하면 보이는 서버 오버뷰)



여기에서 파랑색으로 삐뚤삐둘 밑줄 쳐진, Open launch configuration 링크를 클릭한다.



3. Arguments


2013:08:02 14:28:45

(이미지 설명 : 사실 톰캣 서버는 여기에서 선택 가능하다)


선택한 서버가 실행중이라면 저러한 붉은 표시로 Server already running 이란 메시지를 띄우게 된다. 

해당 톰캣 서버를 멈추고, 밑줄쳐진 Arguments로 이동하자.



4. 설정 추가


2013:08:02 14:31:18


붉은 밑줄 부분이 아마도 추가가 안되어있을텐데, 현 시스템 상황에 고려하여 메모리 항목을 추가해주면 된다.

필자는 아래와 같은 형식으로 추가를 하였다.


 -XX:MaxPermSize=128m -Xms128m -Xms512m




그리고 적용시키면 방금 전 에러는 빠이염!

여러분, 즐프하십셔~



블로그 이미지

김생선

어장에서 바라보는 세상

equal to 작업에서의 "Korean_Wansung_CS_AS"과(와) "Korean_Wansung_CI_AS" 간의 데이터 정렬 충돌을 해결할 수 없습니다.


이 문제의 경우는 join에서 발생한다. 조인하려는 두 테이블의 각 컬럼 속성을 잘 보면 데이터 정렬란이 있는데 이 부분이 Korean_Wansung_CS_AS 이거나 CI_AS인데(물론 이 이외에도 많다) 각 컬럼이 다르기 때문에 발생하는 에러사항이다.


해결방법은 


A.컬럼명 collate Korean_Wansung_CI_AS = B.컬럼명 collate Korean_Wansung_CI_AS


와 같은 예시로 각 컬럼명을 대입해주는 방식으로 해결할 수 있으나, 나의 경우엔 실패했고...


귀찮아서 디비의 속성을 까보고 각 컬럼의 데이터 정렬 속성이 다르기에 확 그냥 바꿔주는 식으로 해결했다.


두번째 방법은 디비 정렬 속성을 바꾸는 것도 있겠다.

블로그 이미지

김생선

어장에서 바라보는 세상

티스토리 툴바