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

関数がPostgreSQLに存在するかどうかを確認するにはどうすればよいですか?

    はい、pg_classで関数を見つけることができません 関数はシステムテーブルpg_procに保存されているため

    postgres-# \df
                                   List of functions
     Schema |        Name        | Result data type | Argument data types  |  Type  
    --------+--------------------+------------------+----------------------+--------
     public | foo                | integer          | a integer, b integer | normal
     public | function_arguments | text             | oid                  | normal
    (2 rows)
    

    pg_procに基づいてカスタム関数のリストを照会します 単に

    postgres=# select p.oid::regprocedure
                  from pg_proc p 
                       join pg_namespace n 
                       on p.pronamespace = n.oid 
                 where n.nspname not in ('pg_catalog', 'information_schema');
               oid           
    -------------------------
     foo(integer,integer)
     function_arguments(oid)
    (2 rows)
    

    関数の存在に関する最も簡単で最速のテストは、(パラメーターなしで)regprocまたはregprocedure(パラメーター付き)にキャストすることです:

    postgres=# select 'foo'::regproc;
     regproc 
    ---------
     foo
    (1 row)
    
    postgres=# select 'foox'::regproc;
    ERROR:  function "foox" does not exist
    LINE 1: select 'foox'::regproc;
                   ^
    postgres=# select 'foo(int, int)'::regprocedure;
         regprocedure     
    ----------------------
     foo(integer,integer)
    (1 row)
    
    postgres=# select 'foo(int, text)'::regprocedure;
    ERROR:  function "foo(int, text)" does not exist
    LINE 1: select 'foo(int, text)'::regprocedure;
                   ^
    

    または、pg_procに対するテストで同様のことを行うことができます

    postgres=# select exists(select * from pg_proc where proname = 'foo');
     exists 
    --------
     t
    (1 row)
    
    postgres=# select exists(select * 
                                from pg_proc 
                               where proname = 'foo' 
                                 and function_arguments(oid) = 'integer, integer');
     exists 
    --------
     t
    (1 row)
    

    ここで:

    CREATE OR REPLACE FUNCTION public.function_arguments(oid)
    RETURNS text LANGUAGE sql AS $function$
        select string_agg(par, ', ') 
           from (select format_type(unnest(proargtypes), null) par 
                    from pg_proc where oid = $1) x
    $function$
    

    または、組み込み関数を使用できます:pg_get_function_arguments

    p.s.システムカタログでの単純な方向付けのトリック。 psqlを使用する オプション-E

    [[email protected] ~]$ psql -E postgres
    psql (9.2.8, server 9.5devel)
    Type "help" for help.
    
    postgres=# \df
    ********* QUERY **********
    SELECT n.nspname as "Schema",
      p.proname as "Name",
      pg_catalog.pg_get_function_result(p.oid) as "Result data type",
      pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types",
     CASE
      WHEN p.proisagg THEN 'agg'
      WHEN p.proiswindow THEN 'window'
      WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger'
      ELSE 'normal'
    END as "Type"
    FROM pg_catalog.pg_proc p
         LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
    WHERE pg_catalog.pg_function_is_visible(p.oid)
          AND n.nspname <> 'pg_catalog'
          AND n.nspname <> 'information_schema'
    ORDER BY 1, 2, 4;
    **************************
    
                                   List of functions
     Schema |        Name        | Result data type | Argument data types  |  Type  
    --------+--------------------+------------------+----------------------+--------
     public | foo                | integer          | a integer, b integer | normal
     public | function_arguments | text             | oid                  | normal
    (2 rows)
    


    1. Oracle Database Security:データベース監査

    2. INSERT / UPDATE/DELETE操作を最適化する

    3. Mysqlテキストストレージ?

    4. 外部キーと主キーのPostgresとインデックス