728x90

바즈라님 | 쿼리 | 2013-06-03 17:09:36


일단 DB2에서는 ORDER BY 절이 디폴트로 대소문자를 구분하지 않고 정렬을 하는 것 같습니다.
예를들어
SELECT *
FROM (VALUES 'a','b','c','A','B','C'
         ) TMP(COL1)
ORDER BY COL1;

의 실행 결과는 다음과 같습니다.
a A b B c C

출력 순서를 아래와 같이 수정하려면 어떻게 해야 할까요?

경우1 : a b c A B C
경우2 : A B C a b c
경우3 : A a B b C c




pajama 2013-06-03 17:42:54
안녕하세요. 방법은 여러가지 있을것 같습니다만..그런데 제가 실행해보기로는 말씀하신 SQL의 결과는 A B C a b c 로 나오네요
찾아보니 translate 함수를 쓰는 방법이 있더군요


$ db2 "select col1 from tmp order by col1"

COL1
----
A
B
C
a
b
c


SQL1)
select col1 from tmp
order by translate 
(col1,
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghujklmnopqrstuvwxyz',
'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ')

SQL1_결과)
COL1
----
a
A
b
B
c
C

SQL2)
select col1 from tmp
order by translate 
(col1,
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghujklmnopqrstuvwxyz',
'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz')

SQL2_결과)
COL1
----
A
a
B
b
C
c

SQL3)
select col1 from tmp
order by translate 
(col1,
'abcdefghujklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghujklmnopqrstuvwxyz')

SQL3_결과)
COL1
----
a
b
c
A
B
C

바즈라 2013-06-03 17:52:30
감사합니다. 위 방법으로 일단 해결했습니다.
근데 디폴트 정렬 순서가 다른 이유가 뭘까요? 혹시 테스트 환경에서 오라클 호환모드 켜셨나요?

pajama 2013-06-03 17:59:40
저도 혹시나해서 DB2_COMPATIBILITY_VECTOR=ORA 설정을 바꿔봤습니다만 동일한 결과였습니다. 9.7이고 AIX환경에서 테스트했습니다.

pajama 2013-06-03 22:02:56
보아하니 코드셋 차이로 보입니다. UTF-8일때는 'A B C a b c' IBM-eucKR, ISO885915 등일때는 'a A b B c C'로 나옵니다.

바즈라 2013-06-04 09:02:46
코드셋 차이로 생기는 문제가 맞군요. 
970, 1363 등의 코드셋은 알파벳 순서가 아스키 코드 순서랑 다른가봅니다. 신기하군요.



728x90
728x90

푸른솔님 | 개발 | 2013-05-31 14:54:16




푸른솔 2013-05-31 14:54:57
본문 내용을 어떻게 붙이는지요? 아무리 해도 본문을 쓸수가 없습니다.

푸른솔 2013-05-31 14:55:51
안녕하세요.. 외부 함수 등록(External function)에 대해 문의를 드립니다.

C로 된 소스이며, 이를 컴파일해서 외부 함수로 등록을 하려고 합니다.

컴파일 옵션
xlc_r -q64 -qarch=auto -qmkshrobj Test.c -o Test.so

이상없이 컴파일되었으며 지정한 디렉토리(db2/v9.7/function)에 등록되었습니다.

그리고 다음과 같이 외부함수를 등록, 실행하였습니다.
CREATE FUNCTION test.TEST_UDF1()
RETURNS INTEGER
SPECIFIC test.TEST_UDF1
EXTERNAL NAME 'test!TestInt'
LANGUAGE C
PARAMETER STYLE DB2SQL
DETERMINISTIC
NOT FENCED
RETURNS NULL on NULL INPUT
NO SQL
NO EXTERNAL ACTION
ALLOW PARALLEL


위에 등록된 함수를 실행해 보면
select test.test_udf1
from sysibm.sysdummy1

Integer값(100)을 리턴해야 하는데 0 또는 1078373값이 리턴됩니다.
오라클만 하다가 DB2를 처음 해 보는데 왜 값이 제대로 리턴 안되는지
도저히 모르겠습니다.

