0

尝试加入两个表并更新其中一个表时,我在此处收到此函数的意外错误:

CREATE OR REPLACE FUNCTION tsi.update_data(_creation_time int)
RETURNS VOID
AS $$
BEGIN
    EXECUTE format($sql$
        UPDATE tsi.forecasts_%s a SET
        a."incidents @ 01:00" = b.n_incid,
        a."road @ 01:00" = b.n_roads
        FROM tgi_tmp b WHERE a.link_ix = b.link_id;
  $sql$,_creation_time);
END $$ LANGUAGE plpgsql;

它给了我这个错误信息:

syntax error at or near "@"
cidents @ 01:00" = n_incid,
        ^

有谁知道我为什么会收到这个错误?这些表确实包含提到的列,所以这不是问题。postgres 是否很难处理执行格式的字符串列?

Postgres 版本:10.5 简化表结构:

CREATE TABLE tsi.forecasts_%s (
    link_ix int PRIMARY KEY,
    "slipincidents @ 00:00" SMALLINT NOT NULL,
    "roadcoverage @ 00:00" SMALLINT NOT NULL,
);

和 tgi_tmp:

CREATE TEMPORARY TABLE tgi_tmp (
    link_id TEXT,
    n_road SMALLINT,
    n_incid SMALLINT
    CONSTRAINT tgi_tmp_pkey PRIMARY KEY (link_id)
);
4

3 回答 3

3

奇怪的是,对 @ 的抱怨对我没有用。然而,错误的是为您在集合中分配的列指定表(别名)。您应该只指定列名。

CREATE OR REPLACE FUNCTION tsi.update_data(_creation_time int)
RETURNS VOID
AS $$
BEGIN
    EXECUTE format($sql$
        UPDATE tsi.forecasts_%s a SET
          "incidents @ 01:00" = b.n_incid,
          "road @ 01:00" = b.n_roads
        FROM tgi_tmp b WHERE a.link_ix = b.link_id;
  $sql$,_creation_time);
END $$ LANGUAGE plpgsql;
于 2018-09-11T12:01:10.277 回答
1

尝试调试您的功能,我收到这些错误消息,一个接一个:

ERROR:  operator does not exist: integer = text
ERROR:  column b.n_roads does not exist
ERROR:  column "a" of relation "tsi_forecasts_1" does not exist
ERROR:  column "incidents @ 01:00" of relation "tsi_forecasts_1" does not exist

每次修复上一个错误之后。
我到达了这个工作版本:

CREATE OR REPLACE FUNCTION tsi_update_data(_creation_time int)
  RETURNS VOID AS
$func$
BEGIN
    EXECUTE format($sql$
       UPDATE tsi_forecasts_%s a
       SET    "slipincidents @ 00:00" = b.n_incid  -- don't table-qualify target cols
            , "roadcoverage @ 00:00"  = b.n_road   -- col names in q don't match
       FROM   tgi_tmp b
       WHERE  a.link_ix = b.link_id::int; -- your db design forces a cast
  $sql$, _creation_time);
END
$func$  LANGUAGE plpgsql;

但我无法重现您的错误:

syntax error at or near "@"
cidents @ 01:00" = n_incid,
        ^

必须由不在问题中的内容调用,例如未命名的客户端程序中的外部双引号或字符的特殊含义。

除此之外,重新考虑您的命名约定和数据库设计可能是值得的。使用合法的、小写的、不带引号的标识符和匹配的数据类型(link_ixis intwhile link_ixis text)。

于 2018-09-11T14:32:00.057 回答
0

当我没有指定偏移量时,出于某种原因工作。像这样:

 CREATE OR REPLACE FUNCTION tsi.update_data(_creation_time int)
 RETURNS VOID

    AS $$
    BEGIN
        EXECUTE format($sql$
            UPDATE tsi.forecasts_%s a SET
            "incidents @ %s" = b.n_incid,
            "road @ %s" = b.n_roads
            FROM tgi_tmp b WHERE a.link_ix = b.link_id;
      $sql$,_creation_time, '01:00', '01:00');
    END $$ LANGUAGE plpgsql;
于 2018-09-11T12:30:03.883 回答