2011-10-25 2 views
0

일일 작업에 따라 실행되는 PL-SQL 저장 프로 시저에서 작업 중입니다. 저장 프로 시저 나는 그런 전역 임시 테이블을 사용하는 것을 시도하고있다 :작업에서 전역 임시 테이블 사용

CREATE GLOBAL TEMPORARY TABLE A_Table 
ON COMMIT PRESERVE ROWS 
AS SELECT * from B_Table 

을 한 후 나는 그런 인덱스 만들려고합니다

: 나는이 문제가

CREATE INDEX idx_a ON A_Table (id) 

  1. 작성한 테이블은 항상 비어 있으므로 저장 프로 시저의 모든 계산은 0이됩니다.
  2. 나는이 오류가 발생했습니다 인덱스를 생성하려고 할 때 :

    ORA-14452 : 이미 사용 어떤 조언

에서 임시 테이블에 인덱스를 생성, 변경 또는 드롭을 시도하십시오 ??

안부

답변

3
  1. (당신이 on commit delete rows를 지정하는 경우 또는 거래)에만 세션의 나머지가있을 것입니다 임시 테이블에 넣어 모든 데이터. 세션간에 데이터를 저장하려면 일반 테이블을 사용하십시오.

  2. 임시 테이블을 사용하는 세션을 닫고 다시 시도하십시오.

0
  1. 를 채우고 당신이 비어 있지만 세션하지 될 수있다 만든 테이블. 각 세션은 임시 테이블의 자체 인스턴스입니다. 그것은 임시 테이블의 주요 특징입니다.

  2. 온도의 변경. 이제까지 그것을 사용했던 모든 세션 (활성하지 않을 수 있습니다)

1

당신은 임시 테이블을 만들 언급하지만, 아마도 당신은 한 번 생성하고이를 각을 다시 시도하지 않는 살아있는 동안 테이블은 불가능하다 plsql 코드가 실행될 때, 그리고 인덱스 정의가 임시 테이블에 남아있을 수 있습니다. 이것은 코드를 실행할 때마다 생성 될 필요가 없습니다.

전역 임시 테이블에는 정적 정의가 있습니다.이 테이블을 만들면 거기에 있지만 다시 실행/실행 취소가 생성되지 않으며 해당 데이터가 채워진 세션에서만 볼 수 있습니다.

SQL*Plus: Release 10.1.0.4.2 - Production on Wed Oct 26 01:23:17 2011 

    Copyright (c) 1982, 2005, Oracle. All rights reserved. 


    Connected to: 
    Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production 

    SQL> select * from test; 

    no rows selected 

    SQL> insert into test values ('three'); 

    1 row created. 

    SQL> select * from test; 

    NAME 
    -------------------- 
    three 

위로 첫 번째 세션 SQL> 커밋 다른 세션이어서

SQL*Plus: Release 10.1.0.4.2 - Production on Wed Oct 26 01:22:30 2011 

    Copyright (c) 1982, 2005, Oracle. All rights reserved. 


    Connected to: 
    Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production 

    SQL> create global temporary table test (name varchar2(20)); 

    Table created. 

    SQL> insert into test values ('one'); 

    1 row created. 

    SQL> insert into test values ('two'); 

    1 row created. 

    SQL> select * from test; 

    NAME 
    -------------------- 
    one 
    two 

; 우리는 우리의 두 번째 세션에서 데이터를 삽입하기 때문에 우리가 두 번째 세션에서 커밋 될 때까지

Commit complete. 

    SQL> select * from test; 

    no rows selected 

    SQL> drop table test; 
    drop table test 
       * 
    ERROR at line 1: 
    ORA-14452: attempt to create, alter or drop an index on temporary table already 
    in use 

, 우리는 임시 테이블 에 아무것도 할 어차피 다음 드롭은

당신은 내용을 가지고 할 수있는 옵션이 성공 세션을 종료 할 때까지 (커밋 행을 삭제할 때) 커밋 할 때 또는 커밋을 보존 할 때까지 데이터를 보관할 때 세션을 삭제합니다.