혹시 경험있은분의 도움을 부탁드립니다.


해당부분의 C소스입니다. 그냥 숫자 100을 리턴만 합니다..

int TestInt(void)
{
return 100;
}

DB2 버전은 9.7이며 os는 AIX 6.1입니다....

푸른솔 2013-05-31 14:56:39
본문 작성이 안돼서 댓글로 붙였습니다....

pajama 2013-06-01 16:03:41
DB2에서 C/C++로 함수를 작성할때는 매개변수에 포인터를 사용해야 합니다.
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.routines.doc/doc/c0023758.html

아래와 같이 작성하면 원하시는 결과가 나옵니다.

void TestInt (int *out){
*out=100;
return;

자세한 함수 작성법은 인포센터를 참조하십시오.
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.routines.doc/doc/c0020578.html

푸른솔 2013-06-03 10:41:24
대단히 감사합니다. 덕분에 해결이 됐습니다. 감사합니다.
그런데 char형은 int와 또 다른 모양입니다. 
아래와 같은 char형이 있는데 int와 같이 해 줬는데 안되네요... 물론 링크의 내용도
보고 있습니다.

-- 외부함수호출..
CREATE FUNCTION edge.TEST_UDF2()
RETURNS varchar(100)
SPECIFIC edge.TEST_UDF2
EXTERNAL NAME 'testlib!TestString'
LANGUAGE C
PARAMETER STYLE DB2SQL
DETERMINISTIC
....

-- 외부 함수 C 소스
void TestString(char out[20]) /* *out 도 해 보았습니다 */
{
/* *out = "Character returned."; 이 부분은 에러가 발생합니다 */
/* 그래서 아래와 같이 했는데 값이 안 올라 옵니다 */
out = "Character returned.";
return;
}

한 번만 더 살펴 주시면 감사하겠습니다.
감사합니다.

pajama 2013-06-03 12:26:13
참고하시기 바랍니다.

void TestString(char *out)
{
strcpy(out, "Character returned.");
return;
}

푸른솔 2013-06-03 12:53:43
pajama님...대단히 감사합니다. 드디어 해결이 됐습니다.
오라클하고는 많이 다르네요...
무지 감사드립니다....



728x90
728x90

히로님 | 개발 | 2013-05-29 20:51:41


안녕하세요. DB2는 처음 쓰는 개발자 입니다.
운영DB export후 local로 import 하여 사용하고 있습니다.

날짜 관련 연산에서 쿼리를 수행하게 되면
SQL0182N  날짜 시간 값 또는 레이블된 지속 기간을 갖는 표현식이 유효하지 않습니다.  SQLSTATE=42816

위와 같은 메시지가 나네요.
timestamp 값에서 현재(sysdate -3) 시간을 빼서 최신 글을 몇개를 가지고 오는 쿼리 인듯 합니다.
ex) select   case test_date < sysdate - 3
                     then 0 else 1
                   end flag
           from aaa

헌데, 운영에서는 잘 됩니다..-_-
....._VECTOR=ORA 설정까지 한 상태 이고 
dual로 sysdate - 3 하면 잘 수행 됩니다.(select sysdtae - 3 from dual)
어떤 설정을 해야 sysdate 관련해서 연산을 할 수 있을까요?
도움좀 주세요!

감사합니다.




pajama 2013-05-29 21:38:30
안녕하세요 해당 연산을 수행하려면 DB2_COMPATIBILITY_VECTOR=ORA로 설정을 한 상태에서 DB를 만들어야 합니다.

'db2 get db cfg' 명령 출력에서 Date compatibility 설정이 on인지 확인해보십시오 이 설정은 DB를 생성할때 적용됩니다.

만일 OFF로 되어있다면 sysdate -3 과 같은 연산을 지원하지 않습니다.


히로 2013-05-30 17:18:25
pajama님 말씀대로 VECTOR 설정은 on이지만 콘솔에서 확인해보니 
날짜 호환성 속성이 OFF 네요.ㅜㅜ
다시 DB를 생성하는데 해당 속성을 on으로 하고 만들려면 어떻게 해야 하나요?

지기 2013-05-30 14:55:59
db2 "select sysdate -3 day from sysibm.sysdummy1"

단위는 year, month, day, hour, minute, second 입니다.

DB2_COMPATIBILITY_VECTOR=ORA 설정 하지 않아도 됩니다.


히로 2013-05-30 17:18:53
지기님 답변 감사합니다.
헌데 질문의 요는 timestamp 컬럼과 sysdate-3의 날짜연산이 문제네요.ㅜㅜ


pajama 2013-05-31 00:00:07
해당 속성 (Date compatibility)을 on으로 DB를 만드려면, 만들기전에 db2set DB2_COMPATIBILITY_VECTOR=ORA 하시고 create database ...하시면 됩니다. DB를 생성한 후에는 DB2_COMPATIBILITY_VECTOR=ORA 설정값에 관계없이 말씀하신 연산이 가능합니다.

지기 2013-05-30 18:09:04
db2 "create table aaa (c1 timestamp,c2 char(8),c3 char(5),c4 varchar(10))"
db2 "insert into aaa values(current timestamp,'AAA','BBB','CCC')"
db2 "insert into aaa values(current timestamp,'AA1','BB1','CC1')"
db2 "insert into aaa values(current timestamp,'AA2','BB2','CC2')"
db2 "insert into aaa values(current timestamp,'AA3','BB3','CC3')"
db2 "insert into aaa values(current timestamp,'AA4','BB4','CC4')"
db2 "select * from aaa"

C1 C2 C3 C4
-------------------------- -------- ----- ----------
2013-05-30-17.47.48.694344 AAA BBB CCC
2013-05-30-17.47.58.844898 AA1 BB1 CC1
2013-05-30-17.48.05.732783 AA2 BB2 CC2
2013-05-30-17.48.14.461513 AA3 BB3 CC3
2013-05-30-17.48.23.076692 AA4 BB4 CC4

db2 "select case when c1 > sysdate -3 hour then 0 else 1 end flag from aaa"

FLAG
-----------
0
0
0
0
0

도움이 되실런지 모르겠습니다.

히로 2013-06-03 17:14:31
모두 답변 감사 드립니다
덕분에 해결 하였네요.^^



728x90
728x90

벨기엔님 | 2013-05-28 10:33:48


바로 아래글에 질의한 DB2 입문 유저입니다.
운영시스템에 쿼리에 ROWNUM, DUAL등이 속해 있는 경우 에러가 발생하는데 문제는 실 운영DB에선 별도 생성한 스키마에서
ROWNUM, DUAL등이 사용가능한 반면 제 로컬DB에선 접근이 불가능하다는겁니다 (SYSIBM에 속한것 같은데..)
이 문제를 해결할 방법을 모르겠네요.. 답변 좀 부탁드리겠습니다.




^ㅇ^ 2013-05-28 11:53:41
운영시스템과 로컬의 차이는 제가 볼때는 db2_compatibility_vector가 설정되어 있느냐 안되어 있느냐 차이 같습니다. 한번 확인해 보세요.

pajama 2013-05-28 12:56:27
db2set db2_compatibility_vector=ora 하시고 db2 엔진 재시작한 후 테스트해보십시오

벨기엔 2013-05-28 14:17:45
아 db별 호환설정같은게 있었군요..
^O^님 pajama님 덕분에 해결되었습니다. 정말 감사합니다.



728x90
728x90

벨기엔님 | 개발 | 2013-05-27 19:09:09


안녕하세요 인사 먼저 올립니다.
상황은 이렇습니다.

현재 로컬pc에 IBM DB2 Express-C 버전을 설치하였고 운영서버 테이블과 데이터를 이관하여
DB를 구축한 상태입니다.

제가 DB2의 지식이 전혀 없다보니.. 구글에서 검색하여 유저나 카탈로그 디비 노드등을 추가하고 여차저차 db2move를 이용하여 import까지는 완료한 상태인데요.
기존에 개발된 환경에 로컬디비를 연결하여 웹화면을 띄었는데 에러가 나더군요.

이유는 ROWNUM컬럼이나 DUAL테이블을 사용할수 없다는 것이었는데..
쿼리를 카피하여 로컬환경에서 실행해보니 역시 없다고 나오고 해서 운영서버로 접속하여 디비에 실행해보니 있는것으로 나오더군요.
한참 해매다가 SET SCHEMA = 'SYSIBM' 명령어를 입력하고 다시 쿼리를 실행하니 있는것으로 나오더라구요.

문제는 웹어플을 실행시에 이런식으로 스키마를 SYSIBM으로 변경하지않고 디폴트스키마(?)로 SYSIBM을 지정하고자 합니다.
뭔가 방법이 있을듯한데 제 능력으론 이 부분이 해결이 안되네요.
고수님들에게 답변을 구하고자 합니다. 부탁드리겠습니다.




pajama 2013-05-27 20:58:41
dual 테이블만 필요하시다면 synonym을 만드시는건 어떨지요
create synonym dual for sysibm.dual

jdbc라면 다음과 같이 스키마를 지정할수있습니다.
jdbc:db2://localhost:50000/sample:currentSchema=SYSIBM;

벨기엔 2013-05-28 09:51:53
pajama님 답변 감사드립니다.
제가 착각했던 문제가 ROWNUM이나 DUAL테이블등을 사용하는 쿼리에서 에러가 발생하길래 스키마를 SYSIBM으로 바꾸면 해결될것이라 생각했더니
그럼 아예 실제 운영테이블들을 읽지 못하네요 -_-; A테이블을 쿼리시 SYSIBM.A 는 정의되지 않은 이름이라면서..

벨기엔 2013-05-28 09:56:33
실운영DB서버에서도 SYSIBM이 아닌 별도로 생성한 스키마를 사용하면서 DUAL, ROWNUM등을 사용할수있는데
왜 제 로컬에 설치한 DB에서는 별도로 생성한 스키마로 DUAL, ROWNUM접근이 안되는지 궁금하네요..

벨기엔 2013-05-28 10:15:02
차이를 살펴보다가 TABLESPACES테이블정보에 실운영DB에는 Owner가 SYSIBM으로 되어있는데 반해 제 로컬DB에는 Owner역시 별도 생성한 스키마명으로 들어가있던데 이게 이유일까요?

^ㅇ^ 2013-05-28 11:51:57
오라클 스타일을 쓰실려구 하시나 보네요. 그럼 생성전 부터 db2set db2_compatibility_vector=ora를 주고 db2stop;db2start후 db를 생성하시는게 좋겠습니다. 그러면 DB를 생성하면서 위의 것을 다 만들어 줍니다.



728x90
728x90

귀여운쫑이님 | 설치/관리 | 2013-05-27 16:09:33


안녕하세요. db2를 이제 시작한 사람입니다.

hadr 환경구성 중 질문사항이 있어서 이렇게 첫글을 쓰게 되네요.

현재는 AIX 5.3 6.1 두개의 서버에 DB2 9.7.3 (Fixpack 설치)  완료한 상태입니다.

db2inst1 user가 좀 이상해서, 5.3(A서버라 지칭) 은 user및 instance가 db2inst2 인 상태이며, B서버에는 db2inst2입니다.

문제는, sample db 를 full backup 후 , B서버에 restore를 시켰는데 /home/db2install/db2backup/db2inst1 경로를 찾습니다.

그래서,  B서버 스탠바이 서버쪽에서 newlogpath 옵션을 줘서 특정 디렉토리로 지정한 후 정상적인 restore를 시켜서 문제가 해결 된 줄 알았습니다.


하지만, 더 큰 문제는 두 서버 모두 환경설정도 마치고, monitoring 해본 결과, 모두 정상적으로 결합되었습니다.
takeover 실험으로 프라이머리 서버a에 xxx라는 간단한 테이블을 생성한 후, 스탠바이 서버에서 takove hadr on db sample 이란 명령어로 승계받았습니다.

그 후, sample DB에 connect을 맺은 후, 생성한 테이블을 select해본 결과, SQL0204N  "DB2INST1.EMPLOYEE" is an undefined name.  SQLSTATE=42704 에러가 발생합니다.

제 생각으로, db path자체를 db2inst1로 잡아주고 있는것 같습니다.
.profile 상에서도 inst2로 잡아주었는데 제 생각과 다르게 자꾸 db2inst1 을 잡고 있는 듯 합니다..

혹시 이런 경우 문제를 어떻게 해결해야하는지 궁금합니다.

답변 부탁드립니다.
先, 감사드립니다.




pajama 2013-05-27 17:38:54
primary에서 어느 유저로 테이블을 생성하셨는지? db2inst2 유저로 생성하셨다면 db2inst2.employee 로 생성되었을텐데요

만약에 db2inst2 유저에서 "select * from employee"로 실행할때 저런 오류가 발생한 것이라면 set current schema db2inst1 명령등으로 스키마가 고정되었을 수 있습니다.

db2inst1 유저로 "select * from employee (또는 select * from db2inst1.employee)"로 실행했을때 저런 오류가 발생했다면 primary에서 db2inst2 유저로 테이블을 생성했을 가능성이 있습니다.


귀여운쫑이 2013-05-27 22:42:39
현재상황 : Primary Server (user: db2inst2 table : db2inst2유저로 XX라는 테이블 생성) Standby Server에서 Take over 명령어 후, Standby Server에서(user : db2inst1) select * from XX 실행 시 저런 오류가 발생합니다.

답변자님 말씀과 비슷한 제 짧은 생각이지만 Primary의 db2ins2 유저로 생성했지만, db2inst1.XX로 생성된거 같은데, 스키마 고정 저 명렁어의 상반되는 명령어로 고정을 풀어주면 될까요?

^ㅇ^ 2013-05-28 11:48:19
많이 꼬여있는것 같습니다. db2inst1에서 생성하셨다가 잘 안지워 지구 해서 db2inst2로 강제로 바꾸셨나 보네요. 테스트에서나 발생될 수 있는 문제로, 완전히 깨끗하게 다시 설치하실 것을 권장드립니다. HADR은 특별한 이유가 없는 이상 user나 환경을 거의 동일하게 가져가는것이 좋습니다.


귀여운쫑이 2013-05-28 14:42:37
제가봐도... 이상하게 꼬인것 같습니다. 새롭게 동일한 환경으로 설치해보아야 겠습니다. 답변 감사드립니다.^^



728x90
728x90

권햏님 | 관리/기타 | 2013-05-20 18:11:59


db2 이관 및 암호화 후 db2fmp가 760개 가량 떠있습니다.
약간 줄어들기도하고 늘어나기도 하면서요..

암호화복호화 펑션이 C기반 UDF로 돌아가는데요.

KEEPFENCED = YES일 경우 빠른케싱을 위해 프로세스를 사용하고난 뒤에도 keep해두고

db2fmp가 udf나 procedure 호출시에 멀티스레드로 생성되는건 알겠는데

이렇게 많이 뜨는게 정상인가요?




pajama 2013-05-20 19:12:34
해당 function 생성 옵션이 fenced not threadsafe인지요? 그런 경우에는 각 db2fmp에서 실행된다고 합니다.

GURI 2013-05-31 16:24:41
저도 유사한 문제로 PMR을 진행 한바 있습니다 db2fmp idle 상태에서 재사용 하지 않고 신규 fmp를 생성하는거 같아 요청 자료를 보내 진행 했지만 재사용 한다는 답변을 받았습니다 더이상 진전이 없을 듯 해 close 했지만 아직도 의문이 남네요 암호화 적용사례가 있으시면 공유 부탁드립니다



728x90
728x90

DB는내운명님 | 백업 | 2013-04-19 18:01:23


db2를 배우고 있습니다.  

만약 백업본이 없는 경우 컨테이너를 복구 할려면 어떤 방법이 있나요??

저는 컨테이너를 copy를 해서 복원해볼려고 했는데.. 잘 안되네요...

db2 고수님들의 조언부탁드립니다.

감사합니다.




pajama 2013-04-19 22:19:21
컨테이너를 copy한다는 말씀이 이해가 안되는데요 dd같은 명령을 말씀하시는 건가요?

컨테이너를 복구하신다고 하셨는데 어떤 오류로 인해 복구하시는 것인지요?

백업본을 말씀하시니 해당 컨테이너에 데이터가 있다면 복구확률이 극히 낮지 않나 생각합니다.

냉정과열정사이. 2013-04-22 14:48:03
안될걸요?

^ㅇ^ 2013-04-23 09:53:56
오라클 스타일로 복구 하려고 하셨군요. ㅎㅎ.
오라클의 경우 데이터파일 각각에 특정 시간 마다 checkpoint 번호를 기록하기 때문에 이 DB를 open 할 때 특정 데이터 파일이 이 번호가 다르면 recovery를 해야 됩니다. 즉 이 특성을 이용해 파일 단위로 복구를 할 수 있는 거죠.
DB2는 이렇게 복구 할 수 없습니다. Tablespace 단위로 복구 해야죠. DB2는 대신에 좀 이상한 특성이 있는데 DB를 내린 상태에서 물리적으로 파일을 복사해 두었다가 많은 트랜잭션을 수행후 파일을 예전 것으로 overwrite 해버리면 복구 없이 예전 data를 읽어 들일 수가 있습니다. 물론 meta 정보는 그대로 있는 상황에 한해서죠....



728x90
728x90

DB는내운명님 | 관리 | 2013-04-08 10:36:39


안녕하세요. DB2를 배우고 있습니다.

제가 DB configration 파일 중 SQLDBCON이라는 파라미터를 삭제 해봤습니다.

SQLDBCONF를 삭제해 보니까 system error 나오는 에러 메시지를 확인 할수 있었는데.

SQLDBCON를 삭제해 보니까 아무런 에러 메세지가 나오지 않았습니다.

SQLDBCON를  삭제해도 이상없이 DB가 운영이 되는게 맞는건지 만약 안된다면 어떠한 ERROR 메시지가 나오는지 궁금합니다.

DB2 고수님들의 조언 부탁드립니다. 




pajama 2013-04-08 21:50:17
안녕하세요. SQLDBCONF 파일은 데이터베이스 구성 매개변수가 저장되어 있는 파일입니다. DB2 8.2 버전 이상부터 SQLDBCONF 파일을 사용합니다. SQLDBCON 파일도 DB가 생성될 때 만들어지지만 사용되지는 않습니다. 8.1 버전으로 마이그레이션 하는 경우 사용한다고 합니다만 또다른 경우가 있는지는 모르겠습니다. 공식문서상으로는 파일에 대한 변경작업을 보장하지는 않으므로 해당 파일을 삭제해서 운영하는 건 맞지 않다고 봅니다.

http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.dbobj.doc/doc/c0005219.html

^ㅇ^ 2013-04-17 10:46:50
SQLDBCONF가 손상되는 경우 SQLDBCON를 참고한다고 하네요. 결론은 지우면 안되는 파일... 아래 문서를 참고하세요.
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.dbobj.doc/doc/c0005420.html



728x90
728x90

DB2는내운명님 | 관리 | 2013-03-29 14:13:48


db2를 배우고 있습니다.

test server에서 crash recovery를 하고 싶은데, 우선 비정상적으로 db를 종료시켜야 하는데.. 어떤 방법으로 해야할지 모르겠습니다.

버전은 DB V9.7.6 입니다. 

고수님들의 조언 부탁드립니다.

감사합니다.





pajama 2013-03-29 14:19:26
db2sysc 프로세스를 강제로 종료(kill)하는 방법이 있습니다.

DB는내운명 2013-03-29 14:24:31
감사합니다



728x90

+ Recent posts