2016-02-19 31 views
0

我是plpgsql的新手。我確信有一些非常簡單的方法可以做到這一點,但由於某種原因,我在嘗試弄清楚如何做到這一點時遇到了很多麻煩。簡單的PostgreSQL plpgsql使用現有的表創建一個新表

我只是通過現有的表的列表試圖循環和執行 CREATE TABLE z_existing_table_name AS SELECT * FROM existing_table_name隨着數據 到目前爲止,我有這樣的:

CREATE OR REPLACE FUNCTION create_backup_row() 
RETURNS RECORD 
AS $$ 
DECLARE 
    row RECORD; 

BEGIN 
    FOR row IN SELECT * FROM information_schema.tables WHERE table_catalog = 'my_db' and table_schema = 'public' 
    LOOP 
    EXECUTE 'CREATE TABLE z_' || t.table_name || ' as ' || t.table_name 
    END LOOP; 
END; 
$$ LANGUAGE plpgsql; 

這將是如果我可以使這個功能可以重新運行,那麼額外的獎勵。類似DROP TABLE如果不存在則創建表...

回答

1

@Steven,下面的程序使用,

-- Function: create_backup_row() 

-- DROP FUNCTION create_backup_row(); 

CREATE OR REPLACE FUNCTION create_backup_row() 
    RETURNS integer AS 
$BODY$ 

DECLARE 
    v_table text; 
BEGIN 

FOR v_table IN 
    SELECT table_name 
    FROM information_schema.tables 
    WHERE table_catalog = 'my_db' 
    AND table_schema = 'public' 
    AND table_name not ilike '%z_%' -- to skip the table with z_ when we rerun it. 
LOOP 

    EXECUTE ' DROP TABLE IF EXISTS z_' || v_table ; 
    EXECUTE 'CREATE TABLE z_' || v_table || ' as SELECT * FROM ' || v_table ; 

END LOOP; 

return 1; 
    END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION create_backup_row() 
    OWNER TO postgres; 
+0

正是我需要的。謝謝! – Steven

相關問題