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
운영게시판
최근게시물
Sybase Q&A 1442 게시물 읽기
No. 1442
asiq EXECUTE IMMEDIATE 문의
작성자
손유근(00000s)
작성일
2006-02-17 15:19
조회수
4,801

오늘 처음으로 올려 봅니다.

 

sybase asiq 를 사용하고 있습니다.

프로시저에서 dynamic sql 문을 사용하여 select 하는 내용입니다.

tbtmsa01 테이블에 칼럼이 key, sa1, sa2, sa3, sa4, sa5, sa6, sa7, sa8, sa9 ,sa10

있다고 했을때

key = '1' 일 경우에는 sa1, sa2, sa6, sa9

key = '2' 일 경우에는 sa3, sa4, sa5, sa7, sa8, sa9

나오게끔 할려 고 하는데요..

예)

CREATE PROCEDURE PTMP (

IN key CHAR(1) -- 키값

)

begin

if key = '1' then

set v_sql = 'sa1, sa2, sa6, sa9' ;

else

set v_sql = 'sa3, sa4, sa5, sa7, sa8, sa9' ;

end if;

 

EXECUTE IMMEDIATE '

select key,

' || v_sql1 ||'

from tbtmsa01

where key = ''1''

';

end;

1) 컴파일은 정상적으로 됩니다.

call ptmp('1'); 을 실행 했을경우

1, a, b, c, d 이렇게 5 개의 컬럼 이 나와야 되는데 아무것도 나오지 않습니다.

select 결과 값을 받을 려면 어떻게 해야되는지 궁금합니다.

 

답변 주시면 감사 하겠습니다.

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

다음과 같이 하세요.

 

CREATE PROCEDURE PTMP

(

IN @key CHAR(1) -- 키값

)

RESULT

(

key char(1),

sa1 char(10), /* 알맞게 수정바람 */

sa2 char(10), /* 알맞게 수정바람 */

sa3 char(10), /* 알맞게 수정바람 */

sa4 char(10), /* 알맞게 수정바람 */

sa5 char(10), /* 알맞게 수정바람 */

sa6 char(10), /* 알맞게 수정바람 */

sa7 char(10), /* 알맞게 수정바람 */

sa8 char(10), /* 알맞게 수정바람 */

sa9 char(10) /* 알맞게 수정바람 */

)

begin

declare v_sql varchar(100);

 

if @key = '1' then

set v_sql = 'sa1, sa2, sa6, sa9' ;

else

set v_sql = 'sa3, sa4, sa5, sa7, sa8, sa9' ;

end if;

 

EXECUTE IMMEDIATE ('select key,'|| v_sql ||'from tbtmsa01 where key = ''' || @key || '''')

;

end;

존넘님이 2006-02-17 16:24에 작성한 댓글입니다.
이 댓글은 2006-02-17 16:47에 마지막으로 수정되었습니다. Edit

다음은 테스트한 샘플입니다.

 

create table rich (a int, b int, c int);

 

insert into rich values (1,2,3);
insert into rich values (11,12,13);

 

 

create proc proc_rich_test
(
 in @key char(1)
)
result
(
 a int,
 b int,
 c int
)
begin
 declare @sql varchar(100);

 if @key = '1' then
  select @sql = 'select a,b   from rich';
 else
  select @sql = 'select a,c,b from rich';
 end if;

 execute immediate(@sql);
end;

 

/*

call proc_rich_test('1');

a   b

--  --

1   2

11   12


call proc_rich_test('2');

a  c  b

-- -- --

1  3  2

11  13  12
*/

존넘님이 2006-02-17 16:27에 작성한 댓글입니다.
이 댓글은 2006-02-17 16:30에 마지막으로 수정되었습니다. Edit

답변 감사 드립니다.

제가 알고 싶은것은 ASE DB 에서 실행하는것이아니고

ASIQ DB 에서 실행 시킬때 사용하는것입니다.

 

ASE  와 ASIQ 는 프로시저 작성시 차이점이 많습니다.

 

ASIQ 에서 사용할수 있는 내용을 알고 싶습니다.

 

손유근(00000s)님이 2006-02-17 17:09에 작성한 댓글입니다.

여거 ASIQ에서 한건데요 ^^;

존넘님이 2006-02-20 10:05에 작성한 댓글입니다. Edit

먼저 고맙습니다.

근데요 위에나와있는 프로시저를 그대로 사용하면

에러가 발생합니다.

 

select return more then one row

 

라는 에러 메세지가 발행합니다.

왜이렇죠..

 

이상하내.. 여기서만 안되는지 궁금합니다.

손유근(00000s)님이 2006-02-21 10:44에 작성한 댓글입니다.

IQ Version을 체크해 보세요.

 

12.6에서 정상 테스트 된 겁니다.

존넘님이 2006-02-22 15:49에 작성한 댓글입니다. Edit

두분 말이 다 맞는것 같습니다.

12.6 이전 버젼에서는 dynamic sql의 결과가 2건 이상이면 오류가 발생했으며 12.6에서 이런 점이 개선되어 옵션처리가 되었습니다. 아마도 손유근님이 사용하신 IQ 버젼이 12.6이 아니거나 옵션 설정이 잘못된것 같습니다. 자세한 내용은 IQ Reference Manual의 execute immediate 부분을 자세히 읽어보시기 바랍니다

 

세지아빠(sejiappa)님이 2006-02-23 10:24에 작성한 댓글입니다.

늦었습니다.

존넘님, 세지아빠님 넘 감사합니다.

버전이 12.5 이더군요..

 

한참 고생했는데 이런 경우가 생겼내요.

너무너무  감사 합니다.

건강하세요..

손유근(00000s)님이 2006-02-28 17:58에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
1445사이베이스에서 numeric를 string 타입으로 변경하는 방법좀 [2]
시그너스
2006-02-21
5176
1444사이베이스에서 numeric를 string 타입으로 변경하는 방법좀
시그너스
2006-02-21
3743
1443Column 추가 에러 [6]
급해요
2006-02-21
6583
1442asiq EXECUTE IMMEDIATE 문의 [8]
손유근
2006-02-17
4801
1441temp table 문제 입니다. [3]
조경남
2006-02-16
8359
1440out of LOCKS 문제.. [1]
허남훈
2006-02-15
4483
1439필드값을 전부 곱하려면. [4]
궁금
2006-02-15
3593
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다