无法在PostgreSQL 8.2中运行阻止

时间:2012-08-14 06:16:39

标签: postgresql

我无法在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

1 个答案:

答案 0 :(得分:6)

听起来您正试图独立运行PL/PgSQL代码块,而不是使用CREATE OR REPLACE FUNCTION将其包装在函数中。这不起作用,你需要将它包含在一个函数中或(来自PostgreSQL 9.0)DO block PL / PgSQL和普通SQL是不同的语言所以你不能直接运行PL / PgSQL代码。

如果您解释为什么您正在尝试编写粘贴的代码,这会有所帮助。我怀疑你正在尝试解决一个问题,这个问题可以通过trigger function audit trigger更好地处理。

一些重要的注释:

你需要更新PostgreSQL :PostgreSQL 8.2已经过时且unsupported已经过时了。安全性和错误修复不再发布。紧急升级到受支持的版本,但请确保阅读每个主要“.0”版本的release notes,如“8.3.0”,“8.4.0”等,以获取迁移和兼容性建议。

避免使用'now' :此外,您应该使用current date/time functions,而不是'now',而不是current_timestamp

current_timestamp稳定:您正在进行的箍跳可能是不必要的,因为current_timestamp(和'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

从不在SQL中使用char数据类型;使用varchartext。对于跨数据库可移植性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';

...但您不了解current date/time functions

即使那太多​​了,真的。我认为你正试图解决一个更适合触发的问题。