Search code examples
stored-proceduresinputparametersplpgsqlcreate-table

plpgsql stored function that creates table with parameter column names


I want to create a Postgres Stored function in plpgsql that creates a table with specified column names that vary according to input parameters.

Basically something like this:

CREATE OR REPLACE FUNCTION document_insert_new_document(_name text, _table_name text)
  RETURNS bigint AS
$BODY$
declare
  _documentid bigint;
  _user_history_table_name text;
  _history_table_name_column text;

begin
    _documentid = 0;
    _user_history_table_name = 'merge_user_history_' || _table_name;
    _history_table_name_column = _table_name || '_id';
    CREATE TABLE _user_history_table_name
    (
      user_history_id bigint NOT NULL,
      _history_table_name_column bigint NOT NULL,
      ...
    )



end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Is this possible? And if so, how?


Solution

  • CREATE OR REPLACE FUNCTION document_insert_new_document(_name text, _table_name text)
      RETURNS void AS
    $BODY$
    declare
      _documentid bigint;
      _user_history_table_name text;
      _history_table_name_column text;
      query_create text;
    
    begin
        _documentid = 0;
        _user_history_table_name = 'merge_user_history_' || _table_name;
        _history_table_name_column = _table_name || '_id';
        query_create := 'CREATE TABLE ' || _user_history_table_name ||
                        ' (user_history_id bigint NOT NULL,' ||
                        _history_table_name_column ||
                        ' bigint NOT NULL,
                         ... ) 
                        WITH (
                        OIDS=FALSE
                        )';
        EXECUTE query_create;
    
    end;
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    

    Or, if you wanna use 'USING' clause:

    [...]
        query_create := 'CREATE TABLE ($1) (
                         user_history_id bigint NOT NULL,
                         ($2) bigint NOT NULL,
                         ... ) 
                         WITH (
                         OIDS=FALSE
                         )';
        EXECUTE query_create USING _user_history_table_name, _history_table_name_column;
    [...]