복붙노트

[SQL] 오라클 10 로컬 임시 테이블 (저장 프로 시저의 범위에 대한)

SQL

오라클 10 로컬 임시 테이블 (저장 프로 시저의 범위에 대한)

나는 오라클에 새로운 오전. 나는 저장된 프로 시저에서 많은 양의 데이터를 처리해야합니다. 나는 임시 테이블을 사용을 고려하고있다. 내가 연결 풀링을 사용하고 응용 프로그램이 멀티 스레드.

여러 개의 저장 프로 시저 호출에서 데이터가 혼합되지 않도록 다른 테이블의 인스턴스가 저장 프로 시저를 호출 할 때마다 생성되는 방식으로 임시 테이블을 만들 수있는 방법이 있나요?

해결법

  1. ==============================

    1.당신은 당신이 오라클에 새로 말한다. 나는 당신이 임시 테이블을 사용하는 것이 매우 일반적이다 SQL 서버에 사용되는 같은데요. 덜 필요가 있기 때문에, 일반적이지 그래서 오라클은 다르게 작동합니다.

    당신은 당신이 오라클에 새로 말한다. 나는 당신이 임시 테이블을 사용하는 것이 매우 일반적이다 SQL 서버에 사용되는 같은데요. 덜 필요가 있기 때문에, 일반적이지 그래서 오라클은 다르게 작동합니다.

    곰 염두에 임시 테이블을 사용하여 다음과 같은 오버 헤드를 부과하는 것을 : 그 활동의 프로세스 startsMost 당신이 물건을 할 수 있도록 측면에서 쓸모과 같이 데이터가 임시 테이블에서 FILEREAD 데이터를 임시 tablewrite 임시 테이블의 데이터를 채 웁니다. 더 나은 아이디어는, 하나의 액션 바람직 순수 SQL을 모든 것을 할 수 있는지 확인하는 것입니다.

    또한, 연결 풀링의 당신의 언급은 또 다른 문제를 제기한다. 많은 양의 데이터를 munging 프로세스는 OLTP 모드에서 실행을위한 좋은 후보가 아닙니다. 당신은 정말 당신의 저장 프로 시저를 실행하는 배경 (즉 asysnchronous) 과정, 아마 데이터베이스 작업을 시작하는 것이 좋습니다. 당신이 정기적으로이 작업을 실행하려면 우리는 사물의 관리를 자동화 DBMS_SCHEDULER를 사용할 수 있기 때문에 이것은 특히 사실이다.

  2. ==============================

    2.당신이 트랜잭션을 사용하는 경우 레벨 임시 테이블 (오히려 세션보다), 다음이 이미 너무 오래 각 통화는 하나의 트랜잭션을 포함로 ... 당신이 원하는 것을 할 수있다? (당신은 확실히 그것은이 경우인지 지우거나하지 수 있도록 충분한 정보를 제공하지 않습니다)

    당신이 트랜잭션을 사용하는 경우 레벨 임시 테이블 (오히려 세션보다), 다음이 이미 너무 오래 각 통화는 하나의 트랜잭션을 포함로 ... 당신이 원하는 것을 할 수있다? (당신은 확실히 그것은이 경우인지 지우거나하지 수 있도록 충분한 정보를 제공하지 않습니다)

    따라서, 각 어쨌든 COMMIT 또는 ROLLBACK 후 데이터가 임시 테이블 밖으로 삭제되기 때문에 다음 당신이 연결 풀을 사용하는 문제가되지 것, 너무 오래 각 통화는 하나의 트랜잭션을 포함로, 명확합니다.

    (또 다른 옵션은 EXECUTE IMMEDIATE를 사용하여 각 호출에 고유 한 이름의 임시 테이블을 생성하는 것입니다. 확실하지하지만 것이 확대됨 방법에 대해 설명합니다.)

  3. ==============================

    3.오라클에서는 거의 절대 필요한 런타임에 개체를 만들 수 없습니다.

    오라클에서는 거의 절대 필요한 런타임에 개체를 만들 수 없습니다.

    글로벌 임시 테이블을 사용하면 임시 테이블이 필요한 이유, 당신이 먼저 임시 테이블이 필요한지 여부를 확인 좋을 것 정확하게 말했다하지 않은 그러나 이후, 아마도 당신의 문제에 대한 최적의 솔루션입니다; 시간의 절반은 당신이 여러 쿼리를 필요로 생각이있을 수 있습니다 어떤 하나의 SQL로 할 수 있습니다.

    그건 내가 동일한 세션 내에서 여러 상황에 대한 테이블에 별도의 "공간"을 유지하는 데 필요한 것을 응용 프로그램에서 매우 성공적으로 과거에 글로벌 임시 테이블을 사용하고, 단계; 이것은 초기에 1로 설정 추가 ID 컬럼 (예 : 'CALL_ID ")를 추가하면되고, 절차 후속 호출이 ID를 증분시킨다. 아이디는 반드시 전역 변수 어딘가를 사용하여 기억 될 것, 예를 들어, 패키지 전역 변수는 패키지 본문에 선언했다. 예컨대 :

    PACKAGE BODY gtt_ex IS
       last_call_id integer;
       PROCEDURE myproc IS
          l_call_id integer;
       BEGIN
          last_call_id := NVL(last_call_id, 0) + 1;
          l_call_id      := last_call_id;
          INSERT INTO my_gtt VALUES (l_call_id, ...);
          ...
          SELECT ... FROM my_gtt WHERE call_id = l_call_id;
       END;
    END;
    

    당신은 GTTs 더 나은 일반 테이블을 사용하는 것보다 확실히, 심지어 높은 동시성을 아주 잘 수행 확인할 수 있습니다. 그것은 결코 임시 테이블에서 행을 삭제할 필요가 없습니다 있도록 모범 사례 응용 프로그램을 설계합니다 - GTT가 자동으로 세션이 끝날 때를 클리어하기 때문이다.

  4. ==============================

    4.나는 최근에 전역 임시 테이블을 사용하고 매우 불필요하게 방식으로 행동했다.

    나는 최근에 전역 임시 테이블을 사용하고 매우 불필요하게 방식으로 행동했다.

    나는 (Asp.Net) 프로 시저 호출에 몇 가지 복잡한 데이터의 형식을 임시 테이블을 사용하고 데이터를 포맷하면, 프론의 끝에 데이터를 전달했다. 절차 첫 번째 호출에서, 나는 적절한 데이터를 가져 오는 데 사용과 이후의 호출은 현재 통화뿐만 아니라 지난 프로 시저 호출에서 나에게 데이터를 제공하는 데 사용됩니다.

    나는 인터넷에서 조사하고 커밋에 대한 행을 삭제하는 옵션을 발견했다. 나는 그 문제가 해결됩니다 생각 .. 무엇을 추측? 난에 사용 삭제 행을 commit 옵션을 때, 나는 항상 데이터베이스에서 0 행을 얻을하는 데 사용됩니다. 난 세션이 종료 된 후에 만 ​​임시 테이블에서 transaction.This 옵션 지 웁니다 행을 커밋 한 후 행을 보존하는 행을 보존 커밋에의 원래의 방식으로 돌아 가야했다 그래서. 다음이 게시물을 발견하고 세션의 call_id을 추적 할 수있는 컬럼에 대해 알게되었습니다.

    그 솔루션을 구현하고 여전히이 문제를 해결할 힘. 내가 어떤 처리를 시작하기 전에 다음 내 절차에서 다음 문을 썼다.

    Temp_table에서 삭제;

    위 statemnet 트릭을했다. 내 프론트 엔드는 연결 풀링을 사용하고 각 프로 시저 호출 후 트랜잭션을 commitng하지만 여전히 연결 풀에서 연결을 유지하고 이후의 요청이 모든 호출 후 동일한 연결 따라서 데이터베이스 세션이 종료되지 않은를 사용 하였다 .. 어떤 처리를 strating 전에 임시 테이블에서 삭제 행이 .... 작동했다

    내가이 솔루션을 찾을 때까지 그것은 나를 견과류 운전 ....

  5. from https://stackoverflow.com/questions/1192265/local-temporary-table-in-oracle-10-for-the-scope-of-stored-procedure by cc-by-sa and MIT license