2011-06-16 53 views
0

我有一個很大的數據庫(在PostgreSQL 8.4中),我嘗試在較小的部分進行分析。爲此,我將大數據庫的部分內容複製到其他模式中(我知道它與數據庫複製數據的理念有些矛盾,但沒有那一步分析太慢)。在PostgreSQL中自動創建模式(可能是plpgsql?)

我需要執行很多SQL命令,以獲得一個包含所有必要表的新模式。但是,創建一個模式與創建另一個模式的區別非常小(原則上它只是模式的名稱,而在「WHERE」中則是不同的值)。

我的問題是:

是否可以編寫一個函數,需要一定的值作爲參數,並在where子句中使用此參數(和模式的名字嗎?) 如果是可能的,你會建議哪種程序語言(也許是plpgsql),這樣的腳本會是什麼樣子(就像骨架一樣)?

預先感謝您!

回答

2

不知道我做你的問題的完美感,但它聽起來像是要使用臨時模式:

create temporary table foo as select * from bar where ... 

有時它也是有用的使用相同的名稱:

create temporary table foo as select * from foo where ... 

否則肯定的,動態的SQL工作:

create function do_stuff(_table regclass) returns void as $$ 
begin 
    execute 'select 1 from ' || _table; 
end; $$ language plpgsql strict; 
select do_stuff('schemaname.tablename'); 

http://www.postgresql.org/docs/9.0/interactive/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

+0

謝謝!你的答案的動態sql部分似乎是我正在尋找的!這也適用於...... BEGIN EXECUTE'CREATE SCHEMA'|| SCHEMANAME; ...'或'... BEGIN EXECUTE'CREATE TABLE'||表名; ...'? – speendo 2011-06-16 14:26:31

+1

是的,有一個調整。將定義更改爲do_stuff(text),並確保在適當的地方使用quote_ident()。 – 2011-06-16 14:29:09