Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Stored procedure & Multi Result Set / 25 сообщений из 33, страница 1 из 2
14.12.2005, 23:04
    #33436879
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
Порылся в форуме ответа не нашел, поэтому задам.
Есть некая хранимая процедура, но не простая, а хитрая. Хитрость ее
заключается в том, что в ее коде после возвращения набора происходят еще
определенные действия.
Типа такого:
begin
...
select a,b,c,
from table;
update table2
set d=f;
end;
Т.е. эта процедура что-то среднее между обычной процедурой и процедурой,
которая возвращает несколько наборов.
Так вот, делая в PB6.5 datawindow на основе этой процедуры мы можем получить
то, что она возвращает, но код написаный в ней после возвращения набора не
выполняется. Это возможно побороть не меняя версии ПБ и процедуры?


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
15.12.2005, 06:25
    #33437003
Геннадич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
База то какая?
...
Рейтинг: 0 / 0
15.12.2005, 13:36
    #33438010
Estets
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
PB + Sybase ASE и MS SQL прекрасно работают с процедурами вида

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE PROCEDURE..
AS
BEGIN
...
  SELECT a, b, c
...
  SELECT d,e,f
...
  SELECT g,h

END

С обработкой нескольких ResultSet, проверялось на 6.5 и 9.
...
Рейтинг: 0 / 0
15.12.2005, 23:06
    #33439478
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
1. База ASA9.
2. У меня набор, возвращаемой процедурой, один, но после его возвращения в
процедуре есть выполняемый код. Это не тоже самое, что два селекта.
3. Меня интересует именно вызов из datawindow. Разве можно в одно ДВ
возвращать несколько наборов?! Я так понимаю, что в ДВ можно вернуть только
один, не обязательно первый.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
16.12.2005, 06:41
    #33439632
Andyn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
А это принципиально, выполнять код после возврата результата клиенту? Если да, то имеет смысл сначала заполнить временную таблицу, выполнить все действия которые требуются и потом вернуть результат.
...
Рейтинг: 0 / 0
16.12.2005, 07:16
    #33439661
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
iLLer:
Код после SELECT работать будет, если процедуру вызывать так:
Код: plaintext
1.
SELECT *
FROM StoredProcedure()
Почему не срабатывает, при CALL - не понятно, нужно будет к ним на форум вопрос задать.
...
Рейтинг: 0 / 0
16.12.2005, 07:25
    #33439667
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
Странно, проверил в ISQL:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE PROCEDURE _Test ()
BEGIN
  SELECT *
  FROM Units;

  UPDATE Units
  SET Name = Upper(Name);
END;

CALL _Test ();
Вернулся исходный набор записей. Далее:
Код: plaintext
1.
SELECT *
FROM Units;
Все изменилось, как и полагается. После получения данных в DW с этой процедуры в PB стоит COMMIT ?
...
Рейтинг: 0 / 0
16.12.2005, 15:29
    #33441121
Estets
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
iLLer
Я так понимаю, что в ДВ можно вернуть только
один, не обязательно первый.
Дык значит обработка все-таки до второго доходит ;)

А если их ISQL вызвать эту процедуру, отработает ли update после селекта?
Хотя возможно это PB так работает при вызове именно из DW. Дождавшись нужного ResultSet-а, просто обрубает выполнение процедуры, дабы не прокачивать следующие ResultSet-ы (если они есть). Тогда можно обработать через временные таблицы

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
begin
...

select a,b,c
  into #temp
  from table;

update table2
     set d=f;

select * from into #temp;

