
I
09.02.2017
20:03:49
там, вроде, отдельно гемы для таких радостей

Дмитрий
09.02.2017
20:04:04
используя fetch all in <unnamed portal 1>;
fetch all in <unnamed portal2>;
в общем возращется только один курсор

I
09.02.2017
20:04:53
а, в обоих случаях одинаковый?

Дмитрий
09.02.2017
20:05:27
вроде последний приходит или первый

Google

I
09.02.2017
20:05:46
можно попробовать взять гем для работы с курсорами, кстати
типа такого https://github.com/afair/postgresql_cursor
а вот unnamed portal'ы вот эти, это то, что функция с курсорами вернет?

Дмитрий
09.02.2017
20:07:41
ага. В простом случае возращется один unnamed portal

I
09.02.2017
20:07:48
а так - можно же возвращать SETOF курсоров из функции
или так и сделано?

Дмитрий
09.02.2017
20:10:46
переезжаем из mssql в postgres. Так-то проект на с#, там с этим проблем нет. Хотел тестировать результаты хранимок используя ruby и rspec.
SETOF что это? Как-то поможет два результата получить с одного вызова храники?

I
09.02.2017
20:14:33
ну вот из PG доки примерчик
CREATE FUNCTION myfunc(refcursor, refcursor) RETURNS SETOF refcursor AS $$
BEGIN
OPEN $1 FOR SELECT * FROM table_1;
RETURN NEXT $1;
OPEN $2 FOR SELECT * FROM table_2;
RETURN NEXT $2;
END;
$$ LANGUAGE plpgsql;
-- need to be in a transaction to use cursors.
BEGIN;
SELECT * FROM myfunc('a', 'b');
FETCH ALL FROM a;
FETCH ALL FROM b;
COMMIT;
функция возвращает setof курсоров по сути

Дмитрий
09.02.2017
20:16:10
попробую завтра на работе, спасибо. Надеюсь есть шанс)

I
09.02.2017
20:16:42
если что - пишите)

Дмитрий
09.02.2017
20:16:53
отпишусь завтра

Google

Dmitry
09.02.2017
20:19:53
извините что влезаю, но мне интересно касательно хранимок. А храните ли вы их в системе контроля версий? Или они только в БД лежат?

Дмитрий
09.02.2017
20:20:11
храним в системе контроля версий
Setof один объединенный курсор вернет?

Dmitry
09.02.2017
20:20:53
а обновления как накатываете миграциями (через CI)? или руками?

I
09.02.2017
20:21:19

Дмитрий
09.02.2017
20:22:30
инсталлятор серверной части

I
09.02.2017
20:22:40
оу
ну наследие .NET, видимо

Дмитрий
09.02.2017
20:25:42
как-то же нужно поддерживать клиентов от версии к версии
http://stackoverflow.com/questions/40687123/how-get-multiple-resultset-cursors-with-django-and-postgresql
похоже на мой вариант только на python

I
09.02.2017
20:49:20
It's unanswered :c


Дмитрий
09.02.2017
21:26:26
create table dbo.users(
id integer,
name varchar(100),
email varchar(50),
is_active integer
);
insert into dbo.users(id,name,email,is_active)
select 1,'one', 'one@mail.com', 1 union all
select 2,'two', 'two@mail.com', 0 union all
select 3,'three', 'three@mail.com', 1
;
CREATE OR REPLACE FUNCTION dbo.test_get_users(userID integer) RETURNS SETOF refcursor AS $$
DECLARE
ref1 refcursor;
ref2 refcursor;
ref3 refcursor;
BEGIN
OPEN ref1 FOR
OPEN ref2 FOR
SELECT id FROM dbo.users WHERE is_active=1;
RETURN next ref2;
OPEN ref3 FOR
SELECT * FROM dbo.users WHERE id = userID;
RETURN next ref3;
RETURN;
END;
$$ LANGUAGE plpgsql;
это нужно на postgres выполнить
require 'pg'
conn = PG.connect(:dbname => 'rev_1604',:user => 'postgres', :password => 'postgres', :host => 'localhost')
query = «~QUERY
SELECT dbo.test_get_users(1);
FETCH ALL IN "<unnamed portal 1>";
FETCH ALL IN "<unnamed portal 2>";
FETCH ALL IN "<unnamed portal 3>";
QUERY
res = conn.exec(query)
res.each do |row|
puts row
end


I
09.02.2017
21:27:12
круто, есть что потестить)

