programing

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

mailnote 2023. 5. 6. 15:18
반응형

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

데이터베이스에서 루프를 실행해야 합니다.이것은 단 한 번의 요구 사항입니다.기능을 실행한 후 지금 기능을 삭제합니다.

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

저는 제가 쓰고 있는 스크립트에서 많은 시간을 사용하는 방법을 알아야 했습니다.pg_temp 스키마를 사용하여 임시 함수를 만들 수 있습니다.이 스키마는 필요에 따라 연결을 위해 생성되며 임시 테이블이 저장되는 스키마입니다.연결이 닫히거나 만료되면 이 스키마는 삭제됩니다.이 스키마에 함수를 만들면 스키마가 자동으로 만들어집니다.그러므로,

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

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

@crowmagnumb의 대답에서 현명한 속임수에 대한 몇 가지 추가 메모:

  • 함수는 항상 스키마를 검증해야 합니다.pg_temp에 있습니다.search_path(기본값과 동일), Tom Lane에 따르면 트로이 목마를 방지하기 위해 다음과 같이 합니다.
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');

세부사항:

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

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

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

도킹 절차의 경우 커서가 그리 나쁘지 않습니다.하지만 그것들은 제품을 사용하기에는 너무 비효율적입니다.

그들은 당신이 db의 sql 결과를 쉽게 반복할 수 있게 해줄 것입니다.

언급URL : https://stackoverflow.com/questions/4990622/how-to-create-a-temporary-function-in-postgresql

반응형