end;
...
Рейтинг: 0 / 0
17.12.2005, 22:46
    #33442657
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
Commit естественно есть, дело не в нем, можно и в среде ПБ потестить, там
автокоммит. Из ISQL тоже все работает. Причем я пользуюсь сишной версией, и
там после получения выборки из процедуры надо делать resume, тогда процедура
бежит дальше.
Здесь именно ПБ после получения набора с требуемым номером заканчивает
выполнение процедуры. Но у меня проблема в том, что код в процедуре должен
выполняться именно после передачи набора данных клиенту и времянки не
спасут.
В клиенте, который использует ADODB, делаю после получения набора, что-то
типа NextRecordSet. Это заставляет драйвер передать комманду серверу
продолжить выполнение процедуры до следующего возвращаемого набора, а
поскольку такого больше не встречается, то процедура завершает свою работу.
А вот как такое реализовать в ПБ, и именно в DW - не знаю. Единственное что
я нашел, можно регулировать номер возвращаемого набора, который будет
использован DataWindow'ом.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
17.12.2005, 23:07
    #33442668
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
iLLerА вот как такое реализовать в ПБ, и именно в DW - не знаю.
Тебе же уже ответил тов. ASCRUS - вызывай ХП не как ХП, а с помощью SELECT-а, благо у тебя ASA9 - она это умеет.
...
Рейтинг: 0 / 0
17.12.2005, 23:15
    #33442672
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
Dim2000 как всегда спешишь - людей насмешишь...
Четко написано, что нужно выполнение определенных действий ПОСЛЕ того, как
клиент получит набор из процедуры. И действия эти прописаны в той же
процедуре. Вызов select по процедуре не даст желаемого результата, т.к.
сначала выполнится процедура, а потом данные потекут на клиента(и не факт
что там окажутся). Я на форум с глупыми вопросами не лезу.
Просто мне не понятно, почему ПБ решил рубить выполнение процедуры после
получения результата.?! Это только мне так кажется, что это неправильно, или
это на самом деле не дело?


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
18.12.2005, 07:48
    #33442741
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
iLLer
Dim2000 как всегда спешишь - людей насмешишь...
Четко написано, что нужно выполнение определенных действий ПОСЛЕ того, как
клиент получит набор из процедуры. И действия эти прописаны в той же
процедуре. Вызов select по процедуре не даст желаемого результата, т.к.
сначала выполнится процедура, а потом данные потекут на клиента(и не факт
что там окажутся). Я на форум с глупыми вопросами не лезу.
Я не очень понял хода Вашей мысли - почему это при SELECT * FROM SP() данные не потекут на клиента, не факт что там окажутся и зачем Вам так хочется, чтобы обязательно сначала PB получил данные от SELECT-а, а уж потом выполнилось UPDATE ?

P.S. И если так хочется, кто мешает SELECT и UPDATE по очереди из PB вызывать (к примеру сделать 2 ХП сделать) ?
...
Рейтинг: 0 / 0
18.12.2005, 12:21
    #33442788
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
Уважаемый ASCRUS! Я нисколько не сомневаюсь, что Вы способны реализовать данный функционал разными способами. Впрочем, как и я. Мне известны все предложенные выше варианты, но меня интересовал конкретный вопрос: можно ли, и как сделать DW на основе хп, в которой после выборки были определенные действия.
В процессе обсуждения я понял, что то что мне нужно - не реализуемо.
Теперь мой вопрос переформировался в вопрос: почему ПБ6.5 заканчивает выполнение хп после получения выборки? и так же ли ведут себя последующие версии?
P.S. Я понимаю, что на форуме так часто звучат простые вопросы, что видимо никто не вчитывается в суть вопроса, и считают что спрашивают какие-то банальности.
...
Рейтинг: 0 / 0
18.12.2005, 12:54
    #33442801
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
iLLerDim2000 как всегда спешишь - людей насмешишь...
Нет.

Четко написано, что нужно выполнение определенных действий ПОСЛЕ того, как клиент получит набор из процедуры. И действия эти прописаны в той же
процедуре.
При вызове ХП с помощью SELECT клиент и получает данные, и выполняется то, что написано в ХП после возврата набора данных. Этого вполне достаточно. Слово "ПОСЛЕ" я вижу, но не считаю его существенным.

Я на форум с глупыми вопросами не лезу.
А этот топик тогда что?

