PostgreSQL에서 임시 함수를 만드는 방법은 무엇입니까?


82

데이터베이스에서 루프를 실행해야합니다. 이것은 한 번만 요구되는 사항입니다. 함수를 실행 한 후 지금 함수를 삭제합니다.

임시 / 일회용 기능을 만드는 데 좋은 방법이 있습니까?

답변:


115

내가 쓰고있는 대본을 여러 번 사용하는 방법을 알아야했습니다. pg_temp 스키마를 사용하여 임시 함수를 만들 수 있습니다. 연결에 대한 요청시 생성되는 스키마이며 임시 테이블이 저장됩니다. 연결이 닫히거나 만료되면이 스키마가 삭제됩니다. 이 스키마에 함수를 생성하면 스키마가 자동으로 생성됩니다. 따라서,

create function pg_temp.testfunc() returns text as 
$$ select 'hello'::text $$ language sql;

연결이 유지되는 한 계속 유지되는 기능입니다. 드롭 명령을 호출 할 필요가 없습니다.


61

추가 참고 받는 @의 crowmagnumb의 대답에 스마트 트릭 :

  • 트로이 목마를 방지하기 위해 Tom Lane에 따르면 이 함수는 기본적으로 있는 경우에도 항상 스키마 정규화 되어야합니다 .pg_tempsearch_path
CREATE FUNCTION pg_temp.f_inc(int)
  RETURNS int AS 'SELECT $1 + 1' LANGUAGE sql IMMUTABLE;

SELECT pg_temp.f_inc(42);
f_inc
-----
43
  • 임시 스키마에서 생성 된 함수는 동일한 세션 내에서만 볼 수 있습니다 (임시 테이블처럼). 다른 모든 세션에는 표시되지 않습니다 (동일한 역할이라도). 당신은 할 수 후 동일한 세션에서 다른 역할과 기능에 액세스 SET ROLE.

  • 이 "temp"함수를 기반으로 기능 색인을 만들 수도 있습니다.

    CREATE INDEX foo_idx ON tbl (pg_temp.f_inc(id));
    

    따라서 임시 테이블이 아닌 임시 함수를 사용하여 일반 인덱스를 만듭니다. 이러한 인덱스는 모든 세션에 표시되지만 생성 세션에만 유효합니다. 쿼리 플래너는 쿼리에서식이 반복되지 않는 기능 인덱스를 사용하지 않습니다. 여전히 약간 더러운 속임수입니다. 세션이 닫히면 종속 개체로 자동으로 삭제됩니다. 이것이 전혀 허용되어서는 안 될 것 같은 느낌 ...


함수를 반복적으로 실행해야하고 SQL 만 있으면 대신 준비된 명령문을 고려하십시오 . 세션이 끝날 때 죽는 임시 SQL 함수 처럼 작동 합니다. 하지 동일 하지만, 단지 자체에서 사용할 수있는 일이 EXECUTE아니라 다른 쿼리 안에 중첩. 예:

PREPARE upd_tbl AS
UPDATE tbl t SET set_name = $2 WHERE tbl_id = $1;

요구:

EXECUTE upd_tbl(123, 'foo_name');

세부:


30

버전 9.0을 사용하는 경우 새 DO 문으로이를 수행 할 수 있습니다.

http://www.postgresql.org/docs/current/static/sql-do.html

이전 버전에서는 함수를 만들고 호출 한 다음 다시 삭제해야합니다.


4
... 터미널에서 스크립팅하는 데 유용하지만 "익명 함수"(또는 람다)처럼 다시 호출 할 수 없으므로 DO 구문은 "임시 함수"만큼 유용하지 않습니다.
Peter Krauss 2014 년

@PeterKrauss : 다시 호출하려면 실제 함수를 만들어야합니다.
a_horse_with_no_name

물론 내 a_hourse :-) 나는 "임시"를 구현하는 이론적 경로만을 보여주고 있었다 ... 이것이 바로 주요 질문에 대한 더 나은 대답 (PostgreSQL에서 가능)이 pg_temp.foo(). 이해가 왜 (!?)와 같은 간단하고 너무 빨리 예, 그래서 오늘날, 2014, 루아 , SQL DML의 언어를 제공 할 수 람다 함수를 (!).
Peter Krauss 2014 년

7
또한 DO명령문은 입력 매개 변수를 가질 수 없으며 함수와 달리 결과를 반환 할 수 없습니다.
Daniel Vérité

2
반환되지 않으면 "함수"라고해야합니까?
AndreKR 2016-10-25

-4

광고 호크 절차의 경우 커서 가 너무 나쁘지 않습니다. 그러나 생산적으로 사용하기에는 너무 비효율적입니다.

db의 SQL 결과를 쉽게 반복 할 수 있습니다.


6
PostgreSQL에서 커서가 비효율적이라고 생각하는 이유는 무엇입니까?
Frank Heikens

2
커서는 루프 할 때 데이터베이스 연결을 유지합니다. 수백 개의 장기 실행 커서가있는 웹 페이지는 연결을 고갈시키고 사이트 / 데이터베이스를 무너 뜨리게됩니다.
Byron Whitlock
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.