Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как вывести результат запроса если таблица существует? / 17 сообщений из 17, страница 1 из 1
12.09.2017, 11:55
    #39519782
Как вывести результат запроса если таблица существует?
Надо что-то типа:

Код: sql
1.
IF EXISTS table1 SELECT * FROM table1 ELSE '0'





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

RETURNS RECORD

(первую строчку)
...
Рейтинг: 0 / 0
12.09.2017, 11:58
    #39519784
Как вывести результат запроса если таблица существует?
блок do тоже результат запроса вывести не может
...
Рейтинг: 0 / 0
12.09.2017, 12:20
    #39519792
fte
fte
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести результат запроса если таблица существует?
Дерзкий Вакуум,

RETURNS SET OF RECORD
...
Рейтинг: 0 / 0
12.09.2017, 12:28
    #39519794
Как вывести результат запроса если таблица существует?
fteДерзкий Вакуум,

RETURNS SET OF RECORD


Смотрю примеры, не нашел как без создания нового типа реализовать.


Это реально вообще?
...
Рейтинг: 0 / 0
12.09.2017, 12:32
    #39519797
Как вывести результат запроса если таблица существует?
И нет ли способа без создания функции это сделать? (проверить на наличие таблицы и сделать из нее выборку если она есть)

как мс скл, например.
...
Рейтинг: 0 / 0
12.09.2017, 12:42
    #39519804
ursido
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести результат запроса если таблица существует?
Дерзкий ВакуумfteДерзкий Вакуум,

RETURNS SET OF RECORD


Смотрю примеры, не нашел как без создания нового типа реализовать.


Это реально вообще?

Смотрите здесь: https://www.postgresql.org/docs/9.6/static/plpgsql-declarations.html .
Ищите по фразе: This is exactly equivalent to declaring one or more OUT parameters and specifying RETURNS SETOF sometype
...
Рейтинг: 0 / 0
12.09.2017, 12:56
    #39519815
Как вывести результат запроса если таблица существует?
В общем вот такое хочу сделать:


Пример взял отсюда: https://postgrespro.ru/docs/postgrespro/9.5/plpgsql-control-structures


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Пример использования RETURN QUERY:

CREATE FUNCTION get_available_flightid(date) RETURNS SETOF integer AS
$BODY$
BEGIN
    RETURN QUERY SELECT flightid
                   FROM flight
                  WHERE flightdate >= $1
                    AND flightdate < ($1 + 1);

    -- Так как выполнение ещё не закончено, можно проверить, были ли возвращены строки
    -- Если нет, то вызываем исключение
    IF NOT FOUND THEN
        RAISE EXCEPTION 'Нет рейсов на дату: %.', $1;
    END IF;

    RETURN;
 END
$BODY$
LANGUAGE plpgsql;

-- Возвращает доступные рейсы, либо вызывает исключение
SELECT * FROM get_available_flightid(CURRENT_DATE);




и упростил его, оставив только вывод простого селекта:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE FUNCTION test001_func() RETURNS SETOF RECORD AS '
BEGIN

RETURN QUERY SELECT * FROM pg_tables;

    RETURN;
END;
' LANGUAGE plpgsql;


SELECT test001_func();




Функция создается, но не выполняется:
Код: sql
1.
2.
3.
4.
5.
6.
7.
ОШИБКА:  функция, возвращающая множество, вызвана в контексте, где ему нет места
CONTEXT:  функция PL/pgSQL test001_func(), строка 4, оператор RETURN QUERY
********** Ошибка **********

ОШИБКА: функция, возвращающая множество, вызвана в контексте, где ему нет места
SQL-состояние: 0A000
Контекст: функция PL/pgSQL test001_func(), строка 4, оператор RETURN QUERY



Помогите найти почему ошибка
...
Рейтинг: 0 / 0
12.09.2017, 12:59
    #39519823
Как вывести результат запроса если таблица существует?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE FUNCTION test001_func() RETURNS SETOF integer AS '
BEGIN

RETURN QUERY SELECT 1 FROM pg_tables;

    RETURN;
END;
' LANGUAGE plpgsql;


SELECT test001_func();





Так работает, но как не одно поле вывести а всю таблицу?

SETOF RECORD выдает ошибку, ту что выше.


