powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / join в хранимой процедуре
8 сообщений из 8, страница 1 из 1
join в хранимой процедуре
    #35547530
sisqo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только начал изучать хранимые процедуры и сразу появились вопросы

Как получить данные из процедуры которая join-нит таблицы , тоесть для одной таблицы всё просто
Код: plaintext
1.
2.
3.
4.
5.
6.
create or replace function ex() returns setof "User" AS
$$
BEGIN
    return query select * from "User" limit  10 ;
END;
$$ LANGUAGE 'plpgsql';

Как сделать чтобы получить данные из такого запроса
Код: plaintext
return query select * from "User" as u, "userDetails" as ud where u.id=ud."userID" limit  10 ;

Сильно подозреваю что надо использовать record либо создать новый тип , но что-то никак не осилю :(

И второй вопрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace function count_users() returns int AS
$$
declare
	count int;
BEGIN
    select count(*) into count from "User";
    return count;
END;
$$ LANGUAGE 'plpgsql';

Сообщает об ошибке
авторERROR: syntax error at or near "("
LINE 1: select $1 (*) from "User"
^
QUERY: select $1 (*) from "User"
CONTEXT: SQL statement in PL/PgSQL function "count_users" near line 4

********** Error **********

ERROR: syntax error at or near "("
SQL state: 42601
Context: SQL statement in PL/PgSQL function "count_users" near line 4

Тоесть я просто хочу получить количство записей в таблице "Users"
...
Рейтинг: 0 / 0
join в хранимой процедуре
    #35547572
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
называть локальные переменные созвучно со встроенными функциями/ключевыми словами/таблицами - плохая идея
...
Рейтинг: 0 / 0
join в хранимой процедуре
    #35547691
Konstantin~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
во втором случае переменная вообще не нужна
Код: plaintext
1.
2.
3.
4.
5.
6.
create or replace function count_users() returns int AS
$$
BEGIN
    return (select count(*) into count from "User");
END;
$$ LANGUAGE 'plpgsql';
...
Рейтинг: 0 / 0
join в хранимой процедуре
    #35547693
Konstantin~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по первому вопросу:
а почему view не подходит, если все что делает процедура это select ... join ?
...
Рейтинг: 0 / 0
join в хранимой процедуре
    #35547703
sisqo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело не в то что view не подходит , этот пример не из жизни , просто случаются ситуации когда надо join'нить таблицы в нутри процедуры и возвращать результат этого join

Да действительно называть переменные созвучно со встроенными функциями/ключевыми словами/таблицами идея это плохая
Спасибо :)

Но первый вопрос остаётся в силе


И появился новый вопрос
Цель получить ограниченое количество результатов из общего количества найденых строк
и число всех результатов удовлетворивших запросу тоесть аналог MySQL'ного SQL_CALC_FOUND_ROWS

1) первое обращение к базе
BEGIN;
DECLARE curs SCROLL CURSOR FOR
SELECT * FROM "User" WHERE name like '%john%'

2) втроое обращение (получить количество всех результатов)
MOVE FORWARD ALL IN curs;

3) третие обращение
MOVE ABSOLUTE $offset IN curs;

4) получить несколько строк из общего результата
FETCH $limit FROM curs;

5)
COMMIT

так вот думается мне что эффективнее былобы делать все эти операции в процедуре

но как вернуть из процедуры общее число найденых результатов (int) и сами результаты ?
...
Рейтинг: 0 / 0
join в хранимой процедуре
    #35549982
Konstantin~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по первому вопросу, т.е. как вернуть результат селекта из функции
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
-- сначала надо определить тип данных которые будет возвращать функция. Это можно сделать определив
--  таблицу, новый тип данных или view.  Ниже дан пример для view
CREATE OR REPLACE VIEW ex_v 
    AS  select * from "User" as u, "userDetails" as ud where u.id=ud."userID";

-- далее определяем функцию;
--   я даю пример с параметром задавая LIMIT
create or replace function ex(lim integer) returns setof "ex_v" AS
$$
DECLARE
     ex_rec RECORD;
BEGIN
   --                    тут собствено любой запрос
    FOR ex_rec IN select * from "User" as u, "userDetails" as ud where u.id=ud."userID" LIMIT lim LOOP
           RETURN NEXT ex_rec;  
    END LOOP;
END;
$$ LANGUAGE 'plpgsql';

RETURN NEXT это основная конструкция с помощью которой можно отдавать набор значений.

использование:
Код: plaintext
1.
   SELECT * FROM ex( 10 ); 
...
Рейтинг: 0 / 0
join в хранимой процедуре
    #35556282
sisqo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это как-то не очень удобно , делать view только чтоб вернуть нужный набор данных из процедуры :(
Но всёравно спасибо за ответ :)
...
Рейтинг: 0 / 0
join в хранимой процедуре
    #35556451
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sisqoЭто как-то не очень удобно , делать view только чтоб вернуть нужный набор данных из процедуры :(
Но всёравно спасибо за ответ :)

Konstantin~... Это можно сделать определив
-- таблицу, новый тип данных или view. ..

CREATE TYPE
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / join в хранимой процедуре
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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