postgresql에서 지정된 제한 시간 내에 쿼리 작업을 수행해야한다는 요구 사항이 있습니다. 해당 제한 시간 내에 쿼리가 수행되지 않으면 우리는 예외/동작을 잡아야하며이 쿼리 작업이 수행되는 것을 차단하는 다른 모든 작업을 중단하고 업그레이드 작업을 수행해야합니다.함수 내에서 "statement_timeout"작업을 어떻게 만들 수 있습니까?
다음CREATE OR REPLACE FUNCTION execute_upgrade_statement(upgrade_stat text) RETURNS int as $$
BEGIN
EXECUTE upgrade_stat;
return 1;
END;
$$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION upgrade_function(upgrade_statement text,upgrading_table text) RETURNS void as $$
DECLARE
pid INTEGER;
return_value INTEGER;
pid_values INTEGER[];
BEGIN
SET statement_timeout TO 6000;
LOOP
BEGIN
select execute_upgrade_statement(upgrade_statement) into return_value;
if return_value = 1 THEN
raise notice 'Upgrade query performed';
return;
else
continue;
end if;
END;
END LOOP;
exception when query_canceled then
select into pid_values array_agg(p1.pid) from pg_locks p1 LEFT JOIN pg_stat_activity psa on p1.pid=psa.pid where p1.relation=(select relid from pg_stat_all_tables where relname=upgrading_table) and p1.pid <> pg_backend_pid();
FOREACH pid IN ARRAY pid_values
LOOP
raise notice 'pid value : %',pid;
perform pg_terminate_backend(pid);
END LOOP;
END;
$$
LANGUAGE plpgsql;
begin;
select upgrade_function('statement','table_name');
commit;
statement_timeout이 기능은 서버 측에서 호출 될 때 실행하기 아니라,이 클라이언트 측에서 호출 될 때 실행지고 :로 생성 등이 프로토 타입를 들어 다음과 같습니다. 서버 측 호출에서 statement_timeout 작업을 수행하는 다른 방법이 있습니까? 또는 지정된 제한 시간 내에 업그레이드 작업을 수행하는 다른 방법이 있습니까?