Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
Если хранимая процедура возвращает record set, могу ли я добавить SQL statement (DELETE, не SELECT) после SELECT-а, возвращающего record set? Т.е. было так: SELECT bla-bla-bla… <return result> GO // the end of proc А должно стать так: SELECT bla-bla-bla… <return result> DELETE bla-bla-bla… GO // the end of proc Речь об ASE 15. ThanX! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2006, 22:16 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
Вообще-то, такие вещи делать не рекомендуется. При ооооочень большом желании можно, но сложно. Главное чтобы клиент умел принимать множественные резалтсеты из хранимой процедуры. SELECT bla-bla-bla… <return result> DELETE bla-bla-bla… GO // the end of proc практически равнозначно SELECT bla-bla-bla… <return result> SELECT tra-ta-ta… <return second result> GO // the end of proc Но в случае delete второй резалтсет пустой. Клиент получив (или отменив) первый резалсет посылает на сервер команду "отдавай следующий" и тогда замороженая хранимая процедура продолжит работу. Любая другая sql команда отменит работу ХП сразу после первого select. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2006, 23:20 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
Так и есть. Причем в PowerBuilder, к примеру, ДВ основанное на ХП не способно получать несколько резалтсетов, оно может получить заданный по номеру, все стоящие перед ним будут игнорированы, а ПБ получив нужный заканчивает выполнение ХП. Не очень приятное поведение ДВ, но ничего не поделаешь. Так что в данном вопросе все в основном зависит от клиента. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2006, 23:26 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
White OwlВообще-то, такие вещи делать не рекомендуется. Это почему это ? Кем не рекомендуется ? Ничем это не запрещено и не ограничено, ничего плохого не сулит. ASE (и MSSQL ) тем и хороши, что позволяют в любом месте выполнять любые операторы TSQL в любом количестве. Множество любых DML можно выполнять в любом месте и в любом сочетании. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2006, 23:31 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
UrsegoЕсли хранимая процедура возвращает record set, могу ли я добавить SQL statement (DELETE, не SELECT) после SELECT-а, возвращающего record set? Можешь. Можешь добавить даже не только DELETE, но и INSERT или UPDATE, или даже еще один SELECT, который формирует еще один record set. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2006, 23:33 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
White OwlГлавное чтобы клиент умел принимать множественные резалтсеты из хранимой процедуры. А он всегда должен уметь. Иначе он неправильно написан, не по спецификации (есть некий алгоритм работы, предписываемый для реализации в клиенте). А тогда он вообще не будет работать правильно. Так что множественные наборы данных можно формировать всегда. Возможно, некоторые клиенты (как то Delphi в ранних версиях) не будут видеть наборы данных кроме первого, но работать при этом они ДОЛЖНЫ, иначе они просто написаны с ошибкой. White Owl SELECT bla-bla-bla… <return result> DELETE bla-bla-bla… GO // the end of proc практически равнозначно SELECT bla-bla-bla… <return result> SELECT tra-ta-ta… <return second result> GO // the end of proc Ничего не равнозначно. В первом случае один набор данных, во втором - два. White Owl Но в случае delete второй резалтсет пустой. Нет, в первом случае не будет второго набора. Пустой набор - это набор колонок но без записей. А тут не будет даже набора колонок. White Owl Клиент получив (или отменив) первый резалсет посылает на сервер команду "отдавай следующий" и тогда замороженая хранимая процедура продолжит работу. Любая другая sql команда отменит работу ХП сразу после первого select. Что означает второе предложение ? Какая -такая SQL-комманда на клиенте ? Я не понял . А клиент может , обработав первый набор, сделать только одну из двух вещей : Попросить следующий набор данных либо отказаться от следующего набора. В любом случае все будет работать. А вот если он зависнет как красная девица в восторженном ожидании непонятно чего -- это ошибка программирования клиента. Такого быть не должно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2006, 23:44 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
Спасибо всем. Я поговорил с нашими девелоперами - это обычная практика (клиент - PowerBuilder), мне показали работающий пример. Дело в том, что record set формирует только SELECT, выполненный "в никуда" (т.е. без INTO). А команды DML возвращают лишь код удачи/неудачи, который не выходит за предели процедуры (а может быть проверен лишь внутри неё). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2006, 23:48 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
iLLer Так и есть. Причем в PowerBuilder, к примеру, ДВ основанное на ХП не способно получать несколько резалтсетов, оно может получить заданный по номеру, все стоящие перед ним будут игнорированы, а ПБ получив нужный заканчивает выполнение ХП. Не очень приятное поведение ДВ, но ничего не поделаешь. Поясню: ДВ - это Data Window, грид, в котором показывается набор данных. А вот если подумать, то окажется что такое неприятное поведение PowerBuilder или того же Delphi на самом деле - единственно возможное поведение. Что Дельфям делать с ТРЕМЯ таблицами ? Одну он в грид засунет, а где ему несколько гридов брать ? Для того, чтобы несколько наборов обработать, надо иметь какую-то логику программную, а создатели RAD хотят описать все исключительно метаданными, без такой логики. Так что им несколько таблиц просто некуда засунуть ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2006, 23:51 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
Кстати забыл сказать. Лучше еще ставить set nocount on в начале таких процедур. Почему - долго объяснять... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2006, 23:52 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
MasterZivНет, в первом случае не будет второго набора. Пустой набор - это набор колонок но без записей. А тут не будет даже набора колонок.Набора колонок не будет, а резалтсет будет. Ну вот такой странный резалтсет :) А как еще назвать-то? Если например клиент пишется на ODBC, то в приведеном примере команда delete не будет выполнена пока клиент не скомандует SQLMoreResults(hStmt); MasterZiv White OwlЛюбая другая sql команда отменит работу ХП сразу после первого select.Что означает второе предложение ? Какая -такая SQL-комманда на клиенте ?ээээ... это я с isql cмешал :) Оно автоматом сбрасывает все невыбраные резалтсеты если дашь любую команду кроме resume. MasterZivА вот если он зависнет как красная девица в восторженном ожидании непонятно чего -- это ошибка программирования клиента. Такого быть не должно."Вообще-то, такие вещи делать не рекомендуется." :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2006, 00:43 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
MasterZiv Поясню: ДВ - это Data Window, грид, в котором показывается набор данных. А вот если подумать, то окажется что такое неприятное поведение PowerBuilder или того же Delphi на самом деле - единственно возможное поведение. Что Дельфям делать с ТРЕМЯ таблицами ? Одну он в грид засунет, а где ему несколько гридов брать ? Для того, чтобы несколько наборов обработать, надо иметь какую-то логику программную, а создатели RAD хотят описать все исключительно метаданными, без такой логики. Так что им несколько таблиц просто некуда засунуть ... ДВ это не датагрид, точнее не только датагрид, это объект, в котором реализованы механизмы работы с БД. И когда в ДВ настроено, получить 3-ий резалтсет из ХП такой-то, то при комманде ретрив ПБ делает следующее: запускает ХП, открывает курсор, получает некие данные(возможно даже и не получает, это известно только разработчикам ПБ), закрывает курсор, повторяет открытие и закрытие курсора пока не доберется до нужного резалтсета, а потом, самое интересное, получив нужный заканчивает работу с процедурой. Просто закрывает ее и все. И что тут невозможного, реализовать тупое открытие-закрытие курсора после получения нужного резалтсета, ведь впередиидущие он же способен пропустить?! И в данном случаем алгоритм работы клиента БД написан разработчиками ПБ и обходной путь единственный - не использовать для выполнения такой ХП датавиндов, а вызывать ручками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2006, 10:50 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
White OwlНабора колонок не будет, а резалтсет будет. Ну вот такой странный резалтсет :) А как еще назвать-то? Не будет резалтсета. Или ты имеешь в виду то, что в Open Client называется Result ? Ну так там все - Result. причем от DELETE бутет Result типа ROWCOUNT (number of affected rows). Но его может не быть вообще, если установить set nocount on (DONE_INPROC не посылаются в этом случае). White Owl Если например клиент пишется на ODBC, то в приведеном примере команда delete не будет выполнена пока клиент не скомандует SQLMoreResults(hStmt); Будет. Ты еще не забывай, что в пределах заполнения одного буфера обмена клиент и сервер асинхронны. Если даже будут включены DONE_INPROC, но буфер серверный не заполнится еще, то этот твой DELETE запросто выполнится со свистом. Не выполнится он только, когда от предыдущего SELECT-а еще буфер не освободился. White Owl "Вообще-то, такие вещи делать не рекомендуется." :) Так не "не рекомендуется", а просто нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2006, 11:07 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
iLLerИ что тут невозможного, реализовать тупое открытие-закрытие курсора после получения нужного резалтсета, ведь впередиидущие он же способен пропустить?! И в данном случаем алгоритм работы клиента БД написан разработчиками ПБ и обходной путь единственный - не использовать для выполнения такой ХП датавиндов, а вызывать ручками. Я не про это говорил. Это возможно реализовать, но НЕ НУЖНО. Потому что в RAD ты тыкаешь пальчиком в процедуру и говоришь "А покажи ка ее данные в таком гриде". Максимум что можно сделать (и как ты говоришь сделано в PB) - "А покажи ка мне третий набор данных из этой процедуры в этом гриде". А чтобы сказать " а покажи ка мне объединение первого, второго, и , если соблюдаются такие-то условия, пятого, а иначе, шестого набора в этом вот гриде, причем недостающие колонки надо заполнять так-то и так-то" нужно писать программу, а не пальчиком тыкать. Задача же разработчиков RAD - дать возможность тыкать пальчиком. А программу ты всегда сам можешь написать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2006, 11:12 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
MasterZiv А чтобы сказать " а покажи ка мне объединение первого, второго, и , если соблюдаются такие-то условия, пятого, а иначе, шестого набора в этом вот гриде, причем недостающие колонки надо заполнять так-то и так-то" нужно писать программу, а не пальчиком тыкать. Задача же разработчиков RAD - дать возможность тыкать пальчиком. А программу ты всегда сам можешь написать... Это все понятно, я просто сказал автору, что нужно обращать внимание на алгоритм работы с такими процедурами. И в качестве примера описал механизм работы ДВ с ХП, который не позволяет выполнять код ХП после получения требуемого набора. А то я очень долго ломал себе голову, пока экпериментальным путем не установил как работает ретрив ДВ основанным на ХП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2006, 11:30 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
iLLer, что там кому чего не позволяет ? Я не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2006, 22:57 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
К примеру у нас есть хп: begin .... select * from ... delete from ... select * from ... update table.. end Так вот, если в PB создать ДВ основанное на этой ХП, и указать что надо брать данные 2-го резалтсета, то все прекрасно работает, за исключением того , что update не выполняется. Т.е. данные возвращенные 2-м селектом в ДВ попадают, но хп дальше этого селекта не выполняется. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 22:54 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
iLLer Так вот, если в PB создать ДВ основанное на этой ХП, и указать что надо брать данные 2-го резалтсета, то все прекрасно работает, за исключением того, что update не выполняется. Т.е. данные возвращенные 2-м селектом в ДВ попадают, но хп дальше этого селекта не выполняется. Быть такого не может. Если это так, то PB надо срочно выкидывать на помойку как редчайший отстой. Повторяюсь - ЕСЛИ ЭТО ТАК. Может сами чего нахимичили ? В процедурах стоит set nocount on ? Кроме того, и вообще такого быть не может, может быть что выполнение приостанавливается, но чтобы совсем дальше не выполнялось -- вообще быть не может. Механизмов таких нету. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2006, 01:02 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
MasterZivКроме того, и вообще такого быть не может, может быть что выполнение приостанавливается, но чтобы совсем дальше не выполнялось -- вообще быть не может. Механизмов таких нету. Почему нету? Есть. Если клиент считает что он все выбрал уже, он может закрыть стейтмент в любой момент. PB выбрал все что считает нужным (SQLFetch(hStmt) вернул SQL_NO_DATA). И значит все, можно закрывать курсор. А закрыт он через SQLCloseCursor(hStmt) или через SQLCancel(hStmt), на одно-резалтсетном запросе роли не играет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2006, 01:17 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
White OwlЕсли клиент считает что он все выбрал уже, он может закрыть стейтмент в любой момент. PB выбрал все что считает нужным (SQLFetch(hStmt) вернул SQL_NO_DATA). И значит все, можно закрывать курсор. Ну так если он этот "курсор" закроет, то сервер автоматом дальше пойдет. Сервер может висеть только на неотосланных данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2006, 01:22 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
Именно так ПБ и делает. ASCRUS проверить может, но мне кажется он в курсе, что так оно и есть. Процедура сама по себе дальше не бежит, если клиент не разрешит это. А клиент в состоянии сказать чтобы процедура завершилась, не проверяя есть ли на сервере еще данные к получению. Поэтому и говорю, что такое поведение ПБ неприятно.) P.S.: Не знаю как в ASE, но в ASA именно такой эффект. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2006, 22:27 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
Говорю еще раз - такого быть не может. Если это так, то надо писать в Sybase по какому-то конкретному поводу, жаловаться на жизнь и открывать CASE-ы. Ибо это баг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2006, 00:50 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
MasterZivГоворю еще раз - такого быть не может. Если это так, то надо писать в Sybase по какому-то конкретному поводу, жаловаться на жизнь и открывать CASE-ы. Ибо это баг. Еще как может - проявляется для стареньких систем доступа к данным. В тех же BDE компонентах для Delphi так же, после получения курсора ASA из процедуры, прерывается ее выполнение, а в ADO компонентах процедура отрабатывает до конца. Обьясняется тем, что ASA после получения курсора из процедуры ожидает выполнения оператора RESUME, а старые компоненты (в т.ч. DW), видимо не посылают этот оператор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2006, 06:29 |
|
||
|
Возвращение record set-а из хранимой процедуры TSQL
|
|||
|---|---|---|---|
|
#18+
MasterZiv White OwlЕсли клиент считает что он все выбрал уже, он может закрыть стейтмент в любой момент. PB выбрал все что считает нужным (SQLFetch(hStmt) вернул SQL_NO_DATA). И значит все, можно закрывать курсор. Ну так если он этот "курсор" закроет, то сервер автоматом дальше пойдет. Сервер может висеть только на неотосланных данных.Если клиент сказал SQLCancel(hStmt); то сервер уже никуда не пойдет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2006, 19:01 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=33621929&tid=2012953]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 380ms |

| 0 / 0 |
