gpt4 book ai didi

sql - 调用函数时在 "("处或附近出现语法错误

转载 作者:行者123 更新时间:2023-11-29 14:13:29 24 4
gpt4 key购买 nike

运行这段代码时,出现以下错误:

ERROR: syntax error at or near "(";
error while executing the query(7)

代码:

CREATE OR REPLACE FUNCTION obs_updated_date() RETURNS INTEGER AS $$
DECLARE
i RECORD;
BEGIN
FOR i IN
(SELECT r FROM pg_class
WHERE r LIKE 'abc%1')
LOOP
EXECUTE 'update' || i || 'SET observation_time = xyz + INTERVAL"18 hour"';
END LOOP;
RETURN 1;
END;
$$ LANGUAGE plpgsql;

SELECT obs_updated_date();
DROP FUNCTION obs_updated_date();

最佳答案

主要错误是双引号,您需要单引号作为字面值:

<strike>INTERVAL "18 hour"</strike>
INTERVAL '18 hour'

但由于它嵌套在带引号的字符串中,我建议使用外部美元引号:

 EXECUTE 'update' || i || $u$SET observation_time = date_added + INTERVAL '18 hour'$u$;

相关:

更好的是,使用 format() 正确引用表名:

 EXECUTE format ($u$UPDATE %I SET observation_time = date_added + INTERVAL '18 hour'$u$, i);

而且您不能像以前那样使用record 变量。还有一些改进,导致:

CREATE OR REPLACE FUNCTION obs_updated_date()
RETURNS int AS
$func$
DECLARE
_tbl regclass;
_ct int := 0;
BEGIN
FOR _tbl IN
SELECT oid
FROM pg_class
WHERE relname LIKE 'traffic%1'
AND relkind = 'r' -- only actual tables
AND relnamespace::regnamespace::text NOT LIKE 'pg_%' -- no system tables
LOOP
EXECUTE format ($u$UPDATE %I SET observation_time = date_added + interval '18 hour'$u$, _tbl);
_ct := _ct + 1;
END LOOP;
RETURN _ct; -- return sth useful: the number of affected tables
END
$func$ LANGUAGE plpgsql;

开始时您不需要记录text 就可以了。更好的是,对表名使用 regclass 类型,因为它会在需要时自动添加模式名称。否则,对于在多个模式中使用的表名,这可能会出现严重错误。

对于一次性使用(如悬挂的 DROP FUNCTION 所示)考虑 DO语句而不是函数:

DO
$do$
DECLARE
_tbl regclass;
_ct int := 0;
BEGIN

...

RAISE NOTICE '% tables updated.', _ct;
END
$do$;

关于sql - 调用函数时在 "("处或附近出现语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57352369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com