sql >> データベース >  >> RDS >> PostgreSQL

1回の操作で複数のPostgreSQL関数のスキーマを変更しますか?

    ループをさらに改良することができます(2番目のクエリのみを示します) ):

    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()を使用した1つのSELECT 仕事をします:

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


    1. PHP/MySQLの非表示エラーメッセージ

    2. テーブルフィールドにメールアドレスを挿入する

    3. カウントを使用して発生数を見つける

    4. SQLは、別のテーブルの別の列から1つの列を更新します