2016-06-27 3 views
5

나는 꽤 검색 좀, 나는 꽤 괜찮은 독해력을 가지고 있지만,이 스크립트 내 포스트 그레스/PostGIS와 상자에 여러 스레드에서 작동하는지 이해가되지 않습니다. 여기 코드는 다음과 같습니다PostgreSQL 임시 테이블의 범위는 무엇입니까?

Do 
$do$ 
DECLARE 
    x RECORD; 
    b int;  
    begin 
    create temp table geoms (id serial, geom geometry) on commit drop; 

    for x in select id,geom from asdf loop 

     truncate table geoms; 
     insert into geoms (geom) select someGeomfield from sometable where st_intersects(somegeomfield,x.geom); 

     ----do something with the records in geoms here...and insert that data somewhere else 

    end loop; 
end; 
$do$ 

그래서, 자바에서 호출 한 개 이상의 클라이언트에서이를 실행하면됩니다 기하 구조의 임시 테이블 원인 문제의 범위? 그렇다면 PostGres에서이 문제를 해결하기위한 아이디어가 도움이 될 것입니다.

감사의 PostgreSQL (또는 포스트 그레스)에서

답변

3

하나의 미묘한 트랩을 실행하게됩니다. 그 이유는 내가 "안전"하다고 선언 할 준비가되지 않은 이유입니다. 범위는 세션 당이지만, 사람들은 종종 테이블을 삭제하는 것을 잊어 버립니다. .

난 당신이 당신이 그것으로 완료 한 후 명시 적으로 드롭 함수 후 임시 테이블을 필요로하지 않는 경우에 떨어져 더 나은 생각합니다. 이렇게하면 같은 트랜잭션에서 함수를 두 번 실행하려고 할 때 발생하는 문제를 방지 할 수 있습니다. 호출이 임시 테이블이 삭제 완료되면

내가 임시 테이블 DDL에 "드롭 커밋에"이 있기 때문에 크리스 ..., 나는 "커밋"고 생각
+0

감사의 의미 (에 당신이 떨어지고 커밋) ...하지만 나는 당신 말을 듣는다. – markg

+0

그런데 커밋하는 커밋 실제 의미한다. 당신은'begin'을 사용하고 두 번 기능을 실행하면, 호출하기 전에'가 실패합니다 commit'. 동일한 쿼리에서 어떻게 든 두 번 호출되는 경우에도 마찬가지입니다. –

1

임시 테이블 (POSTGRES이 아닌 존재 않습니다) 로컬 그들이 만들어 세션에 관련이 있습니다. 따라서 다른 세션 (클라이언트)은 다른 세션의 임시 테이블을 볼 수 없습니다. 둘 다 (스키마와 데이터) 다른 사람들에게는 보이지 않습니다. 코드가 안전합니다.