PRP*_*PRP 2 postgresql datetime dynamic-sql plpgsql
我有一个表address_all
,它由几个地址表继承.address_history
从父表继承history_all
并保留当前地址信息.我正在创建一个新表继承address_all
表并将信息复制address_history
到新表.
我的存储过程如下所示.我打电话时遇到一些错误.为了更好地解释错误,我正在使用行号.
1 CREATE OR REPLACE FUNCTION somefunc()
2 RETURNS void AS
3 $BODY$
4 DECLARE
5 year_id INTEGER;
6 month_id INTEGER;
7 week_id INTEGER;
8 addresstablename text;
9 backupdays text;
10 BEGIN
11 week_id := EXTRACT(DAY FROM TIMESTAMP 'now()');
12 month_id := EXTRACT(MONTH FROM TIMESTAMP 'now()');
13 year_id := EXTRACT(YEAR FROM TIMESTAMP 'now()');
14 addresstablename := 'address_history_' || week_id || '_' || month_id || '_' || year_id;
15 backupdays:= date_trunc('hour',CURRENT_TIMESTAMP - interval '7 days');
16 EXECUTE 'create table ' || addresstablename || '() INHERITS (address_all)';
17 EXECUTE 'insert into ' || addresstablename || ' select * from address_history where address_timestamp >= ' || backupdays || ''; --AS timestamp without time zone);
18 END;
19 $BODY$
20 LANGUAGE 'plpgsql' VOLATILE;
Run Code Online (Sandbox Code Playgroud)
当我跑:
select somefunc()
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
ERROR: syntax error at or near "12"
LINE 1: ...story where address_timestamp >= 2012-07-31 12:00:00-0...
^
QUERY: insert into address_history_7_8_2012 select * from address_history where address_timestamp >= 2012-07-31 12:00:00-04
CONTEXT: PL/pgSQL function "somefunc" line 14 at EXECUTE statement
********** Error **********
ERROR: syntax error at or near "12"
SQL state: 42601
Context: PL/pgSQL function "somefunc" line 14 at EXECUTE statement
Run Code Online (Sandbox Code Playgroud)
尝试这种大致简化的形式:
CREATE OR REPLACE FUNCTION somefunc()
RETURNS void AS
$func$
DECLARE
addresstablename text := 'address_history_' || to_char(now(), 'FMDD_MM_YYYY');
BEGIN
EXECUTE
'CREATE TABLE ' || addresstablename || '() INHERITS (address_all)';
EXECUTE
'INSERT INTO ' || addresstablename || '
SELECT *
FROM address_history
WHERE address_timestamp >= $1'
USING date_trunc('hour', now() - interval '7 days');
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
您可以在声明时在plpgsql中分配变量.简化代码.
使用to_char()
格式化你的日期.更简单.
now()
并CURRENT_TIMESTAMP
做同样的事情.
如果你想要当前的时间戳'now()'
,请不要引用,使用now()
(不带引号).
使用USING
子句EXECUTE
,所以你不必转换timestamp
为text
和返回 - 可能会像你一样运行引用问题.更快,更简单,更安全.
In LANGUAGE plpgsql
,plpgsql
是关键字,不应引用.
您可能想要检查表是否已存在CREATE TABLE IF NOT EXISTS
,自PostgreSQL 9.1起可用.
归档时间: |
|
查看次数: |
28887 次 |
最近记录: |