SQL0418N 오류

DB2 | 2006. 5. 9. 11:17
Posted by 시반
개괄 : [IBM][CLI Driver] SQL0418N SQLSTATE=42610
          명령문에 유효하지 않은 매개변수 표시문자가 사용되었습니다.
 
원인:

다음 경우에는 유형이 지정되지 않은 매개변수 표시문자를 사용할 수 없습니다.

  • SELECT 목록에서
  • 날짜 시간 산술 연산의 유일한 인수로
  • 경우에 따라 스칼라 함수의 유일한 인수로
  • ORDER BY절에서 정렬 키로

다음과 같은 경우 매개변수 표시문자를 사용할 수 없습니다.

  • 준비된 명령문이 아닌 명령문에서
  • CREATE VIEW문의 fullselect에서
  • CREATE TRIGGER문의 트리거 조치에서
  • DB2 Query Patroller가 캡처하는 쿼리에서

명령문을 처리할 수 없습니다.

 
사용자 응답:

 

명령문의 구문을 정정하십시오. 유형이 지정되지 않은 매개변수 표시문자가 허용되지 않는 경우, 매개변수 표시문자에 데이터 유형을 제공하려면 CAST 스펙을 사용하십시오.

sqlcode : -418

sqlstate : 42610

 

한마디로 ?부분을 cast처리를 해줘야 한다는 말

예를 든면 CAST( ? AS VARCHAR(12)) 로 처리 하면된다

 

'DB2' 카테고리의 다른 글

DB2 에서의 OUTER JOIN  (0) 2006.06.01
DB2에서의 부분범위 처리  (0) 2006.06.01
SQLCODE: -301 오류  (0) 2006.05.08
SQL30081N 오류  (0) 2006.05.02
DBMS별 날짜 포맷변환  (0) 2006.04.13
 

SQLCODE: -301 오류

DB2 | 2006. 5. 8. 19:16
Posted by 시반

개괄 

 Oracle환경에 개발된 소스를 DB2로 옮긴 후 런타임시 PreparedStatement의 setString(int,String)이 사용된곳에서 SQLCODE: -301 에러가 난다

 증상

com.ibm.db2.jcc.c.SqlException: DB2 SQL error: SQLCODE: -301, SQLSTATE: 07006,SQLERRMC: 1

 환경

Websphere5.0, DB2 8.0, JDK1.4, Struts1.1
DB접속환경
data source : org.apache.commons.dbcp.BasicDataSource
driver : com.ibm.db2.jcc.DB2Driver
jdbc type : type4

원인 

PreparedStatement구문의 setXXX()와 database쪽의 데이타타입의 불일치

테이블의 컬럼의 데이타타입이  decimal 인 곳에 해당하는 파라미터의 값지정시  setString으로 세팅시 에러발생 즉, varchar타입이 아닌곳은 모두 에러 발생.

조치

Database쪽의 데이타 타입과 일치시킴.(오라클은 데이타타입과 무관하게 setString으로 가능..)

여기서, 문제는 java소스내의 preparedstatement의 파라미터 셋팅에 관계되는 모든 변수가 String이기에
setXXX(int,String) 이여만한다.
쿼리문의 파라미터 셋팅하는 곳이 소스내에 5000여곳이 넘게 존재하므로 각각에 올바른 데이터타입으로 셋팅하게 수정하는것은 불가능.


[1차 해법]
setString(int,String)을 모두 setObject(int,Object)로 변경했음(317개화일의 5000곳이상에 존재하는 setString을...ㅠㅠ)
자동케스팅이 되므로 성공. (하지만 좀더 좋은 방법을 찾아봄 - 순노가다이므로ㅡㅡ;)

[2차 해법]
Datasource를 DB2의 것(com.ibm.db2.jcc.DB2DataSource)으로 변경하여 수정
DB2DataSource.setDeferPrepares(false); // 기본값은 true
로 설정하면 setString(int,String)으로도 DB상의 타입에 맞게 자동케스팅이 일어남.
그러나, true의 경우보다 성능은 떨어진다고 함.(DB2 인포메이션센타에서)
테스트 성공 (1차의 경우보다 덜 노가다. 하지만 더 좋은 방법 모색 ㅡㅡ;; )

[3차 해법-최종안]
처음의 Source를 그대로 유지
datasource : org.apache.commons.dbcp.BasicDataSource
preparedstatement의 파라미터 셋팅도 setString(int,String) 그대로 둠.
변경사항 : JDBC접속 url에 파라미터 첨가.
jdbc:db2://host:portNumber/DBname  -> jdbc:db2://host:portNumber/DBname:deferPrepares=false;
(여기서 세미콜론도 꼭 있어야됩니다.)

다른 소스의 변경없이
테스트 성공. ㅡㅡ;;;;;;; (초간단)

'DB2' 카테고리의 다른 글

DB2에서의 부분범위 처리  (0) 2006.06.01
SQL0418N 오류  (0) 2006.05.09
SQL30081N 오류  (0) 2006.05.02
DBMS별 날짜 포맷변환  (0) 2006.04.13
DB2 migration 중 발생한 에러  (0) 2006.04.06
 

SQL30081N 오류

DB2 | 2006. 5. 2. 18:14
Posted by 시반

개괄 : 서버의 db2에 클라이언트 컴퓨터로 접속을 하면 SQL30081N 오류가 난다.

 

증상

 

[IBM][CLI Driver] SQL30081N 통신 오류가 발견되었습니다.

사용 중이던 통신 프로토콜: "TCP/IP". 사용 중이던 통신 API: "SOCKETS". 오류가 발견된

위치: "". 오류를 발견한 통신 함수 : "connect".

프로토콜 고유의 오류 코드: "10061", "*", "*". SQLSTATE=08001

 

적용 버전 : Version 7 (Version 8에서도 같은 오류메시지가 나오더군요)

 

적용 platform : Windows NT, Windows 2000, Windows 98, Windows 95, AIX

 

가능한 원인

가능한 원인은 다음과 같습니다.

1) db catalog가 제대로 되지 않아서

2) 통신 모듈이 제대로 올라오지 않아서

3) 통신 서비스가 등록이 제대로 되지 않아서

 

조치

- ping server_ip_address

- db cfg 확인(server / client)

- 서비스 name 확인

- db catalog 확인

-> db2 catalog database db_name as db_alias_name at node node_name authentication client

- node catalog

-> catalog tcpip node node_name remote host_name server service_name

* authentication 를 확인해 보세요..

server의 환경과 client의 catalog가 제대로 되어 있는지 반드시 확인하세요

 

흐음..저같은 경우엔 DB2서버 ip가 바뀌었더군요.(바부~*^^*)

다시 재설정후 문제없이...

'DB2' 카테고리의 다른 글

SQL0418N 오류  (0) 2006.05.09
SQLCODE: -301 오류  (0) 2006.05.08
DBMS별 날짜 포맷변환  (0) 2006.04.13
DB2 migration 중 발생한 에러  (0) 2006.04.06
oracle에서 DB2로 migration  (0) 2006.04.06
 

DBMS별 날짜 포맷변환

DB2 | 2006. 4. 13. 14:52
Posted by 시반

DBMS 별 시간, 날짜 조회 쿼리

 

Oracle

select sysdate from dual; 날짜+시분초 까지 조회가능                                

select current_timestamp from dual;  날짜+밀리초+시간존 까지 조회          

MS SQL

 

select getdate()    날짜 + 밀리초 단위까지 조회가능                                   

 

DB2 UDB

select current timestamp from sysibm.sysdummy1  날짜+밀리초까지 조회

select current date from sysibm.sysdummy1          날짜만 조회              

select current time from sysibm.sysdummy1            밀리초 단위시간조회  

 

DBMS 별 default date format

Oracle      

YY/MM/DD  (한글)                                                                                      

DD-MON-YYYY  (영어)                                                                                 

MS SQL

YYY/MM/DD HH:MI:SS   (한글)                                                                     

MM-DD-YYYY HH:MI:SS   (영어)                                                                   

DB2 UDB

YYYY-MM-DD-HH:MI:SS.MMMMMM (TIMESTAMP 타입)                                

YYYY-MM-DD (DATE 타입)                                                                          

HH:MI:SS.MMMMMM (TIME 타입)                                                               

 

날짜 포맷 변환표

 

형식

 

RDBMS

변환 문법

'YYYY.MM.DD'

Oracle

 

TO_CHAR(date_exp, 'YYYY.MM.DD')

 

MSSQL

 

CONVERT(VARCHAR, date_exp, 102)

 

DB2

 

REPLACE(CHAR(DATE(date_exp),ISO), '-', '.')

 

 'HH:MI:SS'

Oracle

 

TO_CHAR(date_exp, 'HH:MI:SS')

 

 

MSSQL

 

CONVERT(VARCHAR, date_exp, 108)

 

DB2

 

CHAR(TIME(date_exp) , JIS )

 'YYYY/MM/DD'

 

Oracle

 

TO_CHAR(date_exp, 'YYYY/MM/DD')

 

MSSQL

 

CONVERT(VARCHAR, date_exp, 111)

 

DB2

 

REPLACE(CHAR(DATE(date_exp), ISO), '-', '/')

 'YYYYMMDD'

 

Oracle

 

TO_CHAR(date_exp, 'YYYYMMDD')

 

MSSQL

 

CONVERT(VARCHAR, date_exp, 112)

 

DB2

 

CHAR(DATE(date_exp))

 'HH24:MI:SS'

 

Oracle

 

TO_CHAR(date_exp, 'HH24:MI:SS')

 

MSSQL

 

CONVERT(VARCHAR(8), date_exp, 114)

 

DB2

 

CHAR(TIME(date_exp) )

 'YYYY.MM.DD HH24:MI'

 

Oracle

 

TO_CHAR(date_exp, 'YYYY.MM.DD HH24:MI')

 

MSSQL

 

CONVERT(VARCHAR, date_exp, 102) + ' ' + CONVERT(VARCHAR(5), date_exp, 114)

 

DB2

 

REPLACE(CHAR(DATE(date_exp), ISO), '-', '.') || CAST( TIME(date_exp) AS CHAR(5))

 'YYYY/MM/DD HH24:MI:SS'

 

Oracle

 

TO_CHAR(date_exp, 'YYYY/MM/DD HH24:MI:SS')

 

MSSQL

 

CONVERT(VARCHAR, date_exp, 111) + ' ' + CONVERT(VARCHAR(8), date_exp, 114)

 

DB2

 

REPLACE(CHAR(DATE(date_exp), ISO), '-', '/') || CAST( TIME(date_exp))

 

 

'DB2' 카테고리의 다른 글

SQLCODE: -301 오류  (0) 2006.05.08
SQL30081N 오류  (0) 2006.05.02
DB2 migration 중 발생한 에러  (0) 2006.04.06
oracle에서 DB2로 migration  (0) 2006.04.06
SQLState messages reported by SQL  (0) 2006.04.05
 

DB2 migration 중 발생한 에러

DB2 | 2006. 4. 6. 15:35
Posted by 시반
COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/AIX64] SQL0668N  이유 코드 "3"(으)로 인해 테이블 "KUSER.KRVT_RE_ESTM_DETL"에서 조작이 허용되지 않습니다.  SQLSTATE=57016

--> 테이블 로드 작업시에 취소하거나 실패되었을때 작업이 진행중으로 남아 테이블 엑세스가 거부되는 경우 발생함.

 결국 마이그레이션을 다시 하기 전까지 DB2를 사용하지 못했습니다

이런 어처구니없는 일이....

 백업의 중요성을 또한번....-_-

'DB2' 카테고리의 다른 글

SQL30081N 오류  (0) 2006.05.02
DBMS별 날짜 포맷변환  (0) 2006.04.13
oracle에서 DB2로 migration  (0) 2006.04.06
SQLState messages reported by SQL  (0) 2006.04.05
01 Basic SQL Procedure Structure  (0) 2006.04.03
 

oracle에서 DB2로 migration

DB2 | 2006. 4. 6. 15:30
Posted by 시반

난이도 : 초급

Cindy Wong, Database Consultant, IBM
Samuel Poon, Database Consultant, IBM

