我不能在 PostgreSQL 8.2 中运行这个块。
DECLARE
curtime char;
BEGIN
curtime := 'now';
INSERT INTO logtable VALUES (logtxt, curtime);
RETURN curtime;
END;
当我尝试它显示错误:
ERROR: syntax error at or near "char"
SQL state: 42601
我不能在 PostgreSQL 8.2 中运行这个块。
DECLARE
curtime char;
BEGIN
curtime := 'now';
INSERT INTO logtable VALUES (logtxt, curtime);
RETURN curtime;
END;
当我尝试它显示错误:
ERROR: syntax error at or near "char"
SQL state: 42601
听起来您正在尝试独立运行PL/PgSQL代码块,而不是使用CREATE OR REPLACE FUNCTION
. 那是行不通的,你需要将它包含在一个函数或(从 PostgreSQL 9.0)一个DO
块中。PL/PgSQL 和普通 SQL 是不同的语言,因此您不能直接运行 PL/PgSQL 代码。
如果您解释了为什么要尝试编写粘贴的代码,将会有所帮助。我怀疑您正在尝试解决一个问题,该问题可以使用诸如审计触发器之类的触发器功能更好地处理。
您需要更新 PostgreSQL:PostgreSQL 8.2 已经过时且不受支持。不再发布安全和错误修复。紧急升级到受支持的版本,但请务必阅读每个主要“.0”版本(如“8.3.0”、“8.4.0”等)的发行说明,以获取迁移和兼容性建议。
避免'now'
:此外,'now'
您通常不应使用 当前日期/时间函数,尤其是current_timestamp
.
current_timestamp
是稳定的:您正在做的跳圈可能是不必要的,因为current_timestamp
(and 'now'::timestamp
) 的值在事务期间不会改变。例如:
regress=# BEGIN;
regress=# SELECT current_timestamp;
2012-08-14 14:52:43.382596+08
regress=# SELECT pg_sleep(5);
regress=# SELECT current_timestamp;
2012-08-14 14:52:43.382596+08
您的意图似乎类似于以下(不正确,请勿使用)代码:
CREATE OR REPLACE FUNCTION some_function(logtxt text) RETURNS timestamptz AS $$
DECLARE
curtime char;
BEGIN
curtime := 'now';
INSERT INTO logtable VALUES (logtxt, curtime);
RETURN curtime;
END;
$$ LANGUAGE 'plpgsql';
但是您误用了char
需要长度参数的数据类型。如果未提供,则默认为 1,因此您将获得:
regress=# SELECT some_function();
ERROR: value too long for type character(1)
CONTEXT: PL/pgSQL function "some_function" line 5 at assignment
永远不要char
在 SQL 中使用数据类型;使用varchar
或text
。varchar(n)
对于需要n
最大长度的跨数据库可移植性;如果不需要可移植性,请使用text
.
如果您更改char
为text
上述内容,您的代码可能会运行,但仍然没有任何意义。我强烈怀疑你真的想写:
CREATE OR REPLACE FUNCTION some_function(logtxt text) RETURNS timestamptz AS $$
BEGIN
INSERT INTO logtable VALUES (logtxt, current_timestamp);
RETURN current_timestamp;
END;
$$ LANGUAGE 'plpgsql';
...但您不知道当前的日期/时间函数。
即使这样也太过分了,真的。我认为您正在尝试解决更适合触发器的问题。