Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / с# + Хранимые процедуры (plpgsql) / 5 сообщений из 5, страница 1 из 1
28.07.2008, 11:24
    #35454730
SlaVVa_0428
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с# + Хранимые процедуры (plpgsql)
Преамбула:
Есть приложение c# + хранимые процедуры СУБД (MSSQL, Oracle). Одной из функций приложения является получение выборок из базы через хранимые процедуры.
С MSSQL все просто получаем из хранимых обычные селекты и парсим их.
В случае с Oracle возвращаем sys_refcursor и так же парсим по полям.

А вот при переводе на PostgreSQL встал в ступор.
Судя по форуму и документации возможностей извлечения данных имеется несколько:

1. возвращать select *... через 'sql'
- отбросил сразу, т.к. plpgsql заметно функциональнее и неплохо бы эту функциональность использовать, к тому же результат выходит сплошным текстовым полем, что не очень удобно.

2. возвращать refcursor.
- был очень удивлен, что возвращается лишь одна строка с фактическим названием курсора и для работы необходима дальнейшаа обработка через fetch, что не очень удобно.

3. возвращать setof record.
- это кажется самый оптимальный путь. Один большой вопрос - можно ли описать record внутри самой функции (что-то примеры не попадались), а то делать внешний селект к функции не очень удобно, т.к. в неё передаются параметры (через NpgsqlCommand). Если данная опция возможна - будьте добры кусочек кода!

4. получение результатов запроса через return query (установлена версия 8.3, так что вариант должен работать)
- что-то не удалось победить синтаксис. ругается на то, что не описан "record" как я понимаю данный способ чем, то перекликается с предыдущим, только синтаксис более читабельный.

Было бы очень неплохо получить небольшой примерчик по каждому из способов.
Заранее благодарен!
...
Рейтинг: 0 / 0
28.07.2008, 11:49
    #35454795
Кифирчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с# + Хранимые процедуры (plpgsql)
тоже ДОЛГО мучался... пришёл к такому вот варианту
неудобно, что все возвращаемые поля надо указывать как параметр к функции
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
CREATE FUNCTION get_dev_props (
_net_dev_id bigint, 
out dev_role_id bigint, 
out role_id bigint, 
out role_name character varying, 
out prop_id bigint, 
out prop_name character varying, 
out prop_value character varying   ) RETURNS SETOF record
    AS '
/* Тело новой функции */
   DECLARE rec RECORD;
BEGIN

        FOR rec IN
            SELECT dr.dev_role_id,
                   dr.role_id,
                   ro.role_name,
                   pr.prop_id,
                   pr.prop_name,
                   rv.prop_value
            FROM   net_dev.dev_role    as dr,
                   net_dev.roles       as ro,
                   net_dev.role_values as rv,
                   net_dev.props       as pr
            WHERE  dr.role_id     = ro.role_id
            AND    rv.dev_role_id = dr.dev_role_id
            AND    pr.prop_id     = rv.prop_id
            AND    dr.net_dev_id  = _net_dev_id
        LOOP
            dev_role_id  = rec.dev_role_id;
            role_id      = rec.role_id;
            role_name    = rec.role_name;
            prop_id      = rec.prop_id;
            prop_name    = rec.prop_name;
            prop_value   = rec.prop_value;
            
            RETURN NEXT;
        END LOOP;
END;
'
...
Рейтинг: 0 / 0
28.07.2008, 20:20
    #35456434
SlaVVa_0428
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с# + Хранимые процедуры (plpgsql)
Спасибо!
Не очень красиво, но работает)
...
Рейтинг: 0 / 0
03.09.2008, 16:21
    #35520796
vialorn+
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с# + Хранимые процедуры (plpgsql)
не совсем понял, почему не подходят такие приемы
(всего-то и нужно, что описать структуру результата как таблицу или просмотр)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create or replace function plug_person8timerange (
	in the_day varchar,
	in id_employee integer
) returns setof plug_person8timerange
as $$
declare
	day varchar;
	sql varchar;
	rec record;
begin
	sql := 'select * from plug_person8timerange where ';
	if (id_employee is not null) then
		sql := sql || 'id_employee = ' || id_employee::varchar || ' order by the_day desc';
	else
		day := case when the_day is null then to_char(current_date, 'DD.MM.YYYY') else the_day end;
		sql := sql || 'the_day = \'' || the_day || '\' order by times_work desc';
	end if;
	for rec in execute sql loop
		return next rec;
	end loop;
	return;
end;
$$ language plpgsql;
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
create or replace function plug_person8timerange (
	in the_day varchar,
	in id_employee integer
) returns setof plug_person8timerange
as $$
declare
	day varchar;
begin
	if (id_employee is not null) then
		return query
		select		*
		from		plug_person8timerange p
		where		p.id_employee = id_employee
		order by	the_day desc
		;
	else
		day := case when the_day is null then to_char(current_date, 'DD.MM.YYYY') else the_day end;
		return query
		select		*
		from		plug_person8timerange p
		where		p.the_day = day
		order by	times_work desc
		;
	end if;
	return;
end;
$$ language plpgsql;
...
Рейтинг: 0 / 0
04.09.2008, 13:14
    #35522303
vialorn+
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
с# + Хранимые процедуры (plpgsql)
можно описать структуру результата и как параметры функции
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
create or replace function plug_timeworktype (
	in pid integer,
	out id_work_type integer,
	out work_type varchar,
	out time_id integer
) returns setof record
as $$
declare
	key boolean;
begin
	key := true;

	return query
	select		wt.id_work_type,
			wt.work_type,
			wt.time_id
	from		С_Виды_работ wt
	where		wt.time_id =  12 
		or	wt.id_work_type =  22 
		or	(wt.id_work_type =  21  and key)
		or	(wt.id_work_type =  23  and (key or current_time < '13:30:00'))
	;
	return ;
end;
$$ language plpgsql;
причем при вызове такой функции передаются ей только входные параметры
Код: plaintext
select * from plug_timeworktype( 1631 )
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / с# + Хранимые процедуры (plpgsql) / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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