无法在 PostgreSQL 8.2 中运行块

2023-11-29

我无法在 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 block. PL/PgSQL 和普通 SQL 是不同的语言所以你不能直接运行 PL/PgSQL 代码。

如果你解释一下会有帮助why您正在尝试编写您粘贴的代码。我怀疑你正在尝试解决一个可以更好地处理的问题触发功能像一个审计触发器.

一些重要的注意事项:

您需要更新 PostgreSQL:PostgreSQL 8.2 已经过时了,而且很危险不支持的。不再发布安全和错误修复。紧急升级到受支持的版本,但请务必阅读发行说明对于每个主要的“.0”版本,如“8.3.0”、“8.4.0”等,提供迁移和兼容性建议。

Avoid '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

Details

您的意图似乎类似于以下内容(不正确,请勿使用) code:

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

NEVER使用charSQL 中的数据类型;使用varchar or text。用于跨数据库可移植性varchar(n) where n是否需要最大长度;如果不需要便携性使用text.

如果你改变char to 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';

...但你不知道当前日期/时间函数.

即使这样也太过分了,真的。我认为你正在尝试解决一个更适合触发器的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 PostgreSQL 8.2 中运行块 的相关文章

随机推荐