在postgres中编写函数内部函数

时间:2016-06-22 02:17:13

标签: sql postgresql function

我可以在MySQL中执行以下操作,但想知道如何在PostgreSQL中执行等效操作。我必须将查询包装在一个字符串中,因为表名是可变的(不能只运行CREATE TABLE)。这都是MySQL存储过程/ Postgres函数。

    SET @createTable = CONCAT("CREATE TABLE ", table_name, "(
              id int(11) NOT NULL AUTO_INCREMENT,
              something varchar(255) NOT NULL");
    PREPARE createTableStmt FROM @createTable;
    EXECUTE createTableStmt;
    DEALLOCATE PREPARE createTableStmt;

有人可以告诉我如何在Postgres中这样做吗?

1 个答案:

答案 0 :(得分:2)

要运行一次,只需运行连接的CREATE TABLE语句。

要封装使用变量表名重复使用的功能,请使用带EXECUTE的plpgsql函数:

CREATE OR REPLACE FUNCTION create_my_table(_tbl text)
  RETURNS void AS
$func$
BEGIN
   EXECUTE format('CREATE TABLE %I (id serial, something varchar(255) NOT NULL)', _tbl);
END
$func$ LANGUAGE plpgsql;

呼叫:

SELECT create_my_table('foo_table');

要放弃:

DROP create_my_table(text);

There are many related answers here. Try a search.

或者,如果您只需要当前会​​话,则可以将其作为临时功能,在会话结束时自动删除:

CREATE OR REPLACE FUNCTION pg_temp.create_my_table(_tbl text) ...

使用序列列在Postgres中实现AUTOINCREMENT

您可能也想要列PRIMARY KEY 并且varchar(255)很少有意义。我只想使用text