powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Хранимые процедуры PostgreSQL
17 сообщений из 17, страница 1 из 1
Хранимые процедуры PostgreSQL
    #33443804
tIT-GP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно ли использовать хранимые процедуры plpgsql так же, как и в firebird/interbase/yaffil?
То есть, рассматривать их, как таблицы:

Код: plaintext
1.
2.
3.
4.
SELECT O.ID, O.NAME
FROM U_GET_OBJ_LIST('210010213') OL
  LEFT JOIN U_GET_OBJ(OL.ID) O ON  1 = 1 
WHERE O.TYPE = 'simple_text'

Если можно, то каким должен быть DDL для аналога процедуры firebird:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE S_GET_PARTNER_LIST(
    PID INTEGER)
RETURNS (
    ID INTEGER,
    CITY INTEGER,
    BRAND INTEGER)
AS
...
Рейтинг: 0 / 0
Хранимые процедуры PostgreSQL
    #33444181
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, можно. Дока
...
Рейтинг: 0 / 0
Хранимые процедуры PostgreSQL
    #33446289
tIT-GP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доки я много раз уже читал, но почему-то так и не дошло %
Пишут про тип record, что он динамический.
Но если так, то должна быть возможность сделать нечто вроде:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create function getmy returns record as $$
begin
  my.int_field :=  15 ;
  my.float_field :=  10 . 76 ;
  my.text_field := 'Yohoho!!!';
  return my;
end
$$

select * from my();

|---int_field---|---float_field---|---text_field---|
|---15----------|---10.76---------|---Yohoho!!!----|
...
Рейтинг: 0 / 0
Хранимые процедуры PostgreSQL
    #33446489
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tIT-GP wrote:
> Доки я много раз уже читал, но почему-то так и не дошло %
> Пишут про тип record, что он динамический.
> Но если так, то должна быть возможность сделать нечто вроде:
>

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create function getmy() returns record as $$
declare my record;
begin
   select  15 ::int as int_field,  10 . 76 ::numeric as float_field, 'Yohoho!!!'::text as text_field into my;
   return my;
end $$ language 'plpgsql';
select * from getmy() as ROW(int_field int, float_field numeric, text_field text);

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Хранимые процедуры PostgreSQL
    #33446722
