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 845 게시물 읽기
No. 845
store procedure 내 SQL 문 동적 구성에 대해
작성자
양한근(myskuld)
작성일
2005-10-05 17:18
조회수
6,614

DB2에서 store procedure(이하 sp)를 구성하는데

제가 원하는 동적 구성은 select 하게 될 컬럼과 where 절의 조건, 이 두가지가 모두

동적으로 들어갑니다.

 

select a,b 가 될수도 있고 select a,b,c,d가 될 수도 있는 것이죠.

아래의 예제는 필드가 동적으로 되는데, where절의 조건부를 in 파라메터로 처리했는데

where절 부분이 인식이 안됩니다.

 

CREATE PROCEDURE ACS_GETREGINFO3(
IN inparam VARCHAR(19),
IN inparam2 VARCHAR(16),
OUT result VARCHAR(19)
)
SPECIFIC ACS_GETREGINFO3
DYNAMIC RESULT SETS 1
NOT DETERMINISTIC
LANGUAGE SQL
BEGIN

DECLARE stmt VARCHAR(1000) DEFAULT '';
DECLARE result2 VARCHAR(1000) DEFAULT '';


DECLARE c1 CURSOR WITH RETURN TO CLIENT FOR s1;

 

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
SET result2 = 'PROCEDURE_FAILED';

 

SET result = inparam2; -- 혹시나 해서

 

-- 여기가 문제입니다. inparam은 "a,b,c" "a,b,c,d"를 맘대로 뽑아올 수 있는데

-- where의 card_no 이후의 inparam2에 대해서 인식이 안되는지

-- 결과 셋을 받아오지 못합니다. 항상 null이네요.

SET stmt = 'SELECT ' || inparam || ' ' || 'FROM TBV3DACHD WHERE ' ||
'card_no =' || inparam2;

 

-- 혹시나 해서 out 파라메터를 따로 둬보고 해당 값을 string으로 받아서

-- java app.단에서 출력해봤는데, 값은 맞게 나왔었구요....


PREPARE s1 FROM stmt;
EXECUTE s1;

 

OPEN c1;

 

END@

 

-- 고수 여러분들의 깊고 넓으신 한 수 가르침 부탁드립니다 (_._)

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

님의 예제에서

컬럼 card_no가 character일경우에 search 조건이 string이어야 합니다. 숫자값이 경우에는 프로시저를

call ACS_GETREGINFO3('1','2',?);

이렇게 실행시켜도 되지만 문자열일 경우에는 달라집니다.

실제 실행되는 sql은

select 1 from TBV3DACHD WHERE card_no = 2

character 일경우에는 다음과 같이 실행하셔야 합니다.

call ACS_GETREGINFO3('''a''','''b''',?) 이렇게 입력하셔야 예제의 sql문이 다음과 같이 보입니다.

select 'a' from TBV3DACHD WHERE card_no = 'b'

 

프로시저에서는 single quotes(')가 escape character역할을 합니다.

만일 where 절의 조건절을 in 파라메터로 처리하려고 하면 다음과 같이 입력하셔야 합니다.

call ACS_GETREGINFO3('''a''','card_no in (''a'',''b'')',?)

김동주님이 2005-10-06 01:34에 작성한 댓글입니다.
이 댓글은 2005-10-06 01:39에 마지막으로 수정되었습니다. Edit

답글 정말 감사드립니다!

다시 질문이 있습니다.

 

sql은

select a, b from table_name where card_no = '값'

인 상태에서 꺼낼 필드 항목(개수)는 현재 변수 전달을 통해서

"a,b"나 "a,b,c"를 call proc_name('?','?')을 통해서 전달이

된다고 말씀드린 바 있습니다.

 

그러면 ' 를 세개로 감싸서 '''변수명''' 을 해서 전달을하고,

(  call proc_name('필드쪽', '''where절 변수''') 식으로? )

where 절을

'where card_no=' || 받은 프로시저변수명 으로 쓰면 된다는말씀인지요?

 

그리고 마지막 부분에 'card_no in ... ' 부분이 이해가 잘 안되네요.

 

ps. 죄송하지만  myskuld 골뱅이 gmail.com 으로 메일 주소를 하나 부탁드려도 될까요, 회사에서 DB2에서 상당히 무지한 채 개발을 급하게 들어가는 상황인데, 위 문제가 걸려있는지라.... 죄송합니다.

양한근(myskuld)님이 2005-10-06 12:42에 작성한 댓글입니다.
이 댓글은 2005-10-06 12:42에 마지막으로 수정되었습니다.

님의 예제에서

만약 테이블 TBV3DACHD 가

ID INTEGER, NAME VARCHAR(10), CARD_NO VARCHAR(10)

컬럼으로 구성되어 있다고 하면

 

예제 소스에서 sql문을 아래와 같이 바꾸면

SET stmt = 'SELECT ' || inparam || ' ' || 'FROM TBV3DACHD '||inparam2;

 

where절을 파라메터로 받아야 합니다.

TBV3DACHD 테이블에서 card_no 가 'ABCD'인 ID,NAME 컬럼을

출력하기 위해서는 다음과 같이 프로시저를 실행하시면 됩니다.

 

call ACS_GETREGINFO3('ID,NAME','where card_no = ''ABCD''',?);

 

그럼 프로시저에서 실행하는 sql은

select ID,NAME FROM TBV3DACHD where card_no = 'ABCD' 가 되겠죠

그리고 이전의 card_no in ...... 도 위의 예와 같습니다.

^^

 

김동주님이 2005-10-06 13:12에 작성한 댓글입니다.
이 댓글은 2005-10-06 13:13에 마지막으로 수정되었습니다. Edit

잘 됩니다!!!

 

정말 감사합니다!! 꾸벅!! (_._)

양한근(myskuld)님이 2005-10-07 14:08에 작성한 댓글입니다.

ㅎㅎ 별 말씀을 잘되신다니 다행이네요 (^^)

김동주님이 2005-10-07 14:56에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
848LTRIM과 RTRIM관련 질문입니다 ㅠ.ㅠ [1]
문상옥
2005-10-07
5807
847IBM-DB2 페이징 질문입니다. [3]
전영수
2005-10-06
7085
846DB2 함수 관련 초보 질문입니다 [1]
saogi
2005-10-06
8103
845store procedure 내 SQL 문 동적 구성에 대해 [5]
양한근
2005-10-05
6614
844질문좀 제발 갈켜주세용.ㅠ.ㅠ 구걸모드.ㅠ.ㅠ [1]
장형욱
2005-10-03
4659
843테이블스페이스 확장 [1]
백봉현
2005-09-29
5720
840DbConn 에 대해서..궁금~! [3]
로위나
2005-09-21
5095
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다