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 2282 게시물 읽기
No. 2282
서브SP의 결과를 루프중인 메인SP의 임시테이블에 넣고 싶습니다.~
작성자
궁금이(프리님)
작성일
2008-08-29 17:28ⓒ
2008-08-29 18:40ⓜ
조회수
10,305

오라클만 사용하다 sybase 사용이 처음이라
헤매고 있습니다. 좀 도와주세요^^


2개의 SP 가 있습니다.
편의상 메인SP, 서브SP 라고 할때,

메인SP 내에서 커서를 돌면서
서브SP를 호출합니다
호출한 결과를 메인SP상의
임시테이블에 insert 하고자 할때, 어떻게 하면 좋을까요?

빨간색 굵은 글씨 부분에 대해 알려주세요 (오류부분)

메인SP

create proc sp_A
as
  create table #임시테이블(....,...,..)

  ...
  declare cursor_A cursor for
     select ...

  open cursor_A

   while (@@fetch_status=0)
      begin
           fetch cursor_A into @변수
      insert into #임시테이블
      EXEC 서브SP명 @변수    -- 서브SP 호출한 결과를 메인 SP의 #임시테이블에 insert 하고자함 (오류)

           ....
      end

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

위의 것처럼 하시는게 맞습니다.

1. 임시 table create
CREATE TABLE #main (a INT)

2.sub proc create
CREATE PROC sp_sub
AS
INSERT #main VALUES (1)

3. main proc create

CREATE PROC sp_main
AS
CREATE TABLE #main (a INT)
SELECT * FROM #main
EXEC sp_sub
SELECT * FROM #main



exec sp_main


수행 결과


a

a
1



지연님이 2008-09-01 08:29에 작성한 댓글입니다. Edit

지연님의 답변 감사드립니다.^^

근데, 제가 하고자 했던 부분과는 약간 의미가 다르네요..
잠깐 설명을 드리면...현재 트리구조를 구현중인데요..
오라클에서 START WITH .. CONNECT BY PRIOR 를 사용해서
구현했던 부분을 Sybase로 변환중입니다.

메인SP에서 레벨이 1인 최상위 루트노드를 SELECT한 후
커서를 통해 WHILE문 내에서 서브SP를 지속적으로
호출해 해당 루트 노드 하위의 노드들을 메인SP의 임시테이블에
저장후 최종적으로 메인SP에서 결과를 리턴하기 위함입니다.

설명이 쓸데없이 장황한데요...여기서 안되는 부분을 쉽게말씀드리면...

즉,

EXEC 서브SP명 @변수

위 statment를

INSERT INTO #테이블 또는 SELECT .. INTO #테이블
statement와
같이 쓰고자 합니다.

INSERT INTO 테이블
SELECT ...

처럼 말이죠. 

그럼, 다시한번 답변 부탁드립니다.~~ 꾸벅^^

궁금이(프리님)님이 2008-09-01 11:12에 작성한 댓글입니다.
이 댓글은 2008-09-01 11:12에 마지막으로 수정되었습니다.

Sybase IQ에서는 프로시저를 테이블처럼 쓸 수 있습니다.

select * from (sp_iqstatus()) 와 같이 말입니다.


ASE에서는 지원이 되지 않습니다.


사용하시는 Sybase DBMS 종류가 무엇인가요?


ASE를 사용하신다면, Sub 프로시저에서 return 값을 변수에 저장한 후에 insert 하면 됩니다.


declare @ret int


exec @ret = 서브SP명 @변수

insert into #임시테이블

select @ret

울랄라님이 2008-09-01 13:48에 작성한 댓글입니다. Edit

울랄라님의 답변 감사드립니다.


DBMS는 ASE 15.0.2 를 사용하고 있습니다..


말씀하신대로 리턴값이 int나 varchar 등 하나일 값일 경우는 저도 알겠는데요..

하나의 값이 아닌 여러 칼럼의 내용을 가진 레코드형태(테이블 형태)로 리턴을 받아야합니다.


function 으로 처리를 하려고 해도


create function ...

returns table  <=== ms-sql 처럼 이렇게 테이블을 return하는게 없는듯...


function 이든 proc 이든 테이블 형태로 리턴을 받아야 하는데...


방법이 없을까요?

궁금이(프리님)님이 2008-09-01 14:21에 작성한 댓글입니다.

그렇다면, 서브 프로시저에서 #temp 테이블에 insert하도록 하세요.


create proc 메인proc

as


create table #temp

(col1 char(10) null,

col2 int null)


...


exec 서브PROC @변수


select * from #temp

return

go



create proc 서브PROC

(@변수 int)

as


insert into #temp select ... from 테이블


return

go

울랄라님이 2008-09-01 16:54에 작성한 댓글입니다. Edit

답변 감사합니다.

울랄라님 처럼도 해봤었는데

서브 SP 생성시 #temp (메인 SP 상에서 생성한 임시테이블)를

찾을 수 없다고 오류가 나면서 프로시저가 생성되지 않았습니다.

궁금이(프리님)님이 2008-09-01 18:02에 작성한 댓글입니다.

해결했습니다.

서브SP에서 insert 하는 처리를 dynamic 으로 처리하니

오류가 안뜨고 잘되는군요.

답변해주신 지연님, 울랄라님 감사합니다.^^

궁금이(프리님)님이 2008-09-02 09:30에 작성한 댓글입니다.

해결되었다니 다행이군요.


참고로, 서브SP에서 #temp 없다는 메시지가 나올 경우에는

#temp를 먼저 생성한 후에 프로시저를 생성하면 됩니다.


또한, 서브SP를 call할 때는 메인프로시저에서 항상 #temp 테이블이 먼저 생성되어 있어야 합니다.


수고하세요.

울랄라님이 2008-09-02 13:23에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
2285er윈이라는 곳에서 만들었는데싸이베이스에선 타입을어떻게... [1]
홍종진
2008-09-02
7059
2284오라클 select * from tab [2]
김범한
2008-09-02
8481
2283ASA (Adaptive Sql Anywhere) 6.0 구해요. [1]
한상욱
2008-08-29
6988
2282서브SP의 결과를 루프중인 메인SP의 임시테이블에 넣고 싶습니다.~ [8]
궁금이
2008-08-29
10305
2281load 하는 것이 바람직 문의.... [2]
배우신
2008-08-28
7600
2280procedure 삭제방법? (도와주세요) [1]
마신자
2008-08-28
6906
2279insert하려고 하는데 계속 Lock이..., IQ12.7 왕초보문의 [4]
장광일
2008-08-27
9436
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다