V_all_my_tables содержит один столбец (из charvar), который я хотел бы перебрать и запустить запрос выбора.

HeidiSQL создает функцию, используя приведенный ниже код. Однако, когда я запускаю процедуру, результаты не возвращаются, и эта ошибка регистрируется.

SELECT "myFunc"();
/* Unknown datatype oid #2278 for "myFunc". Fall back to UNKNOWN.

Я новичок в postgres, поэтому мне, вероятно, не хватает чего-то очевидного. Спасибо!

DELIMITER //
CREATE OR REPLACE FUNCTION myFunc() 
  RETURNS void AS
$func$
DECLARE
   _tbl text;
BEGIN
   FOR _tbl IN
      SELECT table_name FROM v_all_my_tables ORDER BY TABLE_NAME ASC
   LOOP
      EXECUTE
      format('SELECT distinct lastupdate FROM %I order by lastupdate DESC LIMIT 1', _tbl); 
   END LOOP;
END
$func$  LANGUAGE plpgsql;
1
krafty1010 18 Июн 2020 в 14:54

1 ответ

Лучший ответ

Вам нужно вызвать EXECUTE с предложением INTO, чтобы сохранить результат выполненного оператора SQL. Возможно, вам потребуется использовать RETURN, чтобы вернуть какой-то результат. Вы не должны использовать двойные кавычки при вызове функции, если двойные кавычки не использовались при определении функции (и, как правило, вам не нужны двойные кавычки для идентификатора в PostgreSQL).

Примере:

select * from t1;
 lastupdate 
------------
 2020-06-18
(1 row)

select * from v_all_my_tables;
 table_name 
------------
 t1
(1 row)


CREATE OR REPLACE FUNCTION myFunc() 
 RETURNS date AS
$func$
DECLARE
   _tbl text;
   v_lastupdate date;
BEGIN
   FOR _tbl IN
      SELECT table_name FROM v_all_my_tables ORDER BY TABLE_NAME ASC
   LOOP
      EXECUTE
       format('SELECT distinct lastupdate FROM %I order by lastupdate DESC LIMIT 1', _tbl)
       INTO v_lastupdate;
   END LOOP;
   RETURN v_lastupdate;
END
$func$  LANGUAGE plpgsql;
CREATE FUNCTION

select myFunc();
   myfunc   
------------
 2020-06-18
(1 row)
0
pifor 18 Июн 2020 в 12:41