Дмитрий
09.02.2017
21:27:15
unnamed portal 3 возвращается
http://trentrichardson.com/2012/01/04/return-multiple-result-sets-with-php-and-postgresql-functions/ пример отсюда

I
09.02.2017
21:28:51
вот к этому у меня вопрос
OPEN ref1 FOR
OPEN ref2 FOR
SELECT id FROM dbo.users WHERE is_active=1;
RETURN next ref2;

Google

Дмитрий
09.02.2017
21:29:10
почему?

I
09.02.2017
21:29:35
а что тут делается?)

Дмитрий
09.02.2017
21:30:07
я скопировал и выполнил

I
09.02.2017
21:30:12
мы открывает первый курсор и суем в него query в которой мы открываем второй курсор и выполняет select ***
а, оно работает в sql, да?
ща тогда проверю

Дмитрий
09.02.2017
21:30:42
да
по одному если выполнять FETCH ALL IN "<unnamed portal 1>";
работает
а если все три то только третий возращается

I
09.02.2017
21:32:12
не, у меня не работает =)
как я и говорил, сыпется на OPEN ref2

I
09.02.2017
21:32:38
там не все скопировал)
посмотри внимательно)

Дмитрий
09.02.2017
21:33:28
пардон
ща

I
09.02.2017
21:34:17
да я уже оттуда взял

Дмитрий
09.02.2017
21:34:38
когда копипастил чето натворилось)
в бд нормальный вариант
dade@hp:~/projects$ ruby ./pspg.rb
{"id"=>"1", "name"=>"one", "email"=>"one@mail.com", "is_active"=>"1"}

Google

I
09.02.2017
21:36:24
кстати, а мне выдает cursor "<unnamed portal 1>" does not exist

Дмитрий
09.02.2017
21:36:58
если в pgAdmin то да. т.к. в одном конекшене
и после каждого выполнения на единицу увеличивается
открой новый конекшен и выполни

I
09.02.2017
21:38:09
э, еще один коннекшен из руби? зачем?

Дмитрий
09.02.2017
21:38:32
из руби нет

I
09.02.2017
21:38:38
я из руби запускаю)

Дмитрий
09.02.2017
21:38:46
ааа

Admin
ERROR: S client not available

I
09.02.2017
21:39:01
надо conn.transaction
https://github.com/ged/ruby-pg/blob/master/sample/cursor.rbhttps://github.com/ged/ruby-pg/blob/master/sample/cursor.rb

Дмитрий
09.02.2017
21:49:51
круто!!!спасибо!
только как получить количество unnamed portal?
которое возвращает хранимка

I
09.02.2017
21:50:59
какой именно сейчас?
я вот смотрю на то, что там возвращается в exec функции
там возвращаются 3 портала как раз
p conn.exec("select test_user_fun(1)").to_a

Дмитрий
09.02.2017
21:52:41
ruby у меня пока примитивный

I
09.02.2017
21:53:09
да ничего страшного
а почему руби, кстати?

Google

I
09.02.2017
21:53:13
а не тот же питон

Дмитрий
09.02.2017
21:57:46
изучать начал два года назад, применить негде
понравился язык
require 'pg'
query = «~QUERY
SELECT dbo.test_get_users(1);
QUERY
conn = PG.connect(:dbname => 'rev_1604',:user => 'postgres', :password => 'postgres', :host => 'localhost')
conn.transaction do
portals = conn.exec(query).to_a
portals.each do |n|
conn.exec("FETCH ALL IN \"#{n['test_get_users']}\";").each do |res|
puts res
end
end
end
типа такого получается

I
09.02.2017
22:04:25
да, работает?

Дмитрий
09.02.2017
22:04:32
да
все выводит

I
09.02.2017
22:04:39
ну и хорошо)

Дмитрий
09.02.2017
22:05:15
?
где плюсик поставить?

I
09.02.2017
22:05:45
нигде, тут нет кармаботов)
обращайся, если что-то еще понадобится)

Дмитрий
09.02.2017
22:06:12
ок, спасибо! Теперь можно и спать

Алексей
10.02.2017
06:31:07

Alexander
10.02.2017
06:32:32
Твоё лицо, когда дропнул базу на проде

Алексей
10.02.2017
06:32:43

Alex
10.02.2017
06:32:58

Alexander
10.02.2017
06:33:35
Какое у Йорика лицо было не знаю

Алексей
10.02.2017
06:34:09