आप लूप को कुछ और परिशोधित कर सकते हैं (केवल दूसरी क्वेरी को प्रदर्शित करते हुए ):
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$;
प्रमुख बिंदु
-
plpgsql में असाइनमेंट ऑपरेटर है
:=
.=
काम करता है, लेकिन अनिर्दिष्ट है। -
FROM
. से अनावश्यक तालिकाओं को हटा दें । -
concat()
ओवरकिल हो सकता है, लेकिनformat()
वाक्य रचना को सरल करता है।
बेहतर सेट-आधारित विकल्प
समस्या को सेट-आधारित संचालन के रूप में पुन:कास्ट करना अधिक प्रभावी है। string_agg()
के साथ एक चयन करें काम करता है:
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$;