Bạn có thể tinh chỉnh thêm một số vòng lặp (chỉ trình bày chỉ truy vấn thứ hai ):
DO
$do$
DECLARE
r record;
sql text = '';
BEGIN
FOR r IN
SELECT p.proname, pg_get_function_identity_arguments(p.oid) AS params
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE nspname = 'public'
-- and other conditions, if needed
LOOP
sql := sql
|| format(E'\nALTER FUNCTION public.%I(%s) SET SCHEMA new_schema;'
,r.proname, r.params);
END LOOP;
RAISE NOTICE '%', sql; -- for viewing the sql before executing it
-- EXECUTE sql; -- for executing the sql
END
$do$;
Những điểm chính
-
Toán tử gán trong plpgsql là
:=
.=
hoạt động, nhưng không có giấy tờ. -
Xóa các bảng không cần thiết khỏi
FROM
. -
concat()
có thể quá mức cần thiết, nhưngformat()
đơn giản hóa cú pháp.
Thay thế dựa trên tập hợp tốt hơn
Xử lý lại vấn đề vì hoạt động dựa trên tập hợp hiệu quả hơn. Một CHỌN với string_agg()
thực hiện công việc:
DO
$do$
DECLARE
sql text;
BEGIN
SELECT INTO sql
string_agg(format('ALTER FUNCTION public.%I(%s) SET SCHEMA new_schema;'
,p.proname, pg_get_function_identity_arguments(p.oid)), E'\n')
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE nspname = 'public';
-- and other conditions, if needed
RAISE NOTICE '%', sql; -- for viewing the sql before executing it
-- EXECUTE sql; -- for executing the sql
END
$do$;