Intereting Posts
Записи MySQL / дорожки или последовательные даты Есть ли эквивалент MS SQL «FOR XML PATH» в других продуктах базы данных? Oracle – оставьте даты в кварталах Когда мы можем использовать номер идентификатора вместо его имени в PostgreSQL? заявление case case Создание фидов синдикации ASP.NET с помощью SqlConnection и VB.NET Выбор всех дат из таблицы в диапазоне дат и включая 1 строку за пустую дату Агент агностик SQL для объединения значений полей в записях Oracle 11g: по умолчанию статическое значение, когда запрос ничего не возвращает Преобразование Varchar в десятичное преобразование в db2 SQL, чтобы получить содержимое таблицы как «SELECT * FROM tblname» Как игнорировать амперсанды в SQL-скрипте, запущенном из SQL Plus? Как отображать все месяцы в результатах сводных запросов, даже если данные за данный месяц Пытаясь запросить базу данных с помощью PreparedStatement, ResultSet вернется в закрытое состояние, когда оно не должно убить все пользовательские подключения в SQL Azure

Функция Postgres возвращает таблицу, не возвращающую данные в столбцах

У меня есть функция Postgres, возвращающая таблицу:

CREATE OR REPLACE FUNCTION testFunction() RETURNS TABLE(a int, b int) AS $BODY$ DECLARE a int DEFAULT 0; DECLARE b int DEFAULT 0; BEGIN CREATE TABLE tempTable AS SELECT a, b; RETURN QUERY SELECT * FROM tempTable; DROP TABLE tempTable; END; $BODY$ LANGUAGE plpgsql; 

Эта функция не возвращает данные в виде строки и столбца. Вместо этого он возвращает данные как:

 (0,0) 

Это вызывает проблему в блоке cfquery Coldfusion при извлечении данных. Как получить данные в строках и столбцах, когда таблица возвращается из этой функции? Другими словами: Почему функция PL / pgSQL не возвращает данные в виде столбцов?

Чтобы получить отдельные столбцы вместо типа строки, вызовите функцию с помощью:

 SELECT * FROM testfunction(); 

Так же, как вы выберете все столбцы из таблицы.
Также рассмотрите эту рассмотренную форму вашей тестовой функции:

 CREATE OR REPLACE FUNCTION testfunction() RETURNS TABLE(a int, b int) AS $func$ DECLARE _a int := 0; _b int := 0; BEGIN CREATE TEMP TABLE tbl AS SELECT _a, _b; RETURN QUERY SELECT * FROM tbl; DROP TABLE tempTable; END $func$ LANGUAGE plpgsql; 

В частности:

  • Слово DECLARE требуется только один раз.
  • Избегайте объявления параметров, которые уже (неявно) объявлены как параметры OUT в предложении RETURNS TABLE (...) .
  • Не используйте без кавычек идентификаторы CaMeL-case в Postgres. Он работает, без кавычек идентификаторов, отбрасываемых в нижний регистр, но это приводит к запутывающим ошибкам. Видеть
    • Являются ли имена столбцов PostgreSQL чувствительными к регистру?

Временная таблица полностью бесполезна в примере (вероятно, слишком упрощена). Вы можете уменьшить до:

 CREATE OR REPLACE FUNCTION testfunction(OUT a int, OUT b int) AS $func$ BEGIN a := 0; b := 0; END $func$ LANGUAGE plpgsql;