基于PostgreSQL 9.2中的循环创建动态表

时间:2016-03-08 09:37:58

标签: postgresql function plpgsql dynamic-sql postgresql-9.2

我有一个功能,我想根据账单日期的年份创建一个表格,我将循环。

CREATE OR REPLACE FUNCTION ccdb.ccdb_archival()
  RETURNS void AS
$BODY$
DECLARE dpsql text;
DECLARE i smallint;
BEGIN

FOR i IN SELECT DISTINCT EXTRACT(year FROM bill_date) FROM ccdb.bills ORDER  BY 1 LOOP

DO $$ 
    BEGIN
    CREATE TABLE IF NOT EXISTS ccdb_archival.bills||i (LIKE ccdb.bills INCLUDING ALL);
    BEGIN
        ALTER TABLE ccdb_archival.bills ADD COLUMN archival_date timestamp;
    EXCEPTION
        WHEN duplicate_column THEN RAISE NOTICE 'column archival_date already exists in <table_name>.';
    END;
    END;
$$; 

INSERT INTO ccdb_archival.bills
SELECT *, now() AS archival_date
FROM ccdb.bills
WHERE bill_date::date >= current_date - interval '3 years' AND bill_date::date < current_date - interval '8 years';
END LOOP;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

我希望将年份与每年的实际表名称连接起来。 我无法对上面的代码做同样的事情。我收到一个错误:

ERROR:  syntax error at or near "||"
LINE 3:   CREATE TABLE IF NOT EXISTS ccdb_archival.bills||i (LI...

请建议我如何达到我的要求。

1 个答案:

答案 0 :(得分:0)

您无法使用元数据撰写字符串。您应该使用执行:http://www.postgresql.org/docs/9.1/static/ecpg-sql-execute-immediate.html