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
운영게시판
최근게시물
Oracle Q&A 37233 게시물 읽기
No. 37233
PROCEDURE에서 WITH AS 의 사용법
작성자
유저
작성일
2010-01-19 13:20
조회수
4,475

with tmp as
  ( 
  SELECT  '1' FROM DUAL
  ) select * from tmp;

  IF I_PROCESS_ID = 'CNT' THEN
    select count(1) from tmp; <--- tmp를 여기에서 재사용할 수 있는 방법(??)
  END IF;
  
  IF I_PROCESS_ID = 'S' THEN
   select * from tmp;
  END IF;
 

상위에서 with as로 만든 tmp를 하위에서 if문으로 다시 select를 하고 싶은데

방법이 없네요 ㅠㅠ

좋은 수가 없을까요??

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

view를 생성 하셔서 사용하시는게 좋을것 같습니다.

서성우님이 2010-01-19 14:30에 작성한 댓글입니다. Edit

-- global temporary table 이용해보시죠.

create  global temporary table temp
        on commit preserve rows  as
select ..... ; -- temp에 놓을 쿼리


select * from temp;
.
select * from temp;
.

truncate table temp;
drop table temp;

박진복(pjb708)님이 2010-01-19 19:21에 작성한 댓글입니다.

박진복님 답변 감사드립니다.

global temporary table 는 처음 보는 방법인데 귀한 걸 알려주셔서 정말 감사합니다.

==================================================================

 IF I_PROCESS_ID = 'CNT' THEN
    select count(1) from tmp; <--- tmp를 여기에서 재사용할 수 있는 방법(??)
  END IF;
  
  IF I_PROCESS_ID = 'S' THEN
   select * from tmp;
  END IF;

를 사용한 이유가 조회화면에서 페이징을 하기 위해서 입니다.

보통이라면 총건수를 가져오기 위한 쿼리와

총건수를 가지고 페이지와 페이지당 가져올 건수를 설정해서

다시 똑같은 조회조건으로 쿼리를 실행해야 되잖아요?

return값만 다른 동일 쿼리를 2벌로 가져갈 것이 아니라 1벌로 가져갔으면 싶어서

이렇게 글을 올렸습니다.

==================================================================

근데 의문이 드는건 Create 와 truncate 와 drop인데. . .메모리를 지나치게 많이 잡아먹진 않을까요?

많은 유저가 사용하는 조회성 화면의 쿼리에 사용해도 서버는 괜찮을까요??

조회 트랜잭션이 일어날 때마다 임시테이블의 생성, 삭제가 일어나게 되면. . .

시스템의 추가적인 오버헤드가 발생해서 더 문제가 될 여지는 없나요??

더군다나 총건수가 많을 경우는 그 건수만큼 insert / truncate가 발생한다는 건데. . .

유저님이 2010-01-21 00:27에 작성한 댓글입니다.
이 댓글은 2010-01-21 00:51에 마지막으로 수정되었습니다. Edit

global temporary table은
session이 끝나면 자동 삭제됩니다.
truncate와 drop은 계속 작업할때 사용하세요.

 

그리고 위와같은 목적이라면 %ROWCOUNT를 쓰세요.

( %ROWCOUNT yields the number of rows affected
by an INSERT, UPDATE, or DELETE statement,
or returned by a SELECT INTO statement.
%ROWCOUNT yields 0 if an INSERT, UPDATE, or DELETE statement
affected no rows, or a SELECT INTO statement returned no rows.)

 

Example  Using  SQL%ROWCOUNT

 

CREATE TABLE employees_temp AS SELECT * FROM employees;
DECLARE
  mgr_no NUMBER(6) := 122;
BEGIN
  DELETE FROM employees_temp WHERE manager_id = mgr_no;
  DBMS_OUTPUT.PUT_LINE('Number of employees deleted: ' || TO_CHAR(SQL%ROWCOUNT));
END;
/

박진복(pjb708)님이 2010-01-26 08:29에 작성한 댓글입니다.
이 댓글은 2010-01-26 11:39에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
37236접속한 아이디(스키마) 알아내는 방법이 있나요? [2]
이성민
2010-01-20
2980
37235테이블내 같은값중 최근/과거값 구하기 [1]
RnTl
2010-01-19
3293
37234ORA-00283 이후 ORA-00368 , ORA-00353 [3]
이준영
2010-01-19
5166
37233PROCEDURE에서 WITH AS 의 사용법 [4]
유저
2010-01-19
4475
37232카테고리 트리 구조 쿼리 도움 부탁드려요. [1]
김민석
2010-01-19
3442
37230minus [2]
카오리
2010-01-19
3360
37229오라클 8i 구할 수 있을까요? [1]
박신득
2010-01-18
2805
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다