Просто мне не понятно, почему ПБ решил рубить выполнение процедуры после
получения результата.?!
Он не рубит, он получает то, что хотел, и удовлетворяется этим.
...
Рейтинг: 0 / 0
18.12.2005, 13:03
    #33442807
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
ASCRUSЯ не очень понял хода Вашей мысли - почему это при SELECT * FROM SP() данные не потекут на клиента, не факт что там окажутся и зачем Вам так хочется, чтобы обязательно сначала PB получил данные от SELECT-а, а уж потом выполнилось UPDATE ?
А оно именно так и получается.

Код: plaintext
1.
2.
3.
4.
5.
CREATE PROCEDURE "DBA"."test"()
BEGIN
    select * from dba.table_sts where code_id =  2  ;
    update dba.table_sts set code_id =  3  where code_id =  2  ;
    print '-=Procedure completed=-'
END

select * from dba.test() выдаёт 1 строку при первом запуске и 0 при последующих. Ну и чего ещё надо?
...
Рейтинг: 0 / 0
18.12.2005, 13:54
    #33442839
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
Уважаемый ASCRUS! Я нисколько не сомневаюсь, что Вы способны реализовать данный функционал разными способами. Впрочем, как и я. Мне известны все предложенные выше варианты, но меня интересовал конкретный вопрос: можно ли, и как сделать DW на основе хп, в которой после выборки были определенные действия.
В процессе обсуждения я понял, что то что мне нужно - не реализуемо.
Теперь мой вопрос переформировался в вопрос: почему ПБ6.5 заканчивает выполнение хп после получения выборки? и так же ли ведут себя последующие версии?
P.S. Я понимаю, что на форуме так часто звучат простые вопросы, что видимо никто не вчитывается в суть вопроса, и считают что спрашивают какие-то банальности.
...
Рейтинг: 0 / 0
18.12.2005, 14:08
    #33442850
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
Dim2000, прошу прощения, но мне кажется ты не прав, на счет ПОСЛЕ. Это содержится в вопросе, если тебе хочется отвечать на измененные своим воображением вопросы, то это твое право. Но это не значит, что твои ответы являются ответами на заданный мной вопрос.
И раз меня интересует ПОСЛЕ, значит я так и ставлю вопрос. И меня не интересует селект по хп. Потому что уже объяснил, что сервер выполнит сначала хп (т.е. целиком вместе с теми действиями, которые должны быть выполнены после получения набора клиенту), и только потом начнет реально передавать их клиенту.
Примерно также как с кред. карты в банкомате списываются средства после их выдачи, а не до или в процессе.
А на счет рубит - именно рубит. Кто сказал, что цель вызова хп - получить первый набор? С чего это в sybase так решили, что дальше процедуры ничего не делают? Понятное дело, не нравится - не ешь, но я тут выступаю не с целью опустить ПБ, а с целью определится, это фича или баг.
...
Рейтинг: 0 / 0
18.12.2005, 14:16
    #33442853
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
И еще, если Dim2000 очень хочется узнать для чего надо, то советую запустить вышеприведенную тестовую проц в isqlc.exe и параллельным клиентом посмотреть на содержание таблички(или попробывать запустить). Так вот, пока не выполните resume проц дальше не выполняется. А клиента пишут совсем другие люди и чтоб разграничить сферу ответственности нужно четкое разделение, это наше, это ваше. Курсор ли они забыли закрыть или еще чего - мне по фигу, раз отдал клиенту, значит мяч на их стороне, а до этого момента - на моей.
...
Рейтинг: 0 / 0
18.12.2005, 15:43
    #33442890
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
iLLerDim2000, прошу прощения, но мне кажется ты не прав, на счет ПОСЛЕ. Это содержится в вопросе, если тебе хочется отвечать на измененные своим воображением вопросы, то это твое право.
Я, как сервер, переписываю запросы в своём воображении .
Потому что уже объяснил, что сервер выполнит сначала хп (т.е. целиком вместе с теми действиями, которые должны быть выполнены после получения набора клиенту), и только потом начнет реально передавать их клиенту.
Возможно. Но с точки зрения конечного результата это не имеет значения.
А на счет рубит - именно рубит. Кто сказал, что цель вызова хп - получить первый набор?
А он делает именно то, что ему сказали: получает первый набор. Если ему сказать фетчить 2-й набор - выругается, но "хвост" ХП выполнится.
С чего это в sybase так решили, что дальше процедуры ничего не делают?
А какие есть альтернативы нынешнему поведению?
Понятное дело, не нравится - не ешь, но я тут выступаю не с целью опустить ПБ, а с целью определится, это фича или баг.
IMHO - фича.
...
Рейтинг: 0 / 0
18.12.2005, 15:47
    #33442892
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
iLLerИ еще, если Dim2000 очень хочется узнать для чего надо, то советую запустить вышеприведенную тестовую проц в isqlc.exe и параллельным клиентом посмотреть на содержание таблички(или попробывать запустить). Так вот, пока не выполните resume проц дальше не выполняется.
Дык я это и так знаю ;). Но ответа на вопрос "для чего надо" я не увидел. Ну да ладно...
...
Рейтинг: 0 / 0
18.12.2005, 22:16
    #33443111
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
Вот ответ:
"А клиента пишут совсем другие люди и чтоб разграничить сферу
ответственности нужно четкое разделение, это наше, это ваше. Курсор ли они
забыли закрыть или еще чего - мне по фигу, раз отдал клиенту, значит мяч на
их стороне, а до этого момента - на моей."
Расшифровываю:
Чтобы точно было известно, что клиентский софт такой-то, во столько-то, с
такого-то адреса получил такую-то выборку. А вот зачем нужно именно это
знать - уже в данном вопросе не важно. Бывает, что эта информация важна и
точка.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
19.12.2005, 06:35
    #33443282