2005 년 9 월 08 일

데이터베이스 관리자 커뮤니티에서 엄선한 IBM DB2® Universal Database™ 관련 추천 필독 리스트를 소개한다.

머리말

이 글에서 DB2 UDB for Linux, UNIX®, and Windows®관련 온라인 교육자료 리스트를 소개한다. DB2 UDB Information Center역시 좋은 자료들을 많이 갖추고 있다. 이 글에 소개된 많은 목록들은 IBM developerWorks의 기술자료와 IBM Redbook으로 소개된 것들이다. DB2 데이터베이스 관리, 설치, 마이그레이션, 관리, 모니터링 및 튜닝, 가용성, 데이터베이스 포팅(Porting), 문제 확인 등으로 범주를 나누어 정리하였다.





설치와 마이그레이션

DB2 UDB for Linux, UNIX, Windows 문서 활용하기
http://www.ibm.com/developerworks/db2/library/techarticle/dm-0412chong/

  • 유형: 기술자료
  • 레벨: Introductory
  • 날짜: 2004년 12월
  • 다양한 DB2 UDB 제품 정보의 소스들을 설명하고 있다. DB2 정보 센터, 릴리스 노트, 기술 노트, 플래시가 어떻게 다른지를 이해할 수 있다. 다른 유형의 정보들을 찾을 때 어떤 리소스를 사용해야 하는지, 누가 이 정보를 발표했는지, 이러한 정보 소스들이 어떻게 업데이트되는지 등의 DB2 정보 검색에 대한 팁도 제공한다.

분산 DB2 UDB 서버 비교(한글)
http://www.ibm.com/developerworks/db2/library/techarticle/0301zikopoulos/0301zikopoulos1.html

  • 유형: 기술자료
  • 레벨: Introductory
  • 날짜: 2005년 5월
  • 분산 IBM DB2 Universal Database (DB2 UDB) 제품군의 기본 라이센싱 규칙, 기능, 특징의 차이 등을 이해하기 쉽도록 표로 만들었다.

DB2 Version 8의 분산 에디션 중 자신에게 맞는 에디션 찾기
http://www.ibm.com/developerworks/db2/library/techarticle/0211zikopoulos/0211zikopoulos.html

  • 유형: 기술자료
  • 레벨: Introductory
  • 날짜: 2005년 5월
  • 이 글은, Version 8.2.2의 제품 기능, 에디션, 라이센싱에 대한 최신 소식들로 구성된다. 필자는 여러 옵션들과 여기에 기존 사용자 환경을 DB2 에디션에 매핑시킨 참조표도 제공한다.

개발자와 데이터베이스 관리자를 위한 DB2 Universal Database
http://www.db2mag.com/story/showArticle.jhtml?articleID=23902542

  • 유형: 기술자료
  • 레벨: Introductory
  • 최근 릴리스 된 DB2 Universal Database는 개발자와 DBA를 위한 기능들을 많이 갖추었다. DB2 UDB v.8.2는 데이터베이스 관리자와 개발자들의 생산성을 높이고 복잡한 데이터 관리 요구 사항들을 충족시킬 수 있는 기능들을 제공한다. 새롭고 향상된 기능을 만나보자.

IBM DB2 UDB Express Edition 설치하기
http://www.ibm.com/developerworks/db2/library/techarticle/0306gao/0306gao.html

  • 유형: 기술자료
  • 레벨: Introductory
  • 날짜: 2003년 6월
  • DB2 UDB Express에서는 편리한 응답 파일 방식의 DB2 설치가 가능하다. 이로서 DB2 UDB Express 전개가 쉬워지며 DB2를 개인의 애플리케이션 프로그램에 임베딩 할 수 있다. 이 글에서 리눅스와 Microsoft Windows에서 완벽한 DB2 응답 파일 프로세스를 설명한다.

DB2 V7 데이터베이스를 DB2 UDB Version 8.1에 마이그레이션하기
http://www.ibm.com/developerworks/db2/library/techarticle/dm-0403liu/index.html

  • 유형: 기술자료
  • 레벨: Introductory
  • 날짜: 2004년 3월
  • 최신 DB2 버전의 장점과 쉬워진 마이그레이션을 배운다. 이 글에서는 V8.1.4 업데이트의 새로운 기능과 향상된 부분을 요약했다. 준비에서부터 실제 마이그레이션, 마이그레이션 후속 작업 등 전체 마이그레이션 과정을 설명한다.




관리

DB2 UDB DBA 체크리스트
http://www.ibm.com/developerworks/db2/library/techarticle/dm-0404snow/index.html

  • 유형: 기술자료
  • 레벨: Introductory
  • 날짜: 2004년 4월
  • 자동차와 마찬가지로 데이터베이스 역시 최적으로 실행시키기 위해서는 점검이 필요하다. 이 글에서 데이터베이스 점검에 대한 모든 것을 자세히 다룬다.

DB2 UDB Version 8.2의 RUNSTATS의 가이드라인과 예제
http://www.ibm.com/developerworks/db2/library/techarticle/dm-0412pay/

  • 유형: 기술자료
  • 레벨: Intermediate
  • 날짜: 2004년 12월
  • RUNSTATS는 옵티마이저가 데이터로 가는 가장 빠른 경로를 결정할 때 사용되는 목록 통계를 업데이트하는 DB2 UDB의 유틸리티이다. DB2 UDB V8.2에서 RUNSTATS 옵션의 수가 많이 증가하였다. RUNSTATS 사용 방법을 이해하는 것이 최적의 퍼포먼스를 끌어내기 위한 시작이라 할 수 있다.

DB2 제품군들 간 데이터 이동하기
http://www.redbooks.ibm.com/abstracts/sg246905.html

  • 유형: Redbook
  • 레벨: Intermediate
  • 날짜: 2003년 2월
  • DB2 제품군(DB2 for z/OS, DB2 for Linux, DB2 for UNIX, DB2 for Windows)에서 현재 사용할 수 있는 기능, 툴, 유틸리티가 어떤 것이 있는지를 분석했다. 고성능 언로드(unload) 툴, 로드 유틸리티의 새로운 크로스 로더 옵션 등에 초점을 맞추었다. 또한 Federated Database 개념과 예제를 설명한다.

DB2 UDB 메모리 모델: DB2가 메모리를 사용하는 방법
http://www.ibm.com/developerworks/db2/library/techarticle/dm-0406qi/index.html

  • 유형: 기술자료
  • 레벨: Introductory
  • 날짜: 2004년 6월
  • DB2가 메모리를 사용하는 방법의 기초를 설명한다. 32 비트 메모리 아키텍쳐의 한계도 자세히 다룬다. 지원 플랫폼(AIX, Solaris, HP-UX, Linux, Windows)별 가장 일반적인 메모리 할당 문제들을 예제를 통해 설명한다.





모니터링과 튜닝

DB2 UDB v8.1과 데이터베이스 튜닝 방법: 고성능 지침서
http://www.ibm.com/developerworks/db2/library/techarticle/dm-0404mcarthur/index.html

  • 유형: 기술자료
  • 레벨: Intermediate
  • 날짜: 2004년 4월
  • DB2 UDB 데이터베이스와 애플리케이션에서 최적의 퍼포먼스를 이끌어 내야 하는 여러분을 위한 지침서이다. 다양한 개발 단계에서 구현할 수 있는 기술들을 설명한다. 여기에는 데이터베이스 디자인 및 레이아웃 기술, 데이터베이스 설정, SQL 구문 디자인, 관리, 모니터링 등이 포함된다.

