“错误:格式的论点太少()在PL/PGSQL功能中

发布于 2025-01-21 09:38:29 字数 1108 浏览 3 评论 0原文

我创建了一个函数,可以使用不同的时间段从几个表中提取信息:

CREATE OR REPLACE FUNCTION getAllFoo() RETURNS SETOF tmpindicadores AS
$BODY$
DECLARE
r tmpindicadores%rowtype;
record tmpindicadores.relname%type;
tmpdata_inicio TIMESTAMP;
tmpdata_fim TIMESTAMP;
dia_inicio INTEGER := 01;
dia_fim INTEGER := 01;
mes INTEGER;
ano INTEGER;

BEGIN 
SELECT EXTRACT (MONTH FROM CURRENT_DATE) INTO mes;enter code here
SELECT EXTRACT (YEAR FROM CURRENT_DATE) INTO ano;
tmpdata_inicio := ano || '-' ||mes ||'-' ||dia_inicio;
tmpdata_fim := ano || '-' ||mes + 1 ||'-' ||dia_fim;

FOR r IN SELECT relname FROM tmpindicadores
LOOP
record = r.relname;
EXECUTE format($$INSERT INTO indicadores1 (SELECT * FROM %I WHERE time_date >= %tmpdata_inicio 
AND time_date <= %tmpdata_fim)$$,record);
RETURN NEXT r;
END LOOP;
COPY indicadores1 TO '/var/app_data/indicadores/arquivos/indicadores1.csv' DELIMITER ';' CSV 
HEADER;
RETURN;
END
$BODY$
LANGUAGE plpgsql;

SELECT * FROM getAllFoo();

但是我得到:

 错误:格式的参数太少。
 

此错误发生在执行行中。当我替换变量时完美。

我在做什么错?

I created a function to extract information from several tables using different time period:

CREATE OR REPLACE FUNCTION getAllFoo() RETURNS SETOF tmpindicadores AS
$BODY$
DECLARE
r tmpindicadores%rowtype;
record tmpindicadores.relname%type;
tmpdata_inicio TIMESTAMP;
tmpdata_fim TIMESTAMP;
dia_inicio INTEGER := 01;
dia_fim INTEGER := 01;
mes INTEGER;
ano INTEGER;

BEGIN 
SELECT EXTRACT (MONTH FROM CURRENT_DATE) INTO mes;enter code here
SELECT EXTRACT (YEAR FROM CURRENT_DATE) INTO ano;
tmpdata_inicio := ano || '-' ||mes ||'-' ||dia_inicio;
tmpdata_fim := ano || '-' ||mes + 1 ||'-' ||dia_fim;

FOR r IN SELECT relname FROM tmpindicadores
LOOP
record = r.relname;
EXECUTE format($INSERT INTO indicadores1 (SELECT * FROM %I WHERE time_date >= %tmpdata_inicio 
AND time_date <= %tmpdata_fim)$,record);
RETURN NEXT r;
END LOOP;
COPY indicadores1 TO '/var/app_data/indicadores/arquivos/indicadores1.csv' DELIMITER ';' CSV 
HEADER;
RETURN;
END
$BODY$
LANGUAGE plpgsql;

SELECT * FROM getAllFoo();

But I get:

ERROR: too few arguments for format.

This error occurs in the EXECUTE line. When I replace the variables tmpdata_inicio and tmpdata_fim with '2022-04-01 00:00:00' and '2022-04-05 00:00:00' it works perfectly.

What am I doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

影子的影子 2025-01-28 09:38:29

您正在使用 格式( )

这将有效:

EXECUTE format($INSERT INTO indicadores1 SELECT * FROM %I WHERE time_date >= %L AND time_date <= %L$, record, tmpdata_inicio, tmpdata_fim);

但是,使用子句:将 values 传递:

EXECUTE format($INSERT INTO indicadores1 SELECT * FROM %I WHERE time_date >= $1 AND time_date <= $2$, record)
USING tmpdata_inicio, tmpdata_fim;

也就是说,我会重写整个函数以消毒和优化...

You are using incorrect format specifiers for format().

This would work:

EXECUTE format($INSERT INTO indicadores1 SELECT * FROM %I WHERE time_date >= %L AND time_date <= %L$, record, tmpdata_inicio, tmpdata_fim);

But rather, pass values with the USING clause:

EXECUTE format($INSERT INTO indicadores1 SELECT * FROM %I WHERE time_date >= $1 AND time_date <= $2$, record)
USING tmpdata_inicio, tmpdata_fim;

That said, I would rewrite the whole function to sanitize and optimize ...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文