ОШИБКА: функция, возвращающая множество, вызвана в контексте, где ему нет места
SQL-состояние: 0A000
...
Рейтинг: 0 / 0
12.09.2017, 13:04
    #39519826
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести результат запроса если таблица существует?
Не типа такого:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE OR REPLACE FUNCTION get_all_foo() RETURNS SETOF foo AS
$BODY$
DECLARE
    r foo%rowtype;
BEGIN
    FOR r IN
        SELECT * FROM foo WHERE fooid > 0
    LOOP
        -- can do some processing here
        RETURN NEXT r; -- return current row of SELECT
    END LOOP;
    RETURN;
END
$BODY$
LANGUAGE plpgsql;

SELECT * FROM get_all_foo();
...
Рейтинг: 0 / 0
12.09.2017, 13:10
    #39519831
Как вывести результат запроса если таблица существует?
qi_ipНе типа такого:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE OR REPLACE FUNCTION get_all_foo() RETURNS SETOF foo AS
$BODY$
DECLARE
    r foo%rowtype;
BEGIN
    FOR r IN
        SELECT * FROM foo WHERE fooid > 0
    LOOP
        -- can do some processing here
        RETURN NEXT r; -- return current row of SELECT
    END LOOP;
    RETURN;
END
$BODY$
LANGUAGE plpgsql;

SELECT * FROM get_all_foo();





О, круто!

Вот так спработало:


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE FUNCTION test001_func() RETURNS SETOF pg_tables AS '
BEGIN

RETURN QUERY SELECT * FROM pg_tables;

    RETURN;
END;
' LANGUAGE plpgsql;


SELECT * FROM test001_func();



Благодарю :)




А можно ли как-то указать в
Код: sql
1.
RETURNS SETOF

явные значение вывода?



Так, например, ошибку выдает:

Код: sql
1.
RETURNS SETOF (name, boolean) 
...
Рейтинг: 0 / 0
12.09.2017, 13:11
    #39519832
Как вывести результат запроса если таблица существует?
У меня просто в SELECT сложный запрос из нескольких таблиц.
...
Рейтинг: 0 / 0
12.09.2017, 13:25
    #39519837
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести результат запроса если таблица существует?
Как вариант, view сделайте и из нее вызывайте процедуру
...
Рейтинг: 0 / 0
12.09.2017, 13:26
    #39519838
Как вывести результат запроса если таблица существует?
qi_ipКак вариант, view сделайте и из нее вызывайте процедуру

вьюшка не создаться, если таблица не существует
...
Рейтинг: 0 / 0
12.09.2017, 13:29
    #39519841
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести результат запроса если таблица существует?
Дерзкий Вакуум,

RETURNS TABLE, про который уже сказал ursido
...
Рейтинг: 0 / 0
12.09.2017, 13:37
    #39519845
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести результат запроса если таблица существует?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE FUNCTION func_a(username text = '', databaseobject text = '')
  RETURNS TABLE(col1 int, col2 text, col3 date) AS
$func$
BEGIN

RETURN QUERY EXECUTE
format ('SELECT v1.col1, v1.col2, v2.col3
         FROM %s v1 LEFT JOIN %I v2 USING (id)$f$
       , CASE WHEN username = '*' THEN 'view1' ELSE 'view3' END, databaseobject);

END
$func$;
...
Рейтинг: 0 / 0
12.09.2017, 13:41
    #39519849
Как вывести результат запроса если таблица существует?
qi_ip
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE FUNCTION func_a(username text = '', databaseobject text = '')
  RETURNS TABLE(col1 int, col2 text, col3 date) AS
$func$
BEGIN

RETURN QUERY EXECUTE
format ('SELECT v1.col1, v1.col2, v2.col3
         FROM %s v1 LEFT JOIN %I v2 USING (id)$f$
       , CASE WHEN username = '*' THEN 'view1' ELSE 'view3' END, databaseobject);

END
$func$;





Ода, то что надо!


Спасибо!
...
Рейтинг: 0 / 0
12.09.2017, 13:41
    #39519850
Как вывести результат запроса если таблица существует?
MelkijДерзкий Вакуум,

RETURNS TABLE, про который уже сказал ursido


вот вот, благодарю!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как вывести результат запроса если таблица существует? / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]