AIX의 데이터베이스 퍼포먼스 튜닝
http://www.redbooks.ibm.com/abstracts/SG245511.html

  • 유형: Redbook
  • 레벨: Intermediate
  • 날짜: 2003년 1월
  • RDBMS 퍼포먼스 전문가들이 제시하는 힌트와 팁들로 구성된 레드북이다. 퍼포먼스 관점에서 본 일반적인 데이터베이스 레이아웃 개념, 디자인 및 사이징 가이드라인, 튜닝에 대한 조언, DB2 UDB, Oracle, IBM Informix 데이터베이스의 퍼포먼스 및 튜닝 정보를 설명한다. 이 글에서 제시된 퍼포먼스 팁은 시스템 관리자 또는 데이터베이스 관리자들이 변경할 수 있는 것들과 연관되어 있다. (이 글에서는 애플리케이션과 데이터베이스 디자인에 관련된 퍼포먼스 튜닝(SQL 쿼리 튜닝) 문제는 다루지 않는다.

고성능 OLTP 와 BI를 위한 DB2 UDB ESE V8 non-DPF 퍼포먼스 가이드
http://www.redbooks.ibm.com/abstracts/SG246432.html

  • 유형: Redbook
  • 레벨: Intermediate
  • 날짜: 2004년 4월
  • AIX와 Windows 2000 플랫폼이 포함된 DB2 UDB ESE V8 환경에서 고성능 OLTP와 BI 애플리케이션을 구현하는 방법을 자세하게 설명한다. DB2 애플리케이션 개발자와 데이터베이스 관리자(DBA)를 위한 레드북이다.

퍼포먼스 튜닝 기초
Part 1: http://www.db2mag.com/story/showArticle.jhtml?articleID=12803202
Part 2: http://www.db2mag.com/story/showArticle.jhtml?articleID=15300098
Part 3: http://www.db2mag.com/story/showArticle.jhtml?articleID=17602321

  • 유형: 기술자료
  • 레벨: Introductory
  • 날짜: 2003년 3사분기 – 2004년 1사분기
  • DB2 Universal Database (UDB) version 8.1(Linux, UNIX, Windows)은 간단한 스탠드얼론 시스템에서 복잡한 서버 그리고 다양한 플랫폼을 실행하는 클라이언트 환경까지 존재할 수 있다. 환경과 상관 없이 사용자들은 한 가지 문제에 집중한다. 바로 데이터베이스 애플리케이션의 퍼포먼스이다.

퍼포먼스 모니터링
Part 1: http://www.db2mag.com/story/showArticle.jhtml?articleID=18901270
Part 2: http://www.db2mag.com/story/showArticle.jhtml?articleID=23903573
Part 3: http://www.db2mag.com/story/showArticle.jhtml?articleID=51200282

  • 유형: 기술자료
  • 레벨: Introductory
  • 날짜: 2004년 2사분기 – 2004년 4사분기
  • 데이터베이스 퍼포먼스를 높이기 위해서는 퍼포먼스가 어디에서 고통을 받고 있는지와 이를 개선할 방법을 규명해야 한다. DB2 Universal Database (UDB)의 퍼포먼스 모니터링 툴을 소개한다.

DB2 모니터링 데이터에 SQL로 액세스하기: 테이블 기능으로 스냅샷 찍기
http://www.ibm.com/developerworks/db2/library/techarticle/0305deroos/0305deroos.html

  • 유형: 기술자료
  • 레벨: Introductory
  • 날짜: 2003년 5월
  • DB2 UDB Version 8.1은 SQL 테이블 기능을 사용하여 데이터베이스 시스템 모니터를 캡쳐하는 기능이 있다. 그 기능을 자세히 설명한다.

자바 프로그램으로 설명하는 DB2 UDB OLTP 튜닝
http://www.ibm.com/developerworks/db2/library/techarticle/dm-0508chong/

  • 유형: 기술자료
  • 레벨: Intermediate
  • 날짜: 2005년 8월
  • 이 글은 단계별 기술을 설명한다. IBM DB2 Universal Database (UDB) 데이터베이스 서버를 모니터링 및 튜닝할 때 적용되는 기술을 단계별로 설명한다. 샘플 자바 프로그램인 "PERFORMER"를 사용하여 기술을 배우고 자신의 시스템에도 적용해 본다. 이 글에서는 중요한 DB2 UDB 설정 매개변수들을 튜닝하는 방법에 초점을 맞추어 설명한다. "잘못된 쿼리"를 포착하여 픽스하는 방법도 설명한다.

DB2 SQL 액세스 경로 튜닝
http://www.ibm.com/developerworks/db2/library/techarticle/0301mullins/0301mullins.html

  • 유형: 기술자료
  • 날짜: 2003년 1월
  • 데이터베이스계의 "구루" Craig Mullins가 액세스 경로 및 조인(join) 메소드의 기초를 설명하고 SQL 퍼포먼스를 감시 및 튜닝하는 Explain 툴의 사용법을 설명한다.




가용성(High availability)

DB2 UDB를 위한 가용성 및 재해 복구 개요
http://www.ibm.com/developerworks/db2/library/techarticle/0304wright/0304wright.html

  • 유형: 기술자료
  • 날짜: 2003년 4월
  • 데이터의 가용성과 재배 복구 기능은 중요한 데이터베이스 시스템의 핵심 조건이다. 이 글에서 DB2 UDB의 해당 기능들을 요약했다.

DB2 Universal Database와 가용성 데이터 스토어
http://www.ibm.com/developerworks/db2/library/techarticle/0310melnyk/0310melnyk.html

  • 유형: 기술자료
  • 날짜: 2003년 10월 9일
  • 중요한 데이터베이스 애플리케이션들은 데이터 손실을 방지하고 높은 가용성의 데이터 스토어를 보장하는 강력한 전략을 필요로 한다. 이 글에서 리눅스, UNIX, Windows 플랫폼의 고가용성 옵션들을 연구한다.

DB2 UDB V8.1 ESE와 HACMP 4.4.1을 이용한 AIX의 가용성: 상호 인계 시나리오
http://www.ibm.com/developerworks/db2/library/techarticle/dm-0407nikolopoulou/

  • 유형: 기술자료
  • 날짜: 2004 년 7월
  • 데이터의 가용성은 온 디맨드 환경의 필수조건이다. 이 글에서 IBM AIX®상에 고 가용성 클러스터 멀티 플로세싱(HACMP)로 DB2 UDB의 일부를 고가용성 기능으로 설정하는 방법을 설명한다.

고 가용성 환경에서 분산 DB2 Universal Database (DB2) Version 8 서버 리스닝
http://www.ibm.com/developerworks/db2/library/techarticle/0301zikopoulos/0301zikopoulos.html

  • 유형: 기술자료
  • 날짜: 2004년 9월 업데이트
  • 고 가용성 환경에 DB2 서버를 정확히 라이센싱하려고 하는가? 시간이 없거나 아니면 공지 레터, PLET, 라이센싱 시트가 눈에 들어오지 않는가? Paul Zikopoulos와 Leon Katsnelson이 친절하게 설명한다.

웹 캐스트: 새로운 고 가용성 솔루션으로 복구로부터 DB2 데이터 보호하기
http://www.ibm.com/software/sw-events/webcast/S416746W05344Z10.html

  • 유형: 웹 캐스트
  • 날짜: 2005년 4월 - 2005년 9월
  • High Availability Disaster Recovery (HADR) 솔루션을 자세하게 다룬다. HADR은 오류에 강한 데이터베이스 복제(스탠바이 데이터베이스)를 만들어서 관리한다. 이것으로 정전 시 데이터를 보호할 수 있다. 원래 데이터베이스가 정전 시, 이 스탠바이 데이터베이스에서는 DB2 워크로드를 인계하는 것이 단지 몇 초 만에 가능하다. 주 데이터베이스에 액세스하는 클라이언트는 자동으로 스탠바이 데이터베이스로 리다이렉션 된다. IBM DB2 UDB는 데이터베이스의 빌트인 기능으로 HADR을 제공한다.





리눅스 플랫폼

리눅스용 DB2의 설치 및 실행
http://www.redbooks.ibm.com/abstracts/SG246899.html

  • 유형: Redbook
  • 날짜: 2003년 2월
  • 리눅스는 지난 몇 년 동안 가장 빠르게 성장한 서버 운영 플랫폼이다. DB2 Universal Database는 이 분야의 기술을 선도하고 있다. 이 글에서 DB2 Universal Database (UDB)와 SuSE 및 Red Hat 리눅스를 통합하는 방법을 설명한다.

DB2 통합 클러스터 환경 전개 가이드
http://www.redbooks.ibm.com/abstracts/SG246376.html

  • 유형: Redbook
  • 날짜: 2004년 10월
  • 리눅스용 IBM DB2 통합 클러스터 환경은 최고의 소프트웨어, 하드웨어, 서비스를 결합할 수 있는 사전에 테스트를 완료한 고성능 솔루션이다. 이 글에서 DB2 Integrated Cluster Environment에 대한 자세한 내용을 설명한다.

DB2 ICE – 리눅스 클러스터를 활용한 데이터 스케일링
http://www.db2mag.com/story/showArticle.jhtml?articleID=51000442

  • 유형: 기술자료
  • 날짜: 2004년 4사분기
  • DB2 Universal Database (UDB)는 리눅스 클러스터에 지원을 추가한 최초의 상용 데이터베이스였다. 200년 12월에 처음 등장했다. 2003년, IBM은 통합 데이터베이스 솔루션인 DB2 Integrated Cluster Environment (ICE)을 도입했다.




Windows 플랫폼

Windows 환경의 DB2 UDB V8.2
http://www.redbooks.ibm.com/redbooks.nsf/RedbookAbstracts/sg247102.html

  • 유형: Redbook
  • 날짜: 2004년 10월
  • IBM DB2 Universal Database Version 8.2는 DBRM 기술 분야에서 또 한번의 중요한 도약을 했다. 정보 관리 고객들의 늘어나는 요구 사항들을 다룬 새로운 기능을 다루게 되었다. 이 레드북은 "DB2 UDB Exploitation of the Windows Environment (SG24-6893)"의 업데이트라고 할 수 있다. DB2 UDB Version 8.2의 기능과 특징에 초점을 맞추었다.

Windows 환경에서 DB2 UDB 활용하기
http://www.db2mag.com/showArticle.jhtml?articleID=51000442

  • 유형: Redbook
  • 날짜: 2003년 3월
  • Microsoft Windows 2000과 DB2 UDB V8.1을 효과적으로 구현하는 방법을 다루고 있다. Windows에 DB2 UDB 설치, 설정, 관리에 관심이 있는 누구라도 독자가 될 수 있다.

Windows Server 2003에서 DB2 UDB 스케일링
http://www.redbooks.ibm.com/abstracts/SG247019.html

  • 유형: Redbook
  • 날짜: 2003년 8월
  • 본서는 Windows Server 2003에서의 DB2 UDB V8.1의 스케일링 가이드이다.




포팅(Porting)

DB2 UDB 포팅(Porting): 자료 및 로드맵
http://www.ibm.com/developerworks/db2/zones/porting/

  • 유형: 웹 사이트
  • IBM DB2 Universal Database 포팅 웹 사이트에서는 다른 데이터베이스 관리 시스템에서 DB2 UDB로 애플리케이션과 데이터를 포팅할 때 필요한 정보를 제공한다. 포팅 및 마이그레이션 과정이 간략하게 설명되어 있다. 자세한 내용은 Porting steps 탭에서 참조할 수 있다.

IBM DB2 마이그레이션 툴킷
http://www.ibm.com/software/data/db2/migration/mtk/

  • 유형: 웹 사이트
  • IBM DB2 Migration Toolkit은 Oracle (버전 7, 8i, 9i), Sybase ASE (버전 11 ~ 12.5), Microsoft SQL Server (버전 6, 7, 2000), Informix (IDS v7.3와 v9), Informix XPS (지원이 제한되어 있음) 에서 DB2 UDB V8.1와 DB2 V8.2 (Windows, UNIX, Linux)로의 마이그레이션을 위한 툴이다. DB2 iSeries에는 iSeries v5r3이 포함되어 있다. DB2 Migration Toolkit은 다양한 플랫폼(Windows 2000, Windows NT 4.0, Windows XP, AIX, Linux, HP/UX, Solaris)상에서 사용할 수 있다.

Microsoft SQL Server와 IBM DB2 UDB 간 변환 가이드
http://www.redbooks.ibm.com/redpieces/abstracts/sg246672.html

  • 유형: Redbook
  • 날짜: 2005년 5월
  • Microsoft SQL Server 데이터베이스와 애플리케이션을 IBM DB2 UDB로 변환할 때 참조할 있는 가이드북이다. 본 레드북은 변환 시 기술적 고려 사항과 방법을 중점적으로 설명한다. SQL Server와 DB2 UDB의 차이점을 비롯하여 제품 아키텍쳐, 데이터 유형, SQL 언어, 데이터베이스 객체(테이블, 인덱스, 저장 프로시져, 트리거), 관리 기능 등도 설명한다. 아울러 마이그레이션 툴의 사용법과 툴의 적절한 사용처도 설명한다.

Microsoft SQL Server 2000에서 DB2 UDB Version 8.2로 포팅(Porting)하기
http://www.ibm.com/developerworks/db2/library/techarticle/dm-0501rada/

  • 유형: 기술자료
  • 날짜: 2005년 1월
  • 데이터베이스와 애플리케이션의 포팅에 관련된 DB2 UDB 제품에 대해 배우고 Microsoft SQL Server 2000 에서 DB2 UDB V8.2로 애플리케이션을 포팅할 때 중요한 부분을 설명한다. 데이터베이스 옵션, 데이터 정의 언어(DDL), 데이터 모델링, SQL 고려사항, 데이터 변환, 애플리케이션 변환 등을 중심으로 두 제품을 비교한다.

Sybase Adaptive Server Enterprise에서 DB2 Universal Database Version 8.1로 포팅(Porting)하기
http://www.ibm.com/developerworks/db2/library/techarticle/0307rada/0307rada.html

  • 유형: 기술자료
  • 날짜: 2003년 7월
  • IBM DB2 UDB 제품들과 이것의 기능을 소개하고 데이터베이스와 애플리케이션 포팅 및 Sybase Adaptive Server Enterprise에서 DB2 UDB V8로 애플리케이션을 포팅할 때 고려해야 할 측면들을 설명한다. 데이터베이스 옵션, 데이터 정의 언어(DDL), 데이터 모델링, SQL 고려사항, 데이터 변환, 애플리케이션 변환 등을 중심으로 두 제품을 비교한다.

Oracle과 DB2 UDB간 변환 가이드
http://www.redbooks.ibm.com/abstracts/SG247048.html

  • 유형: Redbook
  • 날짜: 2003년 11월
  • DB2 Universal Database (DB2 UDB)는 오랫동안 이 분야의 기술을 선도했다. IBM 레드북에서는 Oracle에서 DB2 UDB Version 8.1로 데이터베이스 시스템을 마이그레이션 하는 방법을 설명한다. 마이그레이션 전략과 플래닝, 마이그레이션 툴, 마이그레이션 예제를 상세히 설명한다.

데이터베이스 이동: Informix Dynamic Server에서 DB2 Universal Database로
http://www.redbooks.ibm.com/abstracts/SG246367.html

  • 유형: Redbook
  • 날짜: 2004년 12월
  • IBM Informix Dynamic Server (IDS) Version 9.4에서 IBM DB2 Universal Database Version 8.2로 이동할 때 고려 사항과 방법들을 중점적으로 설명한다. 본 레드북에서는 데이터 애플리케이션과 관리 분야의 기본적인 주제들을 다룬다. 또한 두 제품을 잘 이해할 수 있도록 두 제품의 아키텍쳐 개요도 실었다. Informix용 DB2 Migration Toolkit의 기능도 설명하여 실제 변환 과정에 쉽게 적용할 수 있도록 하였다.

MySQL과 DB2 UDB간 변환 가이드
http://www.redbooks.ibm.com/abstracts/SG247093.html

  • 유형: Redbook
  • 날짜: 2004년 5월
  • DB2 Universal Database (DB2 UDB)는 오랫동안 이 분야를 선도해왔다. MySQL 에서 DB2 UDB Version 8.1(Linux)로 데이터베이스 시스템을 마이그레이션 하는 방법을 설명한다.

Move data using the IBM DB2 Migration Toolkit
http://www.ibm.com/developerworks/db2/library/techarticle/dm-0411yip/

  • 유형: 기술자료
  • 레벨: Intermediate
  • 날짜: 2004년 11월
  • 최근 애플리케이션을 IBM DB2 Universal Database (UDB)로 포팅(porting)했는가? Oracle 또는 SQL Server의 기존 데이터를 DB2 UDB로 옮겨야 하는가? IBM DB2 Migration Toolkit을 사용해보자.

DB2 루틴을 사용한 쉬운 마이그레이션
http://www.ibm.com/developerworks/db2/library/techarticle/dm-0402greenstein/

  • 유형: 기술자료
  • 레벨: Introductory
  • 날짜: 2004년 9월
  • 다른 관계형 데이터베이스 관리 시스템(RDBMS)에서 DB2로 마이그레이션을 하는가? 마이그레이션을 도울 몇 가지 루틴을 소개한다.





문제 확인

FFDC 데이터 분석
http://www.db2mag.com/db_area/archives/2003/q1/sanders.shtml

  • 유형: 기술자료
  • 날짜: 2003년 1사분기
  • 암호화된 First Failure Data Capture (FFDC) 정보를 더 이상 두려워하지 말라. FFDC는 DB2의 가장 유용한 진단 툴이다.

문제가 무엇입니까?
http://www.db2mag.com/showArticle.jhtml?articleID=17700355

  • 유형: 기술자료
  • 날짜: 2004년 1사분기
  • db2support를 사용하여 자동으로 분석할 수 있다. IBM DB2 Universal Database (UDB) 관리자는 시스템 설정을 늘 간결하게 설명하려고 노력한다. 하지만 설명해야 할 설정 매개변수들과 데이터베이스 특징들은 너무나 많다. DB2 version 7.2 FixPak 4에 도입된 db2support 명령어로 DB2 설치 정보를 빠르게 모을 수 있다.

db2pd 툴
http://www.ibm.com/developerworks/db2/library/techarticle/dm-0504poon2/

  • 유형: 기술자료
  • 날짜: 2005년 4월
  • IBM DB2 Universal Database Version 8.2에는 db2pd 라고 하는 DB2 데이터베이스와 인스턴스의 모니터링 및 관리용 툴이 새로이 도입되었다. 이 툴을 사용하여 트랜잭션, 테이블 공간, 테이블 통계, 동적 SQL, 설정 등을 지속적으로 트래킹 할 수 있다. 문제 해결, 문제 확인, 퍼포먼스 튜닝도 쉽다.








필자소개

Cindy Wong : 데이터베이스 컨설턴트, IBM


'DB2' 카테고리의 다른 글

DBMS별 날짜 포맷변환  (0) 2006.04.13
DB2 migration 중 발생한 에러  (0) 2006.04.06
SQLState messages reported by SQL  (0) 2006.04.05
01 Basic SQL Procedure Structure  (0) 2006.04.03
DB2기초 : 재미있는 날짜와 시간  (0) 2006.03.24
 

SQLState messages reported by SQL

DB2 | 2006. 4. 5. 17:20
Posted by 시반

SQLState messages reported by SQL

Table 26 lists all of the SQLSTATEs for the SQL statements reported by the DB2 Everyplace SQL engine. The SQLSTATEs reported by DB2 CLI are listed under each DB2 CLI function description in DB2 CLI function summary.

Table 26. SQLSTATE messages reported by SQL

SQLSTATE Description Explanation
01000 Warning. Informational message. (Function returns SQL_SUCCESS_WITH_INFO.)
01004 Value was truncated. The value was truncated by a system cast or adjustment function.
01550 The index was not created. The index was not created, because an index with the specified description already exists.
02000 No row was found. No row was found during the execution of a FETCH, DELETE, or UPDATE statement.
07001 Wrong number of parameters. A parameter marker has not been bound.
07005 Invalid parameter. The statement name of the cursor identifies a prepared statement that cannot be associated with a cursor.
07006 Invalid variable. An input host variable cannot be used because of its data type.
08002 Connection already exists. A connection already exists.
22001 Value requires truncation. A value requires truncation by a system cast or adjustment function.
22002 No null indicator provided. A NULL value cannot be assigned because no storage is provided.
22003 Numeric value out of range. A numeric value is not within the range of its target column.
22007 Invalid datetime format. The syntax of the string representation of a datetime value is incorrect.
22008 Datetime value out of range. The string representation of a datetime value is out of range.
22012 Divide by zero. A divide by zero operation was attempted.
22504 Fragmented MBCS character. The data contains an improperly formed multi-byte character.
23502 Null value not allowed. The assignment of a NULL value to a NOT NULL column is not allowed.
23505 Values are not unique. The operation was not valid because it would produce duplicate keys.
23513 Invalid value. The resulting row of the INSERT or UPDATE statement does not conform to the check constraint definition.
23515 More than one primary key clause is specified. More than one primary key clause is specified.
24000 Invalid cursor state. The StatementHandle was in an executed state but no result set was associated with the StatementHandle.
24501 Cursor not open. A FETCH is not valid because no result set has been generated.
24505 Cursor not positioned. A FETCH is not valid because the cursor is not positioned on a row.
34000 Cursor name is invalid. Cursor name is invalid.
42501* Authorization ID not permitted to perform specified operation on identified object The current user is trying to remove a privilege from a non-existing user.
42502* Authorization ID not permitted to perform operation as specified The current user does not have an authenticated connection. When an application (which does not have the encryption library or the CryptoPlugin.dll) executes an encryption related SQL commands (GRANT, REVOKE and CREATE TABLE) an error of "42502" will be returned. This is to prevent applications from crashing.
42505* Connection authorization failure occurred. A registered user attempts to connect and cannot be authenticated.
42506* Owner authorization failure. The connected user could not be authenticated. (Wrong password.)
42601 Syntax error. A syntax error in the SQL statement was detected.
42603 String constant does not have an ending delimiter. A string constant or delimited identifier does not have an ending delimiter.
42610 Invalid use of a parameter marker. The statement contains a parameter marker that is not valid. See Table 19 for valid usage of parameter markers.
42611 Invalid length specification. A length specification exceeds the limit.
42614 A duplicate keyword is invalid. A duplicate keyword is invalid.
42621 The check constraint is invalid. The check constraint is invalid.
42622 Name is too long. The name of an identifier is too long.
42702 Ambiguous column name reference. There is more than one possible column being referenced.
42703 Undefined column name. A column name is not in the referenced tables.
42704 Undefined object. The table does not exist.
42710 Named object already exists. A table with the same name already exists.
42711 Duplicated column name. The same column name is specified more than once.
42802 Number of values does not match the number of columns. The number of values assigned is not the same as the number of columns specified or implied.
42803 Column reference in SELECT list is not specified in the GROUP BY clause. A column name and an aggregation function are contained in the select list, but there is no GROUP BY clause.
42818 Incompatible data types of operands. The data types of the operands of an operation are not compatible.
42820 Literal value out of range. The specified numeric value is not in the acceptable range.
42821 Incompatible data types. A value is not compatible with the data type of a target column.
42822 Invalid ORDER BY item. The ORDER BY item is not in the select list.
42824 Invalid LIKE operand. An operand of LIKE is not a string, or the first operand is not a column.
42829 FOR UPDATE OF is invalid. FOR UPDATE OF is invalid because the result table designated by the cursor cannot be modified.
42830 The foreign key does not conform to the description of the parent key. The foreign key does not conform to the description of the parent key.
42831 Nullable columns in primary key. A column specified in the primary key clause cannot be nullable.
42832* Unauthorized access to system objects. The operation is not allowed on system objects.
42884 Unknown function name. No function or procedure was found with the specified name and compatible arguments.
42887 Unsupported feature The feature is not supported in the current release.
42894 The DEFAULT value is invalid. The DEFAULT value is invalid.
42902 Duplicate object table reference. The object table of the INSERT statement is also identified in a FROM clause.
42903 A WHERE clause or SET clause includes an invalid reference. A WHERE clause or SET clause includes an invalid reference, such as a column function.
42962 LOB column cannot be used as a key. A LOB column cannot be used as the primary key.
54001 Statement too long. The query statement is too long.
54008 Key is too long. Too many columns in a primary key, foreign key, or index.
54010 Table record length is too long. The record length of the table is too long.
55002 DB2ePLANTABLE not defined properly. EXPLAIN cannot be executed with an incorrect declaration of DB2ePLANTABLE.
55009 File is read-only. The file is read-only. In a read-only environment, only SELECT queries can be executed.
57001 Table not available. REORG cannot be executed on a table that is under a transaction scope.
57011 Out of memory. The system is not able to allocate dynamic memory.
57014 Processing was cancelled due to an interrupt. The execution of a query is canceled due to user interruption.
58004 Internal system error (continue). A non-severe system error occurred.
58005 Internal system error (stop). A severe system error occurred.

 

Related reference

 

01 Basic SQL Procedure Structure

DB2 | 2006. 4. 3. 10:09
Posted by 시반

Basic SQL Procedure Structure

 

1 The CREATE PROCEDURE statement

 

 

 
2 Procedure Name
 
Procedure 생성시 Scheme Name 생략된 경우 CURRENT SCHEME special register 의해 결정된다. CURRENT SCHEME 기본값은 현재 User 인증 받은 ID값이 사용된다.
동일한 Name 다른 Parameter Procedure 정의할 경우 SPECIFIC절이 요구된다
 
3 Parameters
 
CREATE PROCUDURE문장에서 기술되며, MODE/PARAMETER NAME/DATA TYPE 세가지 Part 구분된다.
 
- MODE : IN/OUT/INOUT
- PARAMETER-NAME
- DATA : DATA TYPE/SIZE
 
CREATE PROCEDURE UPDATE_EMPLOYEE_SAL( IN p_EMPID INTEGER,
                                                                        IN p_PER    DECIMAL(4,2),
                                                                        OUT p_UPDATE_SAL   )...
 
V.7 Parameter가 없는 경우 반드시 ()를 코딩하여야 한다
CREATE PROCEDURE UPDATE_EMPLOYEE_SAL( ) LANGUAGE SQL BEGIN...
 
V.8 Parameter가 없는 경우 ()를 생략할수 있다
CREATE PROCEDURE UPDATE_EMPLOYEE_SAL BEGIN...
 
Parameter 수가 다를 경우, 동일한 Name 가진 다수의 Procedure 생성할 있다.  이를 PROCEDURE OVERLOADING이라 한다
 
NOTE : Parameter수가 같고, Data Type 틀려도 동일한 Name 가진 Procedure 생성할 없다. User Defined Function(UDF) 동일한 수의 Parameter 가진 이름이 같은 Function 생성할 있다.
 
1) Procedure sum with three parameters
 
CREATE PROCEDURE sum( IN p_a INTEGER, IN  p_b INTEGER,OUT p_s INTEGER)
SPECIFIC sum_ab
LANGUAGE SQL
BEGIN
      SET p_s = p_s+p_b;
END
 
2) Procedure sum with four parameters
 
CREATE PROCEDURE sum(IN p_a INTEGER,IN p_b INTEGER,IN p_c INTEGER,OUT p_s INTEGER)
SPECIFIC sum_abc
LANGUAGE SQL
BEGIN
      SET p_s = p_s+p_b+p_c;
END
 
3) procedure 실행
 
CALL sum(100,200,?)
CALL sum(100,200,300,?)
 
 
4 Specific Name
 
SPECIFIC은 PROCEDURE의 UNIQUE NAME을 정의할 수 있는 선택절(OPTIONAL)이다.
SPECIFIC NAME은 PROCEDURE OVERLOADING을 동일한 이름과 Parameter 수를 다르게 하여 정의된 경우 유용하게 된다
즉 OVERLOADING Procedure를 Drop하거나 Comment를 할 경우 Procedure Name을 사용하는 경우 그 모호성 때문에 에러를 발생하게 된다
 
   TIP : Procedure의 관리를 용이하게 하기 위하여 SPECIFIC NAME을 사용하기를 권장합니다
 
    1) DROP PROCEDURE SUM
                  SQLCODE-476(SQLSTATE 42725)
    
    2) DROP PROCEDURE SUM (INTEGER,INTEGER,INTEGER)
 
    3) DROP SPECIFIC PROCEDURE sum_ab
 
COMMENT ON SPECIFIC PROCEDURE sum_abc IS THIS IS THE 3 PARM VERSION OF THE PROCEDURE
 
Specific Name 18 이상을 정의 없다. Scheme Name 의해 QUALIFIED또는 UNQUALIFIED 있다. Specific Name Procedure Name 동일하게 정의 있으며, Qualified Specific Name  Unique하여야 한다. Specific Name Procedure생성시 명시 되지 않으면 SQL Timestamp으로 구성된 Unique Specific Name 생성한다. SQLyymmddhhmmsshhn"
 
5 DYNAMIC RESULT SETS
 
DYNAMIC RESULT SETS 절은 Return하고자 하는 최대 Result Set 수를 정의할 사용된다. 이전 DB2 Version과의 호환성을 위해 DYNAMIC 생략 있다. 그러나 DYNAMIC 사용하는 것이 표준으로 권장됩니다
 
6 CONTAINS SQL, READS SQL DATA, MODIFIES SQL DATA
 
SQL-data access indication절은 Procedure내에서 사용되는 SQL statement Type 제한 한다. MODIFIES SQL DATA 절을 기본값으로 하여 SQL statement 사용할 있는 최소한의 제한을 한다
 
- CONTAINS SQL : Data 읽거나 수정하는 것을 제외한 문장을 허용한다.
  ex) DECLARE GLOBAL TEMPORARY TABLE
          PREPARE
          SET special register
          SQL control statements 등
 
- READS SQL DATA : Data 수정하는 것을 제외한 문장을 허용한다
- MODIFIES SQL DATA : CONNECT / DISCONNECT / RELEASE CONNECT
   Session 관련 문장을 제외한 SQL
 
7 DETERMINISTIC or NOT DETERMINISTIC
 
Input Parameter 의해 동일한 결과 값을 반환하는 경우는DETERMINISTIC, Input Parameter 또는 current date ,  time 의해 값이 바뀌는 경우NOT DETERMINISTIC 사용한다. 기본값은NOT DETERMINISTIC 적용된다
 
8 CALLED ON NULL INPUT
 
Input Parameter Null 경우에도 호출될 있음을 묵시적으로 알린다. 값은 기본적으로 적용되며, 적용될 있는 유일한 값이다. 선택적으로 기술 있다
 
9 LANGUAGE SQL
 
LANGUAGE SQL SQL Procedure 의미하며, CREATE PROCEDURE Statement body 내용이 SQL Procedure임을 알린다. LANGUAGE SQL V.7에는 반드시 기술하여야 하며, V.8 선택적으로 사용할 있다. Java 또는 C 다른 언어로 작성할 경우 LANGUAGE keyword 반드시 사용하여야 한다
 
10 SQL Procedure Body
 
SQL Statement 단문 또는 복문 형태(Compound SQL) SQL 기술 된다
단일 SQL문장 또는 BEGIN~END Block내에 복합 SQL문장을 사용하여 정의할 있다. 모든 선언문을 SQL procedure statement 이전에 기술되어야 한다
다음은 선언에 필요한 Syntax Diagram 표현한 이다

 
 
10.1 Comments
 
두가지 형태의 주석문을 허용한다
1) --
2) /* */
 
  CREATE PROCEDURE proc(IN p_a INTEGER,    --input var1
                                      OUT p_s INTEGER)   --output var1
  SPECIFIC sum_ab
  LANGUAGE SQL                                          --creating SQL procedure
  BEGIN                                                        --this is the beginning of the stored procedure
  /*
    varibables
  */     
  --procedural logic
 
  END
 
10.2 Variables
 
DECLARE 문을 사용하여 변수를 정의할 있다. 변수의 정의는 변수 name, DB2 data type 선택적인  Default값으로 구성된다. 변수는 반드시 BEGIN~END사이의 처음에 선언되어야 한다. 또한 변수 name Procedure 사용된 Table Column명과 구별 되어야 한다.
 
  1) v_ :  변수정의 접두어
  2) p_ : parameter접두어
 
변수가 선언되면 NULL 초기화 되며, DEFAULT절을 이용하여 특정 값으로 초기화 있다
 
 10.2.1  Setting Variables
 
   1)  DEFAULT값을 이용한 Setting
      DECLARE v_Total INTEGER DEFAULT 0;
 
  2) SET 이용한 Setting
      SET v_total = v_total+1;
 
  3) Select 이용한 Setting
      SELECT MAX(EMPNO) INTO v_Max FROM EMP
 
  4) VALUES를 이용한 Setting
     VALUES CURRENT DATE INTO v_adate;
     VALUES CURRENT DATE,CURRENT DATE INTO v_adate,v_other;
 
  5) GET DIAGNOSTICS 이용한 SETTING - ROW COUNT RETURN_STATUS
      DELETE FROM EMPOLYERR WHERE...
      GET DIAGNOSTICS rcount = ROW_COUNT;
 
10.3 SQL Statement
 
다음을 제외한 문장을 사용할 수 있다
   - connect
   - CREATE any object other than indexes,tables or views
   - describe
   - disconnect
   - drop any object other than indexes,tables or views
   - flush event monitor
   - refresh table
   - release (connection only)
   - rename table
   - rename tablespace
   - revoke
   - set connection
   - set integrity 등
 
10.4 Special Register
 
환경변수를 제공하여 주는 DB2  Memory register 변수
  - current date
  - current time
  - current timestamp
  - current timezone
  - current path
  - current schema
  - current degree(data type : char(5))
  - current query optimzation(data type : integer)
  - current refresh age
  - current node
  - current server
  - current default transform group
  - current explain mode
  - current explain snapshot
  - user
 
10.5 Returning Values to Caller
 
RETURN 사용하여 하나의 Integer값을 반환할 있다. 하나 이상 또는 다른 Data type 사용하려면 output parameter 사용한다
 
10.6 ROLLBACK and COMMIT
 
 1) ROLLBACK :  UOW(UNIT OF WORK)에 대한 변경을 취소한다
 2) COMMIT    :  UOW(UNIT OF WORK)에 대한 변경을 저장한다
 
SAVEPOINT & ROLLBACK TO SAVEPOINT
  --> ATOMIC compound statement내에서 ROLLBAKC/COMMIT을 사용할 수 없다
 
데이타베이스 요청이 실패할 때 dbms에 의해 작업을 실행 취소하는 메카니즘,
SAVEPOINT는 비원자적 데이터베이스요청을 ATOMIC 동작하게 만든다
실행중에 오류가 발생하면 SAVEPOINT를 사용하여 SAVEPOINT가 시작된 시간과 SAVEPOINT구간 복원이 요청된 시간 사이에 TRANSACTION에 의해 변경된 사항을 실행 취소 할수 있다
 
1. SAVEPOINT
   - SAVEPOINT를 설정하려면 SAVEPOINT의 이름을 사용하여 SAVEPOINT SQL문을 실행하여
     지정한다
   EX) SAVEPOINT savepoint1 ON ROLLBACK RETAIN CURSORS;
 
2.RELEASE SAVEPOINT
   - SAVEPOINT를 해제하려면 RELEASE SAVEPOINT SQL문을 실행한다
   EX) RELEASE SAVEPOINT savepoint1;
 
3. ROLLBACK TO SAVEPOINT
   - SAVEPOINT 구간을 복원하려면 ROLLBACK TO SAVEPOINT SQL 문을 실행한다
  EX) ROLLBACK TO SAVEPOINT savepoint1;  
 
 
 
 
 
 

DB2기초 : 재미있는 날짜와 시간

DB2 | 2006. 3. 24. 14:06
Posted by 시반

DB2 기초: 재미있는 날짜와 시간


난이도 : 초급

Paul Yip, Database Consultant, IBM Toronto Lab

2003 년 8 월 28 일

Windows, UNIX, 리눅스 플랫폼용 DB2 Universal Database에서 SQL을 사용하여 날짜, 시간, 타임스탬프를 조작하는 방법을 설명한다.

© 2002 International Business Machines Corporation. 저작권 소유.

알림:이 글을 읽기 전에 디스클레이머를 읽기 바란다.
IBM® DB2® Universal DatabaseTM에 관한 글이다.

머리말

DB2 UDB에 익숙하지 않은 사람들에게 날짜와 시간을 조작하는 방법을 설명한다. 다른 데이터베이스를 다뤄본 많은 사람들에게 DB2 UDB가 얼마나 쉬운지를 설명하겠다.





기초

SQL을 사용하여 날짜, 시간, 타임스탬프를 파악하려면 해당 DB2 레지스터리를 참조하라.

SELECT current date FROM sysibm.sysdummy1 SELECT current time FROM sysibm.sysdummy1 SELECT current timestamp FROM sysibm.sysdummy1

sysibm.sysdummy1 테이블은 위에서 설명한 대로 DB2 레지스터의 값을 찾는데 사용할 수 있는 특별한 인메모리(in-memory) 테이블이다. VALUES 키워드를 사용하여 레지스터나 식을 계산할 수 있다. 예를 들어, DB2 Command Line Processor (CLP)에서 다음 SQL 문장에는 비슷한 정보들이 나타난다.

VALUES current date VALUES current time VALUES current timestamp

남아있는 예제에는 SELECT ... FROM sysibm.sysdummy1을 반복하거나 VALUES 구문을 사용하지 않고 함수 또는 식을 제공하도록 하겠다.

GMT/CUT에 맞춘 현재 시간이나 현재 타임스탬프를 얻으려면 현재 시간 또는 타임스탬프에서 현재 타임존 레지스터를 제거한다.

current time - current timezone current timestamp - current timezone

날짜 시간, 타임스탬프의 경우, 적절한 함수를 사용하여 년도, 달, 요일, 시간, 분, 초, 마이크로초를 추출할 수 있다.

YEAR (current timestamp) MONTH (current timestamp) DAY (current timestamp) HOUR (current timestamp) MINUTE (current timestamp) SECOND (current timestamp) MICROSECOND (current timestamp)

타임스탬프와 관계없이 날짜와 시간을 추출하는 것 역시 매우 쉽다.

DATE (current timestamp) TIME (current timestamp)

영어로도 날짜와 시간 계산을 할 수 있다. :

current date + 1 YEAR current date + 3 YEARS + 2 MONTHS + 15 DAYS current time + 5 HOURS - 3 MINUTES + 10 SECONDS

두 날짜 간에 날수가 얼마나 되는지를 계산하려면 날짜를 빼면 된다.

days (current date) - days (date('1999-10-22'))

다음은 마이크로초 부분을 0으로 재설정하고 현재 타임스탬프를 얻는 방법이다.

CURRENT TIMESTAMP - MICROSECOND (current timestamp) MICROSECONDS

날짜 또는 시간 값을 다른 텍스트와 연결시키려면 그 값을 문자열로 변환해야 한다. CHAR() 함수를 사용한다.

char(current date) char(current time) char(current date + 12 hours)

문자열을 날짜 또는 시간 값으로 변환하려면 다음과 같이 한다.

TIMESTAMP ('2002-10-20-12.00.00.000000') TIMESTAMP ('2002-10-20 12:00:00') DATE ('2002-10-20') DATE ('10/20/2002') TIME ('12:00:00') TIME ('12.00.00')

TIMESTAMP(), DATE(), TIME() 함수는 여러 포맷들을 허용한다. 위 포맷은 단순한 예제일 뿐이다. 독자 여러분이 스스로 해 보길 바란다.

