2013-10-02 38 views

回答

1

你可以細化環路一些(展示只有第二個查詢):

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$; 
+0

糟糕,我忘記從該查詢的另一個應用程序中刪除那些無關的聯接。格式化函數的寫法看起來更好。我將從現在開始使用它。將'string_agg'放入'sql'變量的奇妙想法。謝謝Erwin –

+1

順便說一句,+1提及使用的東西,但沒有記錄 - 這是最好的文件化的方式。 –

0
DO$$ 
DECLARE 
    row record; 
BEGIN 
    FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = 'public' -- and other conditions, if needed 
    LOOP 
     EXECUTE 'ALTER TABLE public.' || quote_ident(row.tablename) || ' SET SCHEMA [new_schema];'; 
    END LOOP; 
END; 
$$; 

DO$$ 
DECLARE 
    row record; 
    sql text = E'\n'; 
BEGIN 
    FOR row IN 
     SELECT 
       proname::text as 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 = CONCAT(sql, E'\n', 
      'ALTER FUNCTION public.', row.proname, 
      '(', row.params, ') SET SCHEMA [new_schema];'); 
    END LOOP; 
    RAISE NOTICE '%', sql; -- for viewing the sql before executing it 
    -- EXECUTE sql; -- for executing the sql 
END;$$; 
+0

我認爲這是做到這一點的最好方法。如果別人有更好的方法,我會很高興將其標記爲答案。 –

相關問題