eliasum
@eliasum
cd ..

Где ошибка в EXECUTE FORMAT?

Есть таблица с данными и функция:
CREATE TABLE IF NOT EXISTS in_table(
in_key INTEGER NOT NULL,
in_tst TIMESTAMPTZ NOT NULL,
in_val FLOAT NOT NULL);

INSERT INTO in_table (in_key, in_tst, in_val) 
  SELECT
    (random()*30)::INT, tstamp, random()*80 - 40
  FROM
    generate_series(
      NOW() - INTERVAL '90 days',
      NOW(),
      '1 min'
    ) AS tstamp;

CREATE OR REPLACE FUNCTION _Foo(st TIMESTAMP, fin TIMESTAMP)
RETURNS TABLE (out_key INTEGER, out_tst timestamptz, out_val FLOAT) AS $$
DECLARE  
	
BEGIN

	RETURN QUERY SELECT in_key, in_tst, in_val 
	FROM in_table 
	WHERE in_tst BETWEEN st AND fin;

END;

$$ LANGUAGE plpgsql;


Как переписать функцию, чтобы она динамически формировала возврат таблицы, что то наподобие этого "псевдокода":
CREATE OR REPLACE FUNCTION _Foo(st TIMESTAMP, fin TIMESTAMP)
RETURNS TABLE (out_key INTEGER, out_tst timestamptz, out_val FLOAT) AS $$
DECLARE  
	
BEGIN

	EXECUTE FORMAT('
	RETURN QUERY SELECT %I, %I, %I
	FROM %I 
	WHERE %I BETWEEN %I AND %I;
	', in_key, in_tst, in_val, in_table, in_tst, st, fin);

END;

$$ LANGUAGE plpgsql;
  • Вопрос задан
  • 254 просмотра
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
CREATE OR REPLACE FUNCTION _Foo2(st TIMESTAMP, fin TIMESTAMP)
RETURNS TABLE (out_key INTEGER, out_tst timestamptz, out_val FLOAT) AS $$
DECLARE  
  
BEGIN

  RETURN QUERY EXECUTE FORMAT('
  SELECT %I, %I, %I
  FROM %I 
  WHERE %I BETWEEN ''%s'' AND ''%s'';
  ', 
  'in_key', 'in_tst', 'in_val', 'in_table', 'in_tst', st, fin);

END;

$$ LANGUAGE plpgsql;


DEMO fiddle

Ошибки найдёте самостоятельно...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы