database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
ㆍDB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
DB2 Q&A 1365 게시물 읽기
No. 1365
호스트 변수와 SQL 문장의 로그 출력
작성자
초보
작성일
2007-06-24 02:26ⓒ
2007-06-24 02:32ⓜ
조회수
8,936

지금까지 오라클을 사용해서 Pro-C 프로그래밍을 해 왔습니다만,

이번에 DB2 로 처음 개발을 하게 되었네요.


1. fetch 질문

: DB2에서는 호스트 변수를 이중배열이나 구조체 배열로 선언할 수가 없는 것 같은데요.

  fetch는 항상 한 건씩밖에 못 하는건가요?


2. 다이나믹 SQL 문장

 : using구를 사용해서 SQL을 실행할 때 에러가 발생하면, 그 시점에 실행된 SQL문장을

   로그로 남기고 싶은데요. 물론 변수가 바인딩 되어 있는 상태로요.

   고객 쪽에서 에러를 발생시킨 SQL 문장 자체를 로그로 남겨달라고 해서요.


   에러가 발생했을 때 다이나믹 SQL에 바인딩 변수를 설정하는 등 편집을 통한 방법 말고,

   DB2 관련 헤더 파일의 어느 구조체가 실행시킨 SQL문장을 보관한다든지 하는 건 없을까요.

   다이나믹 sql문장과 using 구에 사용된 키 값을 있는 그대로 출력해서 보여주는 것도

   괜찮을 듯 싶지만...

   혹시 이런 경험이 있다면 여러분은 어떤 방법으로 하셨습니까.

이 글에 대한 댓글이 총 1건 있습니다.

1. 시스템에 따라서 틀립니다. z/OS는 V8 이상은 muliple row fetch가됩니다.
사용법은 메뉴얼참고하시고 REXX, Fortran, SQL Procedure 는 안됩니다.

2. 다이나믹 SQL의 바인딩은 EXECUTE 실행시 되는게 아니고 PREPARE시
 바인딩할겁니다.  EXECUTE 실행시는 단지 변수값만 넘겨주는 것일겁니다.
 SQL문장을 보관하더라도 변수값이 없는 상태로 보관될것입니다.
 편집을 통한 방법을 SUB프로그램으로 만들어서 사용해야 될듯합니다.


* 아래는 동적SQL캐쉬에 대한 메뉴얼 내용임. 참고하세요.

정적 SQL문이 첫번째로 참조되거나 동적 SQL문이 첫번째로 준비될 경우, 동적 및 정적 SQL문을 실행하는 데 필요한 정보는 데이터베이스 패키지 캐쉬에 보관되어 있습니다. 이 정보는 데이터베이스 종료할 때, 다른 명령문에서 캐쉬 공간을 필요로 할때, 정보가 유효하지 않을 때까지 패키지 캐쉬에 남아 있습니다.

SQL문이 실행되거나 준비되면, 응용프로그램 발행 요청과 관련된 패키지 정보는 시스템 카탈로그에서 패키지 캐쉬로 로드됩니다. 개개의 SQL문에 대해 실제로 실행되는 섹션은 캐쉬에 위치됩니다. 명령문이 첫번째로 참조되거나 동적 SQL 섹션이 작성된 후에 직접 캐쉬에 위치되면, 시스템 카탈로그로에서 정적 SQL 섹션이 읽혀지고 패키지에 위치됩니다. 동적 SQL 섹션은 PREPARE 또는 EXECUTE IMMEDIATE문과 같은 명시적 명령문으로 작성할 수 있습니다. 일단 작성되면 원래의 섹션이 공간 관리 이유로 삭제되거나 환경 변경으로 인해 유효하지 않게 될 경우, 동적 SQL문에 대해 섹션은 시스템이 수행한 내재적으로 준비된 명령문으로 재작성할 수 있습니다.

각 SQL문은 데이터베이스 레벨에서 캐쉬되며, 응용프로그램들 사이에서 공유할 수 있습니다. 정적 SQL문은 동일한 응용프로그램들 사이에서 공유할 수 있습니다; 동적 SQL문은 아주 동일한 명령문 텍스트와 동일한 컴파일 환경으로 응용프로그램들 사이에서 공유할 수 있습니다. 응용프로그램이 발행한 각 SQL문의 텍스트는 내재적 준비가 필요한 이벤트에 사용하기 위해 응용프로그램에 지역적으로 캐쉬됩니다. 응용프로그램의 PREPARE문은 각각 하나의 명령문을 캐쉬할 수 있습니다. 응용프로그램의 모든 EXECUTE IMMEDIATE문은 캐쉬 공간을 공유하며, 모든 EXECUTE IMMEDIATE문에 대해 한 번에 하나의 캐쉬문만이 존재합니다. 동일한 PREPARE 또는 임의의 EXECUTE IMMEDIATE문이 항상 다른 SQL문으로 여러 번 발행되면, 마지막 명령문만이 재사용을 위해 캐쉬에 보관됩니다. 캐쉬의 선택적 사용으로 응용프로그램이 한 번 시작되고 나면 필요에 따라 EXCUTE 또는 OPEN문과 서로 다른 번호의 PREPARE문이 발행될 것입니다.

캐쉬된 동적 SQL문을 사용함에 있어, 일단 명령문이 작성되면, 명령문을 다시 준비할 필요없이 여러 작업 단위(UOW)에서 재사용할 수 있습니다. 시스템은 환경이 변경되는 경우, 필요에 따라 명령문을 다시 컴파일합니다.

박진복(pjb708)님이 2007-06-25 15:03에 작성한 댓글입니다.
이 댓글은 2007-06-25 16:53에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
1368DB2 DATE 데이터 타입 데이터 insert 방법 [1]
이충섭
2007-06-28
9454
1367db2 codeset문제 [1]
미스터백
2007-06-27
9521
1366com.ibm.db2.jcc.b.SqlException 에러 문의입니다. 도와주세요
크림
2007-06-26
9489
1365호스트 변수와 SQL 문장의 로그 출력 [1]
초보
2007-06-24
8936
1364TRANSLATE 문제 [1]
초보
2007-06-21
8930
1363Insert 작업시 시스템 날짜을 넣고 싶은데 안되네요?? [1]
초보자
2007-06-20
8972
1362쿼리를 실행하는 영역에 따라서 결과값이 다르게 나옵니다. [1]
이준식
2007-06-14
8666
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다