2012-11-27 49 views
1

我想在plpgsql中创建一个Postgres存储函数,该函数根据输入参数创建具有指定列名称的表。plpgsql存储函数,用于创建具有参数列名称的表

基本上是这样的:

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; 

这可能吗?如果是这样,怎么样?

+0

执行 '....' 使用(参数) – Shalin

+0

哪些数据假设函数返回? “RETURNS bigint” – Borys

回答

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

或者,如果你想使用 '使用' 条款:

[...] 
    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; 
[...] 
相关问题