데이터베이스에서 루프를 실행해야합니다. 이것은 한 번만 요구되는 사항입니다. 함수를 실행 한 후 지금 함수를 삭제합니다.
임시 / 일회용 기능을 만드는 데 좋은 방법이 있습니까?
답변:
내가 쓰고있는 대본을 여러 번 사용하는 방법을 알아야했습니다. pg_temp 스키마를 사용하여 임시 함수를 만들 수 있습니다. 연결에 대한 요청시 생성되는 스키마이며 임시 테이블이 저장됩니다. 연결이 닫히거나 만료되면이 스키마가 삭제됩니다. 이 스키마에 함수를 생성하면 스키마가 자동으로 생성됩니다. 따라서,
create function pg_temp.testfunc() returns text as
$$ select 'hello'::text $$ language sql;
연결이 유지되는 한 계속 유지되는 기능입니다. 드롭 명령을 호출 할 필요가 없습니다.
몇 추가 참고 받는 @의 crowmagnumb의 대답에 스마트 트릭 :
pg_temp
search_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');
세부:
버전 9.0을 사용하는 경우 새 DO 문으로이를 수행 할 수 있습니다.
http://www.postgresql.org/docs/current/static/sql-do.html
이전 버전에서는 함수를 만들고 호출 한 다음 다시 삭제해야합니다.
pg_temp.foo()
. 이해가 왜 (!?)와 같은 간단하고 너무 빨리 예, 그래서 오늘날, 2014, 루아 , SQL DML의 언어를 제공 할 수 람다 함수를 (!).
DO
명령문은 입력 매개 변수를 가질 수 없으며 함수와 달리 결과를 반환 할 수 없습니다.
광고 호크 절차의 경우 커서 가 너무 나쁘지 않습니다. 그러나 생산적으로 사용하기에는 너무 비효율적입니다.
db의 SQL 결과를 쉽게 반복 할 수 있습니다.