powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как вывести результат запроса если таблица существует?
17 сообщений из 17, страница 1 из 1
Как вывести результат запроса если таблица существует?
    #39519782
Надо что-то типа:

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





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

RETURNS RECORD

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

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

RETURNS SET OF RECORD


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


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

как мс скл, например.
...
Рейтинг: 0 / 0
Как вывести результат запроса если таблица существует?
    #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
Как вывести результат запроса если таблица существует?
    #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
Как вывести результат запроса если таблица существует?
    #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
Как вывести результат запроса если таблица существует?
    #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
Как вывести результат запроса если таблица существует?
    #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
Как вывести результат запроса если таблица существует?
    #39519832
У меня просто в SELECT сложный запрос из нескольких таблиц.
...
Рейтинг: 0 / 0
Как вывести результат запроса если таблица существует?
    #39519837
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как вариант, view сделайте и из нее вызывайте процедуру
...
Рейтинг: 0 / 0
Как вывести результат запроса если таблица существует?
    #39519838
qi_ipКак вариант, view сделайте и из нее вызывайте процедуру

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

RETURNS TABLE, про который уже сказал ursido
...
Рейтинг: 0 / 0
Как вывести результат запроса если таблица существует?
    #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
Как вывести результат запроса если таблица существует?
    #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
Как вывести результат запроса если таблица существует?
    #39519850
MelkijДерзкий Вакуум,

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


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


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