【问题标题】:Create a schema with the name passed by variable使用变量传递的名称创建模式
【发布时间】:2010-03-05 07:13:42
【问题描述】:

我想创建一个名称由变量传递的模式。 示例:

CREATE OR REPLACE FUNCTION test1("name" character varying)
  RETURNS void AS
'CREATE SCHEMA "name";'
  LANGUAGE 'sql' VOLATILE
  COST 100;

【问题讨论】:

    标签: postgresql plpgsql


    【解决方案1】:

    你可以使用 plpgsql 而不是 EXECUTE:

    CREATE OR REPLACE FUNCTION test1("name" character varying)
    RETURNS void AS
    $$
    BEGIN
        EXECUTE 'CREATE SCHEMA '|| quote_ident($1); -- security
    
        RETURN;
    END;
    $$
    LANGUAGE plpgsql
    VOLATILE
    COST 20;
    

    【讨论】:

    • 推荐你使用.. IF NOT EXISTS使函数幂等
    【解决方案2】:

    用户 search_path 更改默认模式,以便您可以轻松地向其中添加表! 并使用带有 %I 的格式将架构名称转义为标识符。

    像这样:

    CREATE OR REPLACE FUNCTION test1("name" character varying)
    RETURNS void AS
    $$
    BEGIN
        EXECUTE FORMAT('CREATE SCHEMA %I;', $1);
        EXECUTE FORMAT('SET search_path TO %I;', $1);
    
        CREATE TABLE table1(
        column1 integer
        );
    
        RETURN;
    END;
    $$
    LANGUAGE plpgsql
    VOLATILE
    COST 20;
    

    【讨论】:

      【解决方案3】:

      使用PROCEDURE (PostgreSQL 11+)

      CREATE OR REPLACE PROCEDURE create_schema( _schema text)
      LANGUAGE plpgsql as
      $$
        BEGIN
              EXECUTE format( 'CREATE SCHEMA IF NOT EXISTS %I ',_schema); 
        END
      $$;
      

      通过以下方式调用此过程:

      call create_schema('test');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 2018-02-23
        • 2013-04-12
        • 1970-01-01
        • 2013-10-02
        相关资源
        最近更新 更多