경고:
DB2 UDB V8.1 SQL Cookbook (Graeme Birchall) 발췌 (http://ourworld.compuserve.com/homepages/Graeme_Birchall).

DATE 함수에서 쿼트를 없애면 어떻게 될까? 함수는 여전히 작동하겠지만 정확하지 않은 DATE가 나올 것이다.

SELECT DATE(2001-09-22) FROM SYSIBM.SYSDUMMY1;

결과:

====== 05/24/0006

위 결과에서 어떻게 2000년 이나 차이가 났을까? DATE 함수가 입력으로 문자열을 취하면 DB2 날짜의 유효 문자로 간주되고, 따라서 이를 변환하는 것이다. 반대로, 입력이 숫자라면 이 함수는 현재 년도(0001-01-01)에서 1을 제한 날 수를 나타내는 것으로 간주한다. 위 쿼리에서 입력은 2001-09-22였고 이것은 (2001-9)-22과 동일하다. 또한 이것은 1970이다.





날짜 함수

가끔씩, 두 개의 타임스탬프들이 어떻게 차이가 있는지 알아야 한다. 이를 위해 DB2는 TIMESTAMPDIFF()라고 하는 빌트인 함수를 제공한다. 하지만 리턴된 값은 근사값이다. 윤년을 고려하지 않고 한 달을 30일로만 가정하기 때문이다. 다음은 두 날짜들 간 차이를 찾아내는 방법이다.

timestampdiff (<n>, char( timestamp('2002-11-30-00.00.00')- timestamp('2002-11-08-00.00.00')))

<n>의 자리에, 다음 값들을 사용하여 시간 단위를 나타낸다.

  • 1 = 초의 소수부분
  • 2 = 초
  • 4 = 분
  • 8 = 시간
  • 16 = 요일
  • 32 = 주
  • 64 = 달
  • 128 = 분기
  • 256 = 년

timestampdiff()를 사용하면 날짜가 비교적 가까이 있을 때 더 정확한 결과가 나온다. 보다 정확한 계산을 원하면 다음을 사용하여 시간 단위로(초 단위로) 차이를 결정한다.

(DAYS(t1) - DAYS(t2)) * 86400 + (MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2))

SQL의 사용자 정의 함수를 사용할 수도 있다.

CREATE FUNCTION secondsdiff(t1 TIMESTAMP, t2 TIMESTAMP) RETURNS INT RETURN ( (DAYS(t1) - DAYS(t2)) * 86400 + (MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2)) ) @

윤달일 경우 날 수를 결정할 때 쓸 수 있는 유용한 SQL 함수가 있다.

CREATE FUNCTION daysinyear(yr INT) RETURNS INT RETURN (CASE (mod(yr, 400)) WHEN 0 THEN 366 ELSE CASE (mod(yr, 4)) WHEN 0 THEN CASE (mod(yr, 100)) WHEN 0 THEN 365 ELSE 366 END ELSE 365 END END)@

마지막으로 다음은 날짜 조작에 쓰이는 빌트인 함수들이다. 여러분의 필요에 맞는 함수를 빠르게 선택하는데 사용하기 바란다. 보다 자세한 정보는 SQL 레퍼런스를 참조하기 바란다.

SQL 날짜와 시간 함수
DAYNAME 인자에 요일 이름(예, 금요일)이 포함된 혼합 문자열을 리턴.
DAYOFWEEK 1에서 7까지 정수 값으로 요일을 나타낸다. 여기에서 1은 일요일을 의미한다.
DAYOFWEEK_ISO 1에서 7까지 정수 값으로 요일을 나타낸다. 여기에서 1은 월요일이다.
DAYOFYEAR 1에서 366 까지의 정수로 날(day)을 리턴.
DAYS 날짜를 정수로 리턴.
JULIAN_DAY January 1, 4712 B.C. (Julian 달력의 시작)부터 인자에 지정된 날짜 값까지 정수로 날수를 나타냄.
MIDNIGHT_SECONDS 0에서 86400 까지의 정수 값으로 자정(midnight)과 인자에서 지정된 시간 값 사이의 초의 값을 나타냄.
MONTHNAME 달의 이름(예를 들어, January)을 포함하고 있는 혼합 문자열 리턴.
TIMESTAMP_ISO 날짜, 시간, 타임스탬프 인자에 기반한 타임스탬프 값을 리턴.
TIMESTAMP_FORMAT 문자 템플릿을 사용하여 인터프리팅 된 문자열에서 타임스탬프를 리턴.
TIMESTAMPDIFF 두 타임스탬프들 간 차이에 기반하여, 첫 번째 인자에서 정의된 유형의 인터벌 수를 리턴.
TO_CHAR 문자 템플릿을 사용하여 포맷된 타임스탬프의 문자 구현을 리턴. TO_CHAR는 VARCHAR_FORMAT의 동의어이다.
TO_DATE 문자 템플릿을 사용하여 인터프리팅 된 문자열에서 타임스탬프를 리턴. TO_DATE는 TIMESTAMP_FORMAT의 동의어이다.
WEEK 1에서 54까지 정수 값으로 주(week)를 리턴함. 주는 Sunday로 시작한다.
WEEK_ISO 1에서 53까지 정수 값으로 주를 리턴함.




날짜 포맷 변경

날짜 표현에 관한 질문을 자주 받는다. 날짜에 사용되는 기본 포맷은 데이터베이스의 영역(territory) 코드로 결정된다. (이것은 데이터베이스 생성 때 지정될 수 있다.) 예를 들어, 데이터베이스가 territory=US를 사용하여 만들어졌다면 날짜 포맷은 다음과 같을 것이다.

values current date 1 ---------- 05/30/2003 1 record(s) selected.

말하자면 이것은 MM/DD/YYYY 포맷이다. 이 포맷을 변경하려면 db2 유틸리티 패키지 컬렉션을 다른 날짜 포맷으로 바인딩한다. 다음은 포맷 종류이다.

DEF 영역 코드와 관련된 날짜 포맷과 시간 포맷을 사용.
EUR IBM 유럽 표준의 날짜와 시간 포맷을 사용함.
ISO International Standards Organization의 날짜와 시간 포맷을 사용.
JIS Japanese Industrial Standard의 포맷 사용.
LOC 해당 데이터베이스의 영역 코드와 관련된 로컬 형식의 날짜와 시간 포맷을 사용함.
USA IBM U.S. 표준을 사용함.

ISO (YYYY-MM-DD)로 디폴트 포맷을 변경하려면 다음과 같이 한다.

  1. 명령행에서, 현재 디렉토리를 sqllib\bnd로 변경한다.

    예:
    On Windows: c:\program files\IBM\sqllib\bnd
    On UNIX: /home/db2inst1/sqllib/bnd

  2. SYSADM 권한을 가진 사용자로서 OS 쉘에서 데이터베이스로 연결한다
    db2 connect to DBNAME db2 bind @db2ubind.lst datetime ISO blocking all grant public

    (여러분의 상황에 적용할 때에는 데이터베이스 이름과 선호하는 날짜 포맷으로 대체한다.)

이제 데이터베이스가 ISO 날짜 포맷을 사용한다.

values current date 1 ---------- 2003-05-30 1 record(s) selected.





날짜/시간 포맷 커스터마이징

마지막 예제에서는 DB2가 로컬 포맷으로 날짜를 나타내는 방식을 어떻게 변경하는지를 설명하였다. 하지만 'yyyymmdd'처럼 커스텀 포맷으로 하고싶다면? 최선의 방법은 커스텀 포맷팅 함수를 다시 작성하는 것이다.

UDF:

create function ts_fmt(TS timestamp, fmt varchar(20)) returns varchar(50) return with tmp (dd,mm,yyyy,hh,mi,ss,nnnnnn) as ( select substr( digits (day(TS)),9), substr( digits (month(TS)),9) , rtrim(char(year(TS))) , substr( digits (hour(TS)),9), substr( digits (minute(TS)),9), substr( digits (second(TS)),9), rtrim(char(microsecond(TS))) from sysibm.sysdummy1 ) select case fmt when 'yyyymmdd' then yyyy || mm || dd when 'mm/dd/yyyy' then mm || '/' || dd || '/' || yyyy when 'yyyy/dd/mm hh:mi:ss' then yyyy || '/' || mm || '/' || dd || ' ' || hh || ':' || mi || ':' || ss when 'nnnnnn' then nnnnnn else 'date format ' || coalesce(fmt,' <null> ') || ' not recognized.' end from tmp </null>

이 함수 코드는 복잡해보인다. 하지만 자세히 살펴보면 매우 단순하면서도 좋은 코드임을 알 수 있다. 우선, common table expression (CTE)를 사용하여 타임스탬프(첫 번째 입력 매개변수)를 개별 컴포넌트에서 분리한다. 그런 다음, 제공된 포맷(두 번째 입력 매개변수)을 검사하고 요청된 포맷과 부분을 사용하여 타임스탬프를 다시 정렬한다. 이 함수는 매우 유연하다. 또 다른 패턴을 추가하려면 원하는 포맷과 함께 WHEN 구문을 붙이면 된다. 예상하지 못했던 패턴이 나타났다면 에러메시지가 리턴된 것이다.

사용 예제:

values ts_fmt(current timestamp,'yyyymmdd') '20030818' values ts_fmt(current timestamp,'asa') 'date format asa not recognized.'





요약

날짜와 시간에 관련된 질문들에 답이 되었기 바란다. 더 많은 예제들로 글을 업데이트 하겠다. (사실 독자들 덕분에 벌써 세 번씩이나 업데이트 했다.)

감사의 말

Bill Wilkins, DB2 Partner Enablement
Randy Talsma

디스클레이머

이 글에는 샘플 코드가 포함되어 있습니다. IBM은 여러분 모두가 "로열티 " 없이 이 샘플 코드를 사용할 수 있도록 허용하고 있습니다. 하지만 이 샘플 코드는 그대로 제공되며 특정 목적에 맞춰 상용으로 사용해서는 안됩니다. IBM은 이 소프트웨어를 사용함으로써 초래된 어떤 손해에도 책임을 지지 않습니다. IBM은 손실, 영리 또는 데이터, 직접적인 손해, 간접적인 손해, 특별한 손해, 결과적인 손해, 일시적인 손해, 징벌로 인한 손해 등에 책임이 없습니다. IBM이 그와 같은 손실의 가능성을 만들었더라도 소프트웨어의 사용 또는 미사용에서 발생한 손실에는 책임이 없습니다.










필자소개

Paul Yip, 데이터베이스 컨설턴트, IBM 토론토 연구실.

 

출처 : http://www-128.ibm.com/developerworks/kr/library/0211yip/0211yip3.html

 

DB2 기초:

  DB2 UDB 시스템 카탈로그에서 유용한 정보를 얻는 방법


난이도 : 초급

Roman Melnyk, DB2 Information Development, IBM Canada Ltd.

2004 년 11 월 02 일

IBM® DB2® Universal Database™(UDB)는 시스템 카탈로그(system catalog)라고 하는 특별한 테이블을 관리하고 있다. 데이터베이스 객체들을 설명하는 메타데이터들이 포함된 이 테이블들은 두 개의 뷰를 정의하고 있다. SYSCAT 스키마 하의 읽기 전용 뷰와 SYSSTAT 스키마 하의 업데이트 가능한 뷰가 바로 그것이다. 이 글에서는 DB2 UDB 시스템 카탈로그를 소개하고 이 풍부한 데이터베이스 정보의 보고가 어떻게 발굴되는지를 설명한다. (명령행 또는 DB2 Control Center를 사용하여) 카탈로그를 쿼리하는 방법도 예제를 통해 설명한다.

머리말

데이터베이스에 대한 거의 모든 것은 시스템 카탈로그(system catalog)라는 메타데이터 리파지토리에서 찾을 수 있다. 메타데이터는 데이터베이스에 있는 데이터에 대한 정보이다. 데이터와는 별도로 관리된다. 시스템 카탈로그는("카탈로그")는 데이터베이스 매니저에 의해 관리되는 많은 테이블과 뷰로 구성된다. 카탈로그 테이블과 뷰들은 데이터베이스가 만들어 질 때 마다 생성된다. 카탈로그는 테이블, 칼럼, 인덱스 같은 데이터베이스 객체들을 설명하고 액세스 유형에 대한 정보를 포함하고 있다. 데이터베이스 객체들과 권한들이 데이터베이스에 추가되면서 카탈로그 테이블은 커진다. 객체가 생성, 변경, 소멸되면 데이터베이스 매니저는 카탈로그 테이블에 열(row)을 삽입, 업데이트, 삭제한다.

물론 시스템 카탈로그 테이블들을 명확히 생성 또는 소멸시킬 수는 없지만 컨텐트의 쿼리 및 보기가 가능하다. 이러한 뷰에 감춰진 유용한 정보들이 많이 있다. 이 정보들은 데이터베이스를 어떻게 운용해야 하는지를 이해하는데 도움이 된다. 앞으로는 DB2 UDB 시스템 카탈로그에서 유용한 정보를 검색하는 방법을 설명하겠다.






