|
|
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
Порылся в форуме ответа не нашел, поэтому задам. Есть некая хранимая процедура, но не простая, а хитрая. Хитрость ее заключается в том, что в ее коде после возвращения набора происходят еще определенные действия. Типа такого: begin ... select a,b,c, from table; update table2 set d=f; end; Т.е. эта процедура что-то среднее между обычной процедурой и процедурой, которая возвращает несколько наборов. Так вот, делая в PB6.5 datawindow на основе этой процедуры мы можем получить то, что она возвращает, но код написаный в ней после возвращения набора не выполняется. Это возможно побороть не меняя версии ПБ и процедуры? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 23:04 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
База то какая? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 06:25 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
PB + Sybase ASE и MS SQL прекрасно работают с процедурами вида Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. С обработкой нескольких ResultSet, проверялось на 6.5 и 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 13:36 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
1. База ASA9. 2. У меня набор, возвращаемой процедурой, один, но после его возвращения в процедуре есть выполняемый код. Это не тоже самое, что два селекта. 3. Меня интересует именно вызов из datawindow. Разве можно в одно ДВ возвращать несколько наборов?! Я так понимаю, что в ДВ можно вернуть только один, не обязательно первый. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 23:06 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
А это принципиально, выполнять код после возврата результата клиенту? Если да, то имеет смысл сначала заполнить временную таблицу, выполнить все действия которые требуются и потом вернуть результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 06:41 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
iLLer: Код после SELECT работать будет, если процедуру вызывать так: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 07:16 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
Странно, проверил в ISQL: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 07:25 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
iLLer Я так понимаю, что в ДВ можно вернуть только один, не обязательно первый. Дык значит обработка все-таки до второго доходит ;) А если их ISQL вызвать эту процедуру, отработает ли update после селекта? Хотя возможно это PB так работает при вызове именно из DW. Дождавшись нужного ResultSet-а, просто обрубает выполнение процедуры, дабы не прокачивать следующие ResultSet-ы (если они есть). Тогда можно обработать через временные таблицы Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 15:29 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
Commit естественно есть, дело не в нем, можно и в среде ПБ потестить, там автокоммит. Из ISQL тоже все работает. Причем я пользуюсь сишной версией, и там после получения выборки из процедуры надо делать resume, тогда процедура бежит дальше. Здесь именно ПБ после получения набора с требуемым номером заканчивает выполнение процедуры. Но у меня проблема в том, что код в процедуре должен выполняться именно после передачи набора данных клиенту и времянки не спасут. В клиенте, который использует ADODB, делаю после получения набора, что-то типа NextRecordSet. Это заставляет драйвер передать комманду серверу продолжить выполнение процедуры до следующего возвращаемого набора, а поскольку такого больше не встречается, то процедура завершает свою работу. А вот как такое реализовать в ПБ, и именно в DW - не знаю. Единственное что я нашел, можно регулировать номер возвращаемого набора, который будет использован DataWindow'ом. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2005, 22:46 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
iLLerА вот как такое реализовать в ПБ, и именно в DW - не знаю. Тебе же уже ответил тов. ASCRUS - вызывай ХП не как ХП, а с помощью SELECT-а, благо у тебя ASA9 - она это умеет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2005, 23:07 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
Dim2000 как всегда спешишь - людей насмешишь... Четко написано, что нужно выполнение определенных действий ПОСЛЕ того, как клиент получит набор из процедуры. И действия эти прописаны в той же процедуре. Вызов select по процедуре не даст желаемого результата, т.к. сначала выполнится процедура, а потом данные потекут на клиента(и не факт что там окажутся). Я на форум с глупыми вопросами не лезу. Просто мне не понятно, почему ПБ решил рубить выполнение процедуры после получения результата.?! Это только мне так кажется, что это неправильно, или это на самом деле не дело? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2005, 23:15 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
iLLer Dim2000 как всегда спешишь - людей насмешишь... Четко написано, что нужно выполнение определенных действий ПОСЛЕ того, как клиент получит набор из процедуры. И действия эти прописаны в той же процедуре. Вызов select по процедуре не даст желаемого результата, т.к. сначала выполнится процедура, а потом данные потекут на клиента(и не факт что там окажутся). Я на форум с глупыми вопросами не лезу. Я не очень понял хода Вашей мысли - почему это при SELECT * FROM SP() данные не потекут на клиента, не факт что там окажутся и зачем Вам так хочется, чтобы обязательно сначала PB получил данные от SELECT-а, а уж потом выполнилось UPDATE ? P.S. И если так хочется, кто мешает SELECT и UPDATE по очереди из PB вызывать (к примеру сделать 2 ХП сделать) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2005, 07:48 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
Уважаемый ASCRUS! Я нисколько не сомневаюсь, что Вы способны реализовать данный функционал разными способами. Впрочем, как и я. Мне известны все предложенные выше варианты, но меня интересовал конкретный вопрос: можно ли, и как сделать DW на основе хп, в которой после выборки были определенные действия. В процессе обсуждения я понял, что то что мне нужно - не реализуемо. Теперь мой вопрос переформировался в вопрос: почему ПБ6.5 заканчивает выполнение хп после получения выборки? и так же ли ведут себя последующие версии? P.S. Я понимаю, что на форуме так часто звучат простые вопросы, что видимо никто не вчитывается в суть вопроса, и считают что спрашивают какие-то банальности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2005, 12:21 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
iLLerDim2000 как всегда спешишь - людей насмешишь... Нет. Четко написано, что нужно выполнение определенных действий ПОСЛЕ того, как клиент получит набор из процедуры. И действия эти прописаны в той же процедуре. При вызове ХП с помощью SELECT клиент и получает данные, и выполняется то, что написано в ХП после возврата набора данных. Этого вполне достаточно. Слово "ПОСЛЕ" я вижу, но не считаю его существенным. Я на форум с глупыми вопросами не лезу. А этот топик тогда что? Просто мне не понятно, почему ПБ решил рубить выполнение процедуры после получения результата.?! Он не рубит, он получает то, что хотел, и удовлетворяется этим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2005, 12:54 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
ASCRUSЯ не очень понял хода Вашей мысли - почему это при SELECT * FROM SP() данные не потекут на клиента, не факт что там окажутся и зачем Вам так хочется, чтобы обязательно сначала PB получил данные от SELECT-а, а уж потом выполнилось UPDATE ? А оно именно так и получается. Код: plaintext 1. 2. 3. 4. 5. select * from dba.test() выдаёт 1 строку при первом запуске и 0 при последующих. Ну и чего ещё надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2005, 13:03 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
Уважаемый ASCRUS! Я нисколько не сомневаюсь, что Вы способны реализовать данный функционал разными способами. Впрочем, как и я. Мне известны все предложенные выше варианты, но меня интересовал конкретный вопрос: можно ли, и как сделать DW на основе хп, в которой после выборки были определенные действия. В процессе обсуждения я понял, что то что мне нужно - не реализуемо. Теперь мой вопрос переформировался в вопрос: почему ПБ6.5 заканчивает выполнение хп после получения выборки? и так же ли ведут себя последующие версии? P.S. Я понимаю, что на форуме так часто звучат простые вопросы, что видимо никто не вчитывается в суть вопроса, и считают что спрашивают какие-то банальности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2005, 13:54 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
Dim2000, прошу прощения, но мне кажется ты не прав, на счет ПОСЛЕ. Это содержится в вопросе, если тебе хочется отвечать на измененные своим воображением вопросы, то это твое право. Но это не значит, что твои ответы являются ответами на заданный мной вопрос. И раз меня интересует ПОСЛЕ, значит я так и ставлю вопрос. И меня не интересует селект по хп. Потому что уже объяснил, что сервер выполнит сначала хп (т.е. целиком вместе с теми действиями, которые должны быть выполнены после получения набора клиенту), и только потом начнет реально передавать их клиенту. Примерно также как с кред. карты в банкомате списываются средства после их выдачи, а не до или в процессе. А на счет рубит - именно рубит. Кто сказал, что цель вызова хп - получить первый набор? С чего это в sybase так решили, что дальше процедуры ничего не делают? Понятное дело, не нравится - не ешь, но я тут выступаю не с целью опустить ПБ, а с целью определится, это фича или баг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2005, 14:08 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
И еще, если Dim2000 очень хочется узнать для чего надо, то советую запустить вышеприведенную тестовую проц в isqlc.exe и параллельным клиентом посмотреть на содержание таблички(или попробывать запустить). Так вот, пока не выполните resume проц дальше не выполняется. А клиента пишут совсем другие люди и чтоб разграничить сферу ответственности нужно четкое разделение, это наше, это ваше. Курсор ли они забыли закрыть или еще чего - мне по фигу, раз отдал клиенту, значит мяч на их стороне, а до этого момента - на моей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2005, 14:16 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
iLLerDim2000, прошу прощения, но мне кажется ты не прав, на счет ПОСЛЕ. Это содержится в вопросе, если тебе хочется отвечать на измененные своим воображением вопросы, то это твое право. Я, как сервер, переписываю запросы в своём воображении . Потому что уже объяснил, что сервер выполнит сначала хп (т.е. целиком вместе с теми действиями, которые должны быть выполнены после получения набора клиенту), и только потом начнет реально передавать их клиенту. Возможно. Но с точки зрения конечного результата это не имеет значения. А на счет рубит - именно рубит. Кто сказал, что цель вызова хп - получить первый набор? А он делает именно то, что ему сказали: получает первый набор. Если ему сказать фетчить 2-й набор - выругается, но "хвост" ХП выполнится. С чего это в sybase так решили, что дальше процедуры ничего не делают? А какие есть альтернативы нынешнему поведению? Понятное дело, не нравится - не ешь, но я тут выступаю не с целью опустить ПБ, а с целью определится, это фича или баг. IMHO - фича. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2005, 15:43 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
iLLerИ еще, если Dim2000 очень хочется узнать для чего надо, то советую запустить вышеприведенную тестовую проц в isqlc.exe и параллельным клиентом посмотреть на содержание таблички(или попробывать запустить). Так вот, пока не выполните resume проц дальше не выполняется. Дык я это и так знаю ;). Но ответа на вопрос "для чего надо" я не увидел. Ну да ладно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2005, 15:47 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
Вот ответ: "А клиента пишут совсем другие люди и чтоб разграничить сферу ответственности нужно четкое разделение, это наше, это ваше. Курсор ли они забыли закрыть или еще чего - мне по фигу, раз отдал клиенту, значит мяч на их стороне, а до этого момента - на моей." Расшифровываю: Чтобы точно было известно, что клиентский софт такой-то, во столько-то, с такого-то адреса получил такую-то выборку. А вот зачем нужно именно это знать - уже в данном вопросе не важно. Бывает, что эта информация важна и точка. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2005, 22:16 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
А если попробовать это протоколирование вынести в отдельную процедуру и делаеть ее вызов в основной после выборки данных, типа как POST EVENT в PowerBuilder? Может прокатит? Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2005, 06:35 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
Нет, не поможет. Управление на после-селект не доходит, и там не важно какие действия совершаются... Нужно менять способ вызова, без DW. У меня один вопрос остался, на следующих ПБ, после 6.5 такая же ситуация? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2005, 10:09 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
И все таки я хоть убей не могу понять, чем в ХП SELECT, UPDATE отличается от UPDATE, SELECT с точки зрения вызова ХП с клиентской части (PB или еще чего). Мне кажется Вы просто ищете проблемы на ровном месте. Потому как: авторЧтобы точно было известно, что клиентский софт такой-то, во столько-то, с такого-то адреса получил такую-то выборку. А вот зачем нужно именно это знать - уже в данном вопросе не важно. Бывает, что эта информация важна и точка. Если он ее не получит, будет сделан ROLLBACK и UPDATE, который был сделан перед SELECT-ом откатиться, что будет означать, что клиент не получил выборку, что и было не зафиксированно. И это будет абсолютно правильно с точки зрения транзакций. А вот как раз то, что Вы пытаетесь сделать и есть не правильно, так как клиент может получить выборку и прервать выполнение процедуры, сделав до кучи ROLLBACK, таким образом выборку он получит, а на сервере это не зафиксируется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2005, 10:17 |
|
||
|
Stored procedure & Multi Result Set
|
|||
|---|---|---|---|
|
#18+
iLLer Нет, не поможет. Управление на после-селект не доходит, и там не важно какие действия совершаются... Нужно менять способ вызова, без DW. У меня один вопрос остался, на следующих ПБ, после 6.5 такая же ситуация? Безусловно, а как может быть иначе? Если вы делаете DW основанное на хранимой процедуре - ваша ЕДИНСТВЕННАЯ цель - получить result set . Если вы хотите, чтоб ваша ХП совершала ДЕЙСТВИЯ, а не возвращала result set - ЗОВИТЕ её, а не стройте DW на ней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2005, 18:43 |
|
||
|
|

start [/forum/topic.php?fid=15&msg=33442788&tid=1337965]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 200ms |
| total: | 350ms |

| 0 / 0 |