tIT-GP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как-нибудь без AS ROW()?
Слишком многословно получается. %(
...
Рейтинг: 0 / 0
Хранимые процедуры PostgreSQL
    #33450845
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tIT-GP пишет:
> А как-нибудь без AS ROW()?
> Слишком многословно получается. %(
> Тема <http://www.sql.ru/forum/actualthread.aspx?tid=245967> Ответить
> <http://www.sql.ru/forum/actualpost.aspx?tid=245967>
>
create type my_row as (
int_field int4,
float_field float,
text_field text
);

create function getmy() returns my_row as '
declare
my my_row;
begin
my.int_field := 15;
my.float_field := 10.76;
my.text_field := \'Yohoho!!!\';
return my;
end;
' language plpgsql;

select * from getmy();
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Хранимые процедуры PostgreSQL
    #33452448
tIT-GP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо!!!
...
Рейтинг: 0 / 0
Хранимые процедуры PostgreSQL
    #33452617
tIT-GP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще вопрос: а как добится возврата не одной строки, а нескольких?
Например
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
declare
       my my_row;
       i integer;
begin

     for i in  1 .. 15 
     loop
     begin

     my.int_field := i;
     my.float_field :=  0 . 86 ;
     my.text_field := 'Yohoho!!!';

     end;
     end loop;
     return my;
     
end;

Как я не менял расположение return my, не добился вывода 15 строк. Всегда выводится одна.
...
Рейтинг: 0 / 0
Хранимые процедуры PostgreSQL
    #33452674
cyberdreamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tIT-GPЕще вопрос: а как добится возврата не одной строки, а нескольких?
Например
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
declare
       my my_row;
       i integer;
begin

     for i in  1 .. 15 
     loop
     begin

     my.int_field := i;
     my.float_field :=  0 . 86 ;
     my.text_field := 'Yohoho!!!';

     end;
     end loop;
     return my;
     
end;

Как я не менял расположение return my, не добился вывода 15 строк. Всегда выводится одна.

Вместо return надо использовать return next

Дока
...
Рейтинг: 0 / 0
Хранимые процедуры PostgreSQL
    #33452678
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tIT-GP пишет:
> Еще вопрос: а как добится возврата не одной строки, а нескольких?
> Например
>
> declare
> my my_row;
> i integer;
> begin
>
> for i in *1*..*15*
> loop
> begin
>
> my.int_field := i;
> my.float_field := *0*.*86*;
> my.text_field := 'Yohoho!!!';
>
> end;
> end loop;
> return my;
>
> end;
>
> Как я не менял расположение return my, не добился вывода 15 строк.
> Всегда выводится одна.
> Тема <http://www.sql.ru/forum/actualthread.aspx?tid=245967> Ответить
> <http://www.sql.ru/forum/actualpost.aspx?tid=245967>
>

попробуй
<code>
create function getmy() returns setof my_row as '
declare
my my_row;
i integer;
begin
for i in *1*..*15*
loop
my.int_field := i;
my.float_field := *0*.*86*;
my.text_field := 'Yohoho!!!';
return next my;
end loop;
return;
end;
' language plpgsql;
</code>
а еще лучше почитай доки
http://www.postgresql.org/docs/7.4/interactive/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING
и поищи на форуме
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Хранимые процедуры PostgreSQL
    #33452887
tIT-GP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся с еще одной проблемой:

Код: 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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
CREATE TABLE "public"."test_data" (
  "id" INTEGER NOT NULL, 
  "type" INTEGER NOT NULL, 
  "short_text" VARCHAR( 255 ), 
  CONSTRAINT "test_data_pkey" PRIMARY KEY("id")
) WITH OIDS;

CREATE TYPE "public"."ret_id" AS (
  "id" INTEGER
);

CREATE TYPE "public"."test" AS (
  "id" INTEGER,
  "type" INTEGER,
  "info" VARCHAR( 255 )
);

CREATE OR REPLACE FUNCTION "public"."get_obj_list" () RETURNS SETOF "public"."ret_id" AS
$body$
declare
       ret ret_id;
begin

     for ret in select test_data.id from test_data
     loop

     return next ret;
     
     end loop;

end;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

CREATE OR REPLACE FUNCTION "public"."get_obj" (id integer) RETURNS "public"."test" AS
$body$
declare
       ret test;
       in_id alias for $ 1 ;
       
begin

     select * from test_data a into ret where a.id=in_id;
     return ret;

end;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;


После этого выполняю запрос

Код: plaintext
1.
2.
3.
select a.id, b.*
from get_obj_list() a
  left join get_obj(a.id) b on  1 = 1 

Ругается, что:

ERROR: relation "a" does not exist
...
Рейтинг: 0 / 0
Хранимые процедуры PostgreSQL
    #33453379
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tIT-GP
Код: plaintext
1.
2.
3.
select a.id, b.*
from get_obj_list() a
  left join get_obj(a.id) b on  1 = 1 

Ругается, что:

ERROR: relation "a" does not exist
Такая штука в Постгресе до сих пор не реализована. Нельзя передать в функцию поля связываемой таблицы/функции.
Приходится для каждого случая писать свою функцию, с циклическим вызовом параметризуемой функции внутри.
...
Рейтинг: 0 / 0
Хранимые процедуры PostgreSQL
    #33453636
tIT-GP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну вот %
Придется пока отказаться от использования PostgreSQL в наших проектах и сидеть на регулярно падающем firebird %(
Всем спасибо за ответы! =)
...
Рейтинг: 0 / 0
Хранимые процедуры PostgreSQL
    #33454327
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а вьюхи пробовали использовать?

мне думается что можно не функции писать в Вашем случае, а попробовать половину во вьюхи преобразовать
...
Рейтинг: 0 / 0
Хранимые процедуры PostgreSQL
    #33454716
tIT-GP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хех =))
Не все так просто =)

На самом актуальном проекте (musa-motors.ru) на базе firebird задействовано:

40 доменов
66 таблиц
36 вьюшек
209 хранимых процедур
345 триггеров
20 udf

Все данные сайта берутся из хранимых процедур, коих чуть меньше сотни - 27 общих для всех сайтов и остальные специфические для мусы (к таблицам, вьюшкам у скриптов просто доступа нет из соображения безопасности - на стороне БД решается, что отдавать, а что нет).

Все остальное задействовано программой управления (upsite.ru).
...
Рейтинг: 0 / 0
Хранимые процедуры PostgreSQL
    #33454739
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и что Вы этим хотите сказать?

ну есть готовый проект на FB и что? кто мешает в новом сделать все немного подругому?

я пока понял что вы хотите делать так как привыкли, а не так как правильно было бы делать.
...
Рейтинг: 0 / 0
Хранимые процедуры PostgreSQL
    #33455822
tIT-GP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тема закрыта.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Хранимые процедуры PostgreSQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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