Oracle 데이터베이스에서 임시 테이블을 어떻게 생성합니까?


90

Oracle 데이터베이스에 임시 테이블을 만들고 싶습니다.

같은 것

Declare table @table (int id)

SQL 서버에서

그런 다음 select 문으로 채 웁니다.

가능할까요?

감사

답변:


130

네, Oracle에는 임시 테이블이 있습니다. 여기에 그들을 설명 하는 AskTom 기사에 대한 링크가 있으며 여기 에 공식 오라클 CREATE TABLE 문서가 있습니다.

그러나 Oracle에서는 임시 테이블 의 데이터 만 임시입니다. 테이블은 다른 세션에서 볼 수있는 일반 개체입니다. Oracle에서 임시 테이블을 자주 만들고 삭제하는 것은 나쁜 습관입니다.

CREATE GLOBAL TEMPORARY TABLE today_sales(order_id NUMBER)
ON COMMIT PRESERVE ROWS;

Oracle 18c는 단일 세션 메모리 내 개체 인 개인 임시 테이블을 추가했습니다. 자세한 내용 은 설명서 를 참조하십시오. 개인용 임시 테이블은 동적으로 작성 및 삭제할 수 있습니다.

CREATE PRIVATE TEMPORARY TABLE ora$ptt_today_sales AS
SELECT * FROM orders WHERE order_date = SYSDATE;

임시 테이블은 유용 할 수 있지만 Oracle에서는 일반적으로 남용됩니다. 인라인 뷰를 사용하여 여러 단계를 단일 SQL 문으로 결합하면 이러한 문제를 피할 수 있습니다.


40
반대 투표는 없지만 글로벌 임시 테이블에 대해 CREATE TABLE AS SELECT를 권장하지 않습니다. 경험이 적은 개발자는 매번 GTT를 채워야한다는 잘못된 생각을 할 수 있습니다. 물론 이것은 다른 테이블에서 정의를 복사하는 편리한 방법이지만이 예제는 아마도 일부 사람들을 혼란스럽게 할 것입니다.
Jeffrey Kemp

저는 여기 Jeffrey Kemp의 의견에 전적으로 동의합니다. 이것은이 테이블을 생성하는 한 가지 방법 일뿐입니다.이 문제를 발견하고 깨달았습니다.이 select 문을 DDL에 넣어야합니까?
Vijay Kumar

3
"where 1 = 0"만 추가하면됩니다.
Palcente

@Palcente는 여전히 임시 테이블을 만들기 위해 동일한 구조의 "실제 테이블"이 필요하다는 것을 암시합니다. 이는 사실이 아닙니다 (또한 이 답변 참조 . 그 외에도이 답변은 글로벌 임시 테이블,하지만 하나는 "일반"임시 테이블을 사용할 수 있습니다. SQL 서버의 차이는, 같은 마태 복음에 의해 지적 , 또 다른 중요한 점 하나는해야한다이다 확실하지 "두 번째 호출"에 오류에 대한 미스 (또는 경이 개체가 이미 존재에 대해)
이지

2
유효한 사용 사례 CREATE TABLE AS SELECT: LOB 열이있는 원격 테이블 SELECT에서 직접 선택할 수 없으므로 선택 합니다. 저는 원격 데이터베이스에서 레코드를 복사하는 절차를 작성 중이며 이것이 제 해결책이었습니다. 레코드를 GTT로 가져온 다음 그로부터 "실제"테이블로 복사하는 것입니다.
rgoliveira

78

팁 .. Oracle의 임시 테이블은 SQL Server와 다릅니다. 모든 세션이 아닌 한 번만 생성합니다. 여기에 삽입 한 행은 세션에서만 볼 수 있으며 세션 을 종료 할 때 (또는 사용하는 "ON COMMIT"절에 따라 트랜잭션이 종료 될 때) 자동으로 삭제됩니다 (예 : TRUNCATE아님 DROP).


15
나는 완전히 이해하지 못합니다. 모든 세션이 아니라 한 번만 생성한다고 말씀하셨습니다. 그러나 당신은 또한 임시 테이블이 매 세션마다 삭제된다고 말했습니다. 매 세션마다 임시 테이블을 만들어야한다는 뜻이 아닙니까?
카오스

31
DELETED, DROPped가 아닙니다 .
Tripp Kinetics

10
매 세션마다 임시 테이블을 생성하지 않고 한 번만 생성합니다. 테이블은 시스템 전체에서 사용할 수 있습니다. 테이블은 병렬 세션을 포함하여 생성 한 모든 세션에서 액세스 할 수 있습니다. 그러나 한 세션 내부에서 데이터를 삽입하면 해당 데이터는 시스템의 다른 병렬 세션에서 볼 수 없습니다. 한 세션의 데이터는 해당 세션의 속성입니다. 따라서 데이터는 시스템별로 표시되지 않고 세션별로 다릅니다. 따라서 한 세션을 닫으면 해당 세션의 데이터가 테이블에서 삭제됩니다.
SubhasisM

33
CREATE GLOBAL TEMPORARY TABLE Table_name
    (startdate DATE,
     enddate DATE,
     class CHAR(20))
  ON COMMIT DELETE ROWS;

10
행은 항상 세션이 끝날 때 삭제됩니다. ON COMMIT DELETE ROWS세션 중에 점진적으로 커밋하면 더 빨리 삭제됩니다.

1
zygimantus, 예, 세션 중에 수동으로 삭제할 수 있습니다. 세션 중에 임시 테이블은 일반 테이블과 똑같이 작동합니다. 사용자 관점에서 임시 테이블과 실제 테이블의 유일한 차이점은 세션이 종료되면 모든 행이 삭제되고 다른 세션이 세션에서 사용하는 테이블의 내용을 읽을 수 없다는 것입니다. 세션 당 테이블 인스턴스가 있습니다. 두 세션은 동일한 임시 테이블을 동시에 사용할 수 있으며 충돌없이 두 개의 다른 행 세트를 가질 수 있습니다.
Hans Deragon

-2

CREATE TABLE table_temp_list_objects AS

SELECT o.owner, o.object_name FROM sys.all_objects o WHERE o.object_type = 'TABLE';


답을 형식화하십시오. 코드에 대해 뭔가를 작성하면 좋을 것입니다.
호스텔
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.