시스템 카탈로그 베이스 테이블(SYSIBM schema)

카탈로그 테이블들은 SYSIBM 스키마 하에 생성되고 SYSCATSPACE 테이블 공간에 저장된다. 파티션으로 나뉜 데이터베이스용 카탈로그 테이블들은 CREATE DATABASE 명령어가 만들어졌던 파티션에만 상주한다. 어떤 카탈로그 테이블들은 부모-자식 관계를 갖고 있다. 예를 들어, 컬럼 레벨 권한을 상세히 설명하는 SYSIBM.SYSCOLAUTH는 SYSIBM.SYSTABAUTH의 자식이다. SYSIBM.SYSTABAUTH는 테이블 레벨 권한을 기록한다.

시스템 카탈로그를 구성하고 있는 많은 테이블들은 데이터베이스 객체에 대한 정보를 저장하고, 그러한 테이블들의 이름들은 각자가 설명하는 객체들을 나타낸다. (SYSINDEXES, SYSTRIGGERS, SYSVIEWS). 이 카탈로그 테이블들은 저장된 데이터의 유형에 기반하여 광범위한 카테고리들로 나뉘어 질 수 있다.

  • 권한(Authorization) 데이터는 SYSDBAUTH(데이터베이스 레벨 권한), SYSTBSPACEAUTH(테이블 공간에 대한 권한), SYSTABAUTH(테이블과 뷰에 대한 권한), SYSCOLAUTH (칼럼 레벨 권한) 같은 테이블에 기록된다.
  • 데이터 유형과 루틴(Data type and routine) 데이터는 SYSDATATYPES(빌트인 데이터 유형과 사용자 정의 데이터 유형), SYSROUTINES(함수 또는 프로시저용), SYSROUTINEPARMS(SYSROUTINES에 리스팅된 루틴들의 일부인 매개변수용) 등의 테이블에 기록된다.
  • 제약조건(Constraint) 데이터는 SYSCHECKS(제약조건 검사), SYSRELS(외래 키 제약조건), SYSKEYCOLUSE(프라이머리 키, 유일 키, 외래 키 제약조건 등에 참여한 칼럼)에 기록된다. 자세한 내용은 DB2 기초: 제약조건을 참조하라.
  • 종속(Dependency) 데이터는 SYSCONSTDEP(몇몇 객체들에 대한 제약조건의 종속관계), SYSDEPENDENCIES(트리거, 함수, 인덱스 또는 몇몇 다른 객체에 대한 인덱스 확장의 종속관계), SYSVIEWDEP(몇몇 객체에 대한 뷰의 종속관계) 같은 테이블에 기록된다.
  • 스토리지(Storage management)관리 데이터는 SYSTABLESPACES(테이블 공간), SYSTABLES(특정 테이블과 연관된 테이블 공간) 같은 테이블에 기록된다. 자세한 내용은 DB2 기초: 테이블과 테이블 공간 상태 분석을 참조하라.
  • 데이터베이스 파티션(Database partition) 데이터는 SYSNODEGROUPS(데이터베이스 파티션 그룹), SYSPARTITIONMAPS(해시 키 값을 데이터베이스 파티션과 제휴시키는 파티셔닝 맵) 같은 테이블에 기록된다.

데이터베이스 매니저는 기본 시스템 카탈로그 테이블의 상단에서 정의된 두 세트의 시스템 카탈로그 뷰들을 생성 및 관리한다. 한 세트의 읽기 전용 뷰는 SYSCAT 스키마 하에서 생성되고, 보다 작은 업데이트 가능한 뷰는 SYSSTAT 스키마 하에서 생성된다. 카탈로그 뷰는 한 개 이상의 카탈로그 테이블에 기반하고 있고 뷰 칼럼 이름들은 카탈로그 테이블에 있는 것과 가끔 다르다. 여러분의 이해를 돕기 위해 두 가지 예제들을 보겠다. 단 한 개의 테이블에 기반한 SYSCAT.KEYCOLUSE 이다. 이 뷰는 SYSIBM.SYSKEYCOLUSE 카탈로그 테이블에 기반하고 있다. 잘 기억해 보면 이 테이블은 프라이머리 키, 유일 키, 외래 키 제한에 참여한 칼럼에 대한 정보를 저장하는데 사용된다. 다음은 뷰의 정의이다.


Listing 1. SYSCAT.KEYCOLUSE 카탈로그 뷰의 정의
create view syscat.keycoluse (constname, tabschema, tabname, colname, colseq) as select constname, tbcreator, tbname, colname, colseq from sysibm.syskeycoluse

이 경우, 다섯 개의 모든 테이블 칼럼들이 이 뷰에 나타나지만 몇몇 이름들은 다르다. 이것은 일관성과 명확성을 위해서만 수행된다.

한 개 이상의 테이블에 기반한 보다 복잡한 뷰의 예제는 SYSCAT.STATEMENTS 이다. 이 뷰는 데이터베이스의 각 패키지에 각각의 SQL문에 대한 정보를 포함하고 있고 SYSIBM.SYSPLAN과 SYSIBM.SYSSTMT 카탈로그 테이블에 기반하고 있다. 다음은 뷰 정의이다.


Listing 2. SYSCAT.STATEMENTS 카탈로그 뷰의 정의
create view syscat.statements
 (pkgschema, pkgname, unique_id, version, stmtno, sectno, seqno, text) as
select s.plcreator, s.plname, s.unique_id, (select p.pkgversion from sysibm.sysplan p where s.plcreator = p.creator and s.plname = p.name and s.unique_id = p.unique_id), s.stmtno, s.sectno, 1, s.text from sysibm.sysstmt s


사용자 중심의 카탈로그 뷰 (SYSCAT schema)

SYSCAT 스키마에는 카탈로그 테이블의 유용한 읽기 전용 뷰가 포함되어 있다. SYSCAT의 모든 뷰들에 대한 SELECT 권한은 PUBLIC에 허용되어 있고 여러분은 이러한 뷰들과 SYSSTAT의 업데이트 가능한 뷰들을 통해서만 시스템 카탈로그와 인터랙팅 해야 한다.

다음 코드는 SAMPLE 데이터베이스에 연결하여 SYSCAT 스키마의 모든 카탈로그 뷰의 리스트를 리턴하는 코드이다.


Listing 3. SYSCAT 스키마의 모든 카탈로그 뷰의 규명
connect to sample list tables for schema syscat or, alternatively: select tabname from syscat.tables where tabschema = 'SYSCAT' connect reset

이 카탈로그 뷰에 대해 제대로 된 쿼리를 하려면 사용 가능한 뷰의 칼럼에 대해 알아야 하고 동시에 뷰의 이름과 목적을 알아야 한다. DB2 UDB 시스템 카탈로그 뷰들은 IBM DB2 Universal Database SQL Reference, Volume 1(pdf)을 참조하거나, 온라인 정보를 선호한다면 DB2 Information Center (follow Reference → SQL → Catalog views → DB2 Universal Database)를 참조하라. 또한 DB2 Control Center (그림 1)에서 카탈로그 뷰를 검사할 수도 있다.


그림 1. 특정 데이터베이스와 제휴된 뷰들은 DB2 Control Center의 컨텐츠 패인과 객체 트리에서 선택된 Views에 나타난다. 이 리스트는 SYSCAT 스키마를 중심으로 필터링되었다.

Open View 윈도우로는 뷰 내용을 자세하게 검사할 수 있고 뷰 칼럼들을 검색할 수 있는 편리한 방식이다. (그림 2)


그림 2. Open View 윈도우가 뷰의 데이터를 볼 수 있는 편리한 방법을 제공한다.

원한다면 뷰 정의에 액세스할 수 있다. 팝업 메뉴에서 Alter를 선택한다. (그림 3)


그림 3. Alter View 윈도우에서 뷰 정의를 볼 수 있다.

권한 데이터 가져오기

앞서 언급했듯이, 어떤 하나의 시스템 카탈로그 뷰에는 유효한 모든 권한 데이터들이 포함되어 있지 않다. 권한과 특권에 대한 메타데이터가 여러 카탈로그 뷰에 포함되어 있더라도 하나의 쿼리로 특권을 가진 모든 권한 ID들을 가져올 수 있고, SUBSTR 빌트인 함수를 사용하여 결과 세트를 포맷팅 할 수 있다.


Listing 4. 특권을 보유한 권한 ID 확인하기
select distinct substr(grantee,1,16) as grantee, granteetype, 'Database' from syscat.dbauth union select distinct substr(grantee,1,16) as grantee, granteetype, 'Table space' from syscat.tbspaceauth union select distinct substr(grantee,1,16) as grantee, granteetype, 'Schema' from syscat.schemaauth union select distinct substr(grantee,1,16) as grantee, granteetype, 'Table' from syscat.tabauth union select distinct substr(grantee,1,16) as grantee, granteetype, 'Index' from syscat.indexauth union select distinct substr(grantee,1,16) as grantee, granteetype, 'Column' from syscat.colauth union select distinct substr(grantee,1,16) as grantee, granteetype, 'Package' from syscat.packageauth union select distinct substr(grantee,1,16) as grantee, granteetype, 'Routine' from syscat.routineauth union select distinct substr(grantee,1,16) as grantee, granteetype, 'Server' from syscat.passthruauth order by grantee, granteetype

GRANTEE GRANTEETYPE 3
---------------- ----------- -----------
MELNYK U Database
MELNYK U Index
MELNYK U Package
MELNYK U Table
MELNYK U Table space
PUBLIC G Database
PUBLIC G Package
PUBLIC G Routine
PUBLIC G Schema
PUBLIC G Table
PUBLIC G Table space
11 record(s) selected.

권한 데이터를 가져올 수 있는 다른 많은 쿼리들도 있다. 두 개의 예제를 더 보자.


Listing 5. 권한 데이터 가져오기
connect to sample Retrieve all authorization names that have explicitly been granted DBADM authority: select distinct grantee from syscat.dbauth where dbadmauth = 'Y' Retrieve a list of the table privileges that you have granted to other users: select * from syscat.tabauth where grantor = user connect reset

데이터 유형과 루틴 데이터 가져오기

시스템 카탈로그 뷰를 사용하여 사용자 정의의 데이터 유형 또는 루틴을 쉽게 가져올 수 있다.


Listing 6. 데이터 유형과 루틴 데이터 가져오기
connect to sample Retrieve information about all user-defined types (that is, types whose schema is not SYSIBM): select typeschema, typename, sourcename, metatype from syscat.datatypes where typeschema != 'SYSIBM' Retrieve information about all user-defined routines (that is, routines whose schema name does not begin with SQL or SYS): select routineschema, routinename, routinetype, origin, language, text from syscat.routines where substr(routineschema,1,3) != 'SQL' and substr(routineschema,1,3) != 'SYS' connect reset

제약조건 데이터 가져오기

또한 시스템 카탈로그 뷰를 사용하여 NOT NULL, 유일 키, 프라이머리 키, 외래 키, 테이블 검사 제약조건에 대한 정보를 가져올 수 있다.


Listing 7. 제약조건 데이터 가져오기
connect to sample Retrieve a list of all the columns that cannot have a null value, in tables that were created by user MELNYK: select substr(tabname,1,16) as tabname, substr(colname,1,16) as colname, nulls from syscat.columns where tabschema = 'MELNYK' and nulls = 'N' Retrieve a list of tables that have unique constraints (other than primary key) defined on them: "select substr(tabschema,1,16) as tabschema, substr(tabname,1,16) as tabname, keyunique from syscat.tables where keyunique > 0" Retrieve all primary keys that are defined for the SAMPLE database. KEYSEQ contains a non-null value if a column is part of the primary key for the table to which it belongs. The value represents the column's numerical position within the primary key: select substr(tabschema, 1, 16) as tabschema, substr(tabname, 1, 16) as tabname, substr(colname, 1, 16) as colname, keyseq from syscat.columns where keyseq is not null Retrieve a list of all the columns that participate in a key defined by a unique, primary key, or foreign key constraint. Identify the constraint name and type, as well as the numeric position of the column in the key (initial position is 1): select substr(k.constname,1,20) as constname, t.type, substr(k.tabname,1,20) as tabname, substr(k.colname,1,16) as colname, k.colseq from syscat.keycoluse k, syscat.tabconst t where k.constname = t.constname Retrieve a list of each table check constraint: select substr(constname,1,20) as constname, substr(tabname,1,20) as tabname, substr(text,1,32) as text from syscat.checks connect reset

종속 데이터 가져오기

시스템 카탈로그 뷰를 사용하여 객체들 간 종속관계에 대한 정보를 가져올 수 있다.


Listing 8. 종속 데이터 가져오기
connect to sample Retrieve a list of all the tables on which the SYSCAT.COLUMNS view depends: select distinct substr(a.tabschema,1,16) as tabschema, substr(a.tabname,1,16) as tabname, a.type, substr(a.tbspace,1,16) as tbspace from syscat.tables a, syscat.viewdep b where a.type = 'T' and a.tabname = b.bname and a.tabschema = b.bschema and b.btype = 'T' and b.viewname = 'COLUMNS' and b.viewschema = 'SYSCAT' connect reset

TABSCHEMA TABNAME TYPE TBSPACE
---------------- ---------------- ---- ----------------
SYSIBM SYSCHECKS T SYSCATSPACE
SYSIBM SYSCOLCHECKS T SYSCATSPACE
SYSIBM SYSCOLPROPERTIES T SYSCATSPACE
SYSIBM SYSCOLUMNS T SYSCATSPACE
4 record(s) selected.

SYSCAT.COLUMNS 뷰에 대해 Show Related 액션을 선택할 때 이 쿼리는 DB2 Control Center에서 생성된 기반의 쿼리와 근본적으로 같다. (그림 4, 5)


그림 4. Show Related 노트북으로 뷰와 다른 객체들 간 1급 종속 관계를 볼 수 있다. 이 경우, SYSCAT.COLUMNS 뷰가 의존하는 카탈로그 테이블의 리스트가 나타난다.


그림 5. Show SQL 윈도우에서 그림 4에 나타난 종속 관계 리스트에 대한 기반 쿼리가 제공된다.

스토리지 관리 데이터 가져오기

시스템 카탈로그 뷰를 사용하여 테이블 공간 같은 스토리지 관리 객체에 대한 정보를 가져올 수 있다.


Listing 9. 스토리지 관리 데이터 가져오기
connect to sample Retrieve information about table spaces associated with the tables that were created by user MELNYK: select substr(t.tabname, 1, 12) as tabname, t.tbspaceid as tsp_id, s.tbspacetype as tsp_type, s.datatype, s.extentsize, s.pagesize, s.dbpgname from syscat.tables t, syscat.tablespaces s where tabschema = 'MELNYK' and type = 'T' and t.tbspaceid = s.tbspaceid connect reset

TABNAME TSP_ID TSP_TYPE DATATYPE EXTENTSIZE PAGESIZE DBPGNAME
------------ ------ -------- -------- ----------- ----------- ------------------
CL_SCHED 2 S A 32 4096 IBMDEFAULTGROUP
DEPARTMENT 2 S A 32 4096 IBMDEFAULTGROUP
EMP_ACT 2 S A 32 4096 IBMDEFAULTGROUP
EMP_PHOTO 2 S A 32 4096 IBMDEFAULTGROUP
EMP_RESUME 2 S A 32 4096 IBMDEFAULTGROUP
EMPLOYEE 2 S A 32 4096 IBMDEFAULTGROUP
IN_TRAY 2 S A 32 4096 IBMDEFAULTGROUP
ORG 2 S A 32 4096 IBMDEFAULTGROUP
PROJECT 2 S A 32 4096 IBMDEFAULTGROUP
SALES 2 S A 32 4096 IBMDEFAULTGROUP
STAFF 2 S A 32 4096 IBMDEFAULTGROUP
11 record(s) selected.

데이터베이스 파티션 데이터 가져오기

시스템 카탈로그 뷰를 사용하여 데이터베이스 파티션과 데이터베이스 파티션 그룹에 대한 정보를 가져올 수 있다.


Listing 10. 데이터베이스 파티션 데이터 가져오기
connect to sample Retrieve information about each database partition and the database partition group to which it belongs: select n.dbpgname, substr(n.definer, 1, 16) as definer, n.pmap_id, n.create_time, d.dbpartitionnum, d.in_use from syscat.dbpartitiongroups n, syscat.dbpartitiongroupdef d where n.dbpgname = d.dbpgname connect reset

DBPGNAME DEFINER PMAP_ID CREATE_TIME DBPARTITIONNUM IN_USE
------------------ -------... ------- -------------------------- -------------- ------ IBMCATGROUP SYSIBM 0 2004-10-18-08.27.54.045000 0 Y
IBMDEFAULTGROUP SYSIBM 1 2004-10-18-08.27.54.125000 0 Y
2 record(s) selected.





업데이트 가능한 카탈로그 뷰 (SYSSTAT schema)

SYSSTAT 스키마에는 시스템 카탈로그 테이블에 기반한 소수의 업데이트 가능한 뷰들이 포함되어 있다. 이 뷰들에는 쿼리 옵티마이저에 유용한 통계 정보가 포함된 칼럼들이 있다. 이 옵티마이저는 특정 테이블의 데이터 분산에 대한 정보 또는 인덱스 칼럼들을 사용한다. (칼럼들이 열 선택 또는 테이블 조인(join)에 개입되어 있을 경우). 이 정보들을 사용하여 특정 쿼리에 대한 다른 데이터 액세스의 비용들을 비교한다.

이러한 통계 값을 변경하여 옵티마이저를 제어하거나, 개발 또는 테스트 환경에서 데이터베이스 퍼포먼스를 파악하는 것에도 관심이 있을 것이다. 사실, SQL UPDATE문을 사용하여 업데이트 가능한 카탈로그 뷰에서 통계 칼럼의 값들을 변경할 수 있다. 테이블에 대한 CONTROL 특권이 있다면 그 테이블에 관련된 값들을 업데이트 할 수 있다. 하지만 그 데이터베이스에 대해 명확한 DBADM 권한을 보유하고 있다면 업데이트 가능한 칼럼 어느 것이라도 변경할 수 있다.

runstats 유틸리티는 시스템 카탈로그 테이블의 통계들을 업데이트 하여 쿼리 최적화 프로세스를 만드는데 사용된다. 어떤 통계든 직접 업데이트 하기 전에 RUNSTATS 명령어를 호출하는 것이 좋다. 시작 포인트가 정확히 현재 상태를 반영하도록 하기 위함이다.

업데이트 가능한 카탈로그 뷰를 사용하여 퍼포먼스를 최적화 하는 자세한 방법은 이 글에서는 그만 설명하겠다. DB2 UDB 제품 라이브러리를 참조하기 바란다.





시스템 카탈로그로의 액세스 제어

데이터베이스가 만들어지면 시스템 카탈로그 뷰에 대한 SELECT 특권은 PUBLIC에 주어진다.(그림 6) 데이터베이스에 민감한 데이터가 포함되어 있다면 카탈로그 뷰로의 액세스에 제한을 두어야 한다. 이 카탈로그는 데이터베이스에 있는 모든 객체를 설명하기 때문이다. PUBLIC 에서 SELECT 특권을 취소한 후에 이 특권을 특정 사용자에게 부여한다. 시스템 카탈로그 뷰에 대한 SELECT 권한을 허용 또는 취소하려면 DBADM 또는 SYSADM 권한이 있어야 한다.


그림 6. View Privileges 노트북에서는 뷰에 대한 권한을 보거나 변경할 수 있다.

사용자의 권한 ID에 명확히 SELECT 특권이 부여된 모든 테이블의 이름을 포함하고 있는 뷰를 생각해 보자. Listing 11의 코드는 MYSELECTS라는 뷰를 만들어 낸다. 이 뷰는 또 다른 뷰인 SYSCAT.TABAUTH 카탈로그 뷰에 기반하고 있다. 우리는 U 라는 수혜자 유형(사용자의 U를 의미한다. 그룹일 경우 G가 된다.)을 지정하고 USER(런타임 권한 ID를 지정하는 특별 레지스터)라는 수혜 값을 지정한다. 또한 SELECT 권한 플래그가 YES로 설정된 열을 정렬한다.

일단 MYSELECTS 뷰가 만들어지면 이 뷰와 SYSCAT.TABLES 뷰에서 데이터를 가져오는 쿼리를 만들 수 있다. 두 개 이상의 테이블에서 동시에 데이터를 가져오는 쿼리를 join 이라고 한다. 우리는 join을 통해 MYSELECTS 뷰에서 테이블 스키마와 이름 값을 가져오고, SYSCAT.TABLES 뷰에서 상응하는 테이블 유형(뷰의 경우 V)도 가져온다. 이 경우, 쿼리는 한 개의 열을 리턴하는데 이것은 우리가 만들었던 뷰에 상응한다. 이것은 SELECT 권한을 권한 ID MELNYK에 부여한 유일한 테이블 또는 뷰이다.

마지막으로 모든 권한 ID에 MYSELECTS 뷰를 활성화 할 수 있고 PUBLIC에서 기본 뷰(SYSCAT.TABAUTH)에 대한 SELECT 권한을 취소할 수 있다. 기본 뷰에 대한 간단한 쿼리로 사용자 MELNYK와 PUBLIC이 MYSELECTS 뷰에 대해 SELECT 권한을 갖고 있다는 것이 확인된다. 그 ID가 뷰 생성자이기 때문이고, SELECT 권한이 PUBLIC에 명확하게 주어졌기 때문이다.


Listing 11. SYSCAT.TABAUTH 시스템 카탈로그 뷰에 기반한 뷰의 생성 및 사용
create view myselects as select tabschema, tabname from syscat.tabauth where granteetype = 'U' and grantee = user and selectauth = 'Y' select m.tabschema, m.tabname, t.type from myselects m, syscat.tables t where m.tabschema = t.tabschema and m.tabname = t.tabname

TABSCHEMA TABNAME TYPE
------------... ----------... ----
MELNYK MYSELECTS V
1 record(s) selected.

grant select on table myselects to public revoke select on table syscat.tabauth from public select tabschema, tabname, selectauth, grantee from syscat.tabauth where tabname = 'MYSELECTS'

TABSCHEMA TABNAME SELECTAUTH GRANTEE
------------... ----------... ---------- -------...
MELNYK MYSELECTS Y MELNYK
MELNYK MYSELECTS Y PUBLIC 2
record(s) selected.





요약

DB2 UDB 시스템 카탈로그는 데이터베이스 객체들을 설명하는 테이블들의 모음이다. DB2 UDB는 많은 뷰들을 제공한다. 이 뷰를 통해 데이터베이스의 작동방법을 이해하는데 도움이 되는 정보들을 쿼리할 수 있는 것이다. 뷰에 접근하려면 개별 쿼리나 스크립트를 구현할 수 있고 또는 DB2 Control Center를 통해 이 뷰에 쉽게 접근할 수 있다. 이 글에서는 유용한 쿼리에 대한 다양한 예제를 선보였지만 겉핥기에 불과하다. 여러분 스스로 공부해보기 바란다.




참고자료





필자소개

Roman Melnyk, DB2 Information Development, IBM

 

출처 : http://www-128.ibm.com/developerworks/kr/library/dm-0411melnyk/

'DB2' 카테고리의 다른 글

01 Basic SQL Procedure Structure  (0) 2006.04.03
DB2기초 : 재미있는 날짜와 시간  (0) 2006.03.24
DB2의 제약조건  (0) 2006.03.24
[본문스크랩] DB2 지원되는 함수 및 SQL 관리 루틴  (0) 2006.03.22
DB2 UDB 운용명령어  (0) 2006.03.20
 
블로그 이미지

시반

시반(詩伴)이란 함께 시를 짓는 벗이란 뜻을 가지고 있습니다. 함께 나눌수 있는 그런 공간이길 바라며...

카테고리

분류 전체보기 (233)
개발 이야기 (73)
WEB2.0 (57)
DB2 (24)
MySQL (6)
오라클 (26)
기타 (44)
취미 (0)
잡담 (2)