Andyn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
А если попробовать это протоколирование вынести в отдельную процедуру и делаеть ее вызов в основной после выборки данных, типа как POST EVENT в PowerBuilder? Может прокатит?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
begin
...
select a,b,c,
from table;

call update_proc();

end;
...
Рейтинг: 0 / 0
19.12.2005, 10:09
    #33443467
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
Нет, не поможет. Управление на после-селект не доходит, и там не важно какие
действия совершаются... Нужно менять способ вызова, без DW.
У меня один вопрос остался, на следующих ПБ, после 6.5 такая же ситуация?


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
19.12.2005, 10:17
    #33443479
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
И все таки я хоть убей не могу понять, чем в ХП SELECT, UPDATE отличается от UPDATE, SELECT с точки зрения вызова ХП с клиентской части (PB или еще чего). Мне кажется Вы просто ищете проблемы на ровном месте. Потому как:
авторЧтобы точно было известно, что клиентский софт такой-то, во столько-то, с
такого-то адреса получил такую-то выборку. А вот зачем нужно именно это
знать - уже в данном вопросе не важно. Бывает, что эта информация важна и
точка.
Если он ее не получит, будет сделан ROLLBACK и UPDATE, который был сделан перед SELECT-ом откатиться, что будет означать, что клиент не получил выборку, что и было не зафиксированно. И это будет абсолютно правильно с точки зрения транзакций. А вот как раз то, что Вы пытаетесь сделать и есть не правильно, так как клиент может получить выборку и прервать выполнение процедуры, сделав до кучи ROLLBACK, таким образом выборку он получит, а на сервере это не зафиксируется.
...
Рейтинг: 0 / 0
19.12.2005, 18:43
    #33445062
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored procedure & Multi Result Set
iLLer
Нет, не поможет. Управление на после-селект не доходит, и там не важно какие
действия совершаются... Нужно менять способ вызова, без DW.
У меня один вопрос остался, на следующих ПБ, после 6.5 такая же ситуация?

Безусловно, а как может быть иначе?
Если вы делаете DW основанное на хранимой процедуре - ваша ЕДИНСТВЕННАЯ цель - получить result set .
Если вы хотите, чтоб ваша ХП совершала ДЕЙСТВИЯ, а не возвращала result set - ЗОВИТЕ её, а не стройте DW на ней.
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Stored procedure & Multi Result Set / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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