레이블이 IBM DB2인 게시물을 표시합니다. 모든 게시물 표시
레이블이 IBM DB2인 게시물을 표시합니다. 모든 게시물 표시

2014-03-14

[DB2]SQL0803N One or more ...SQLSTATE=23505 오류메시지 확인하기

참조URL : http://www.dbforums.com/db2/997011-sql0803n-one-more-sqlstate-23505-a.html


IBM DB2 사용시 아래와 같은 오류메시지를 만나는 경우 오류내용 확인하기
=================
unique constraint or unique index identified by "1" constrains table "schema.table_name" from having duplicate values for the index key..

SQLCODE=-803, SQLSTATE=23505

---
상단과 같은 메시지를 맞닥트리게 되는 경우 아래의 쿼리로 해당 내용을 확인하기 바람.

SELECT *
FROM SYSCAT.INDEXES
WHERE IID = 1
AND TABSCHEMA = 'schema'
AND TABNAME = 'table_name'
;

위의 쿼리결과의 COLNAMES, UNIQUERULE 컬럼의 내용을 확인한 뒤, 인덱스가 중복되는지 확인하는 쿼리를 사용하여 점검한다.

SELECT table_name의 컬럼들, count(*) as qty
from table_name
group by table_name의 컬럼들
having  count(*) > 1
order by qty
;

위의 쿼리 결과에서 나오는 값은 중복된 인덱스를 가진 결과값이므로 해당 데이터를 보정해야 된다.

2014-01-13

DB2] DB2에서 특정 컬럼명을 가지고 있는 테이블 리스트 찾기.

IBM DB2 에서 특정 컬럼명을 가진 테이블 리스트를 구하는 방법.

1.
select * 
from syscat.columns 
where colname = '확인할컬럼명' -- 컬럼명은 대문자
;

2.
select * 
from syscat.columns 
where remarks like 'comment한 이름' -- 컬럼명은 대문자
;

1. 은 컬럼명을 알 때 사용 가능하고, 2. 는 테이블 생성시 remarks 에 코멘트를 달아 놓은 경우에 해당 작업으로 확인이 가능하다.

** 해당 스키마를 알면 해당 스키마에서만 찾고자 하는 컬럼명을 사용하는 테이블을 조회가 가능하다.

2013-10-25

DB2] DB2 에서 Assignment of a NULL value to a NOT NULL column 의 오류 발생시

DB2 로 프로그램 개발시 ,
Assignment of a NULL value to a NOT NULL column 메시지와 함께
"TBSPACEID=XX, TABLEID=XX, COLNO=XX" 라는 오류 메시지를 받게 되는 경우 아래의 방법으로 확인가능.

1.
select * from syscat.tables 
where tableid = xx 
;

로 해당 테이블 명을 확인.

2.
select * 
from syscat.columns 
where tabname = '확인한 테이블명'
and colno = xx;

로 해당 컬럼을 확인하여 조치를 취할 수 있다. 

2013-09-05

DB2] Alter table ... drop column

보통 DB에서 alter table  작업은 다음과 같이 한다.

alter table table_name 
drop column column 
;

위의 문장은 table_name 의 column 컬럼을 제거하겠다는 명령이다. 

하지만 db2에서 위 명령을 실행한 후, 

select * from table_name; 

명령을 실행하면 

SQL0668N Operation not allowed for reason code "7"

과 같은 오류를 발생시키면서 select 쿼리를 실행하지 못한다. 


이런 경우, 

reorg table table_name ;

을 실행하면 위의 오류가 해결 된다.

***
column 추가
==>
    alter table table_name
        add column column_name data_type ;


column 명 변경
==>
    alter table table_name
        alter column column_name_org
              set default 'modified_column_name' ;

pk 삭제
==>
    alter table table_name
        drop primary key

pk 추가
==>
    alter table table_name
        add primary key field_name

column 의 data type 변경
==>
   alter table table_name
         alter column column_name
             set data type 변경할 데이터 타입.


=========================================

pk 변경하기 위한 작업절차


-- pk 에 추가할 컬럼 생성. (pk 이기 때문에 not null 로 생성해야 됨)
alter table <테이블명>
    add column <컬럼명> <데이터타입> not null default 1
;

-- 테이블 데이터 확인.
select *
from <테이블명>
;

commit;

-- reorg 작업.
reorg table <테이블명> ;

-- pk 제거
ALTER TABLE <테이블명>
  drop PRIMARY KEY
;

-- pk 재생성
ALTER TABLE <테이블명>
  ADD PRIMARY KEY
    (pk 컬럼1, pk 컬럼2, ... , pk 컬럼N  )
;



CREATE SEQUENCE <Sequence명>
  AS INTEGER
  START WITH 1
  CACHE 20
  ORDER
;


---- 
sequence 삭제
drop SEQUENCE <Sequence명>

2013-06-10

Select 에서 여러 행을 하나의 행으로 합쳐서 뽑고자 하는 경우


Select 쿼리를 사용하여 나온 결과가 여러행인 경우 키값이 같은 경우 하나의 행으로 보여주고자 하는 경우, 아래의 쿼리를 사용하여 간단하게 원하는 결과값을 얻을 수가 있다.

아래 쿼리는 DB2에서 재현을 해본 결과 해당 쿼리가 무난하게 돌아가는것을 확인하였다.


실행 쿼리 :
=================================
with tb(docno, seqno, prot, empno) as
(
select '1111' docno, 1 seqno, 1 prot, 'AAAA' empno from dual union all
select '1111' , 1 , 2 , 'BBBB' from dual union all
select '5555' , 3 , 1 , 'KKKK' from dual union all
select '5555' , 3 , 2 , 'MMMM' from dual union all
select '5555' , 3 , 3 , 'PPPP' from dual
)
select docno
, seqno
, listagg(empno,' ') WITHIN GROUP (ORDER BY seqNO, prot) as empno
from tb
group by docno
, seqno
;


실행 결과 :
=================================
docno seqno   empno
1111 1     AAAA BBBB
5555 3     KKKK MMMM PPPP


내용 출처 : http://www.oracleclub.com/article/51669

아래의 링크도 참조하기 바랍니다.
 http://blog.naver.com/PostView.nhn?blogId=jauroy&logNo=50044746370

위에 사용된 listagg() 란 함수에 대해 찾아보다가 발견한 아래의 페이지도 참고 바랍니다.
http://blog.naver.com/PostView.nhn?blogId=joonaha&logNo=70108717698

2013-05-10

SQL] DB2 date 를 milliseconds 로 변환하기.


DB2
=======
select to_number(sysdate - to_date('1970-01-01','YYYY-MM-DD')) * (24 * 60 * 60 * 1000)
FROM sysibm.sysdummy1 ;


ORACLE
========

select to_number(sysdate - to_date('1970-01-01','YYYY-MM-DD')) * (24 * 60 * 60 * 1000)
FROM dual;


2013-02-19

DB2] 프로시저 script 확인하는 쿼리

-- procedure명으로 조회.
select * from SYSIBM.SYSPROCEDURES where PROCNAME like '%프로시저 명%';

-- oracle 의 dual 에 해당하는 테이블 :: sysibm.sysdummy1
select current_timestamp from sysibm.sysdummy1;

2012-11-03

DB] DB2에서 merge into 사용


merge 문장의 문법 :

merge into tableA  a
using (
select * from tableB
) b
  on (   a.aaa = b.bbb  --// 조회 조건.
     )
 when matched then
                      update 문장. <== tableA에 업데이트할 항목 나열
when not matched then
                      insert 문장.   <== tableA에 insert 할 항목 나열.
else ignore;


설명 :
 merge into 문장은 insert / update 작업을 한번에 할 수 있는 장점이 있는 sql 구문이다.
그러나, 사용상 주의점은 b 로 묶인 select 문장의 조회 결과가 없는 경우, when 조건절에 걸리지 않는 상황이 발생하는걸 경험했다.


현재까지의 결론.
 1. merge into 는 tableA 에 대해 insert / update 작업을 한번에 수행한다. 
    단, a.aaa = b.bbb 가 일치하는 항목에 대해.
 2. merge into 는 "select * from tableB" 에서 조회 결과가 없으면 when ... 을 무시한다. 
    결과적으로 else ignore 가 실행되는 듯 하다.