powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Возвращение record set-а из хранимой процедуры TSQL
23 сообщений из 23, страница 1 из 1
Возвращение record set-а из хранимой процедуры TSQL
    #33618647
Фотография Ursego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если хранимая процедура возвращает 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!
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33618688
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
Но в случае delete второй резалтсет пустой.
Клиент получив (или отменив) первый резалсет посылает на сервер команду "отдавай следующий" и тогда замороженая хранимая процедура продолжит работу. Любая другая sql команда отменит работу ХП сразу после первого select.
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33618694
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так и есть. Причем в PowerBuilder, к примеру, ДВ основанное на ХП не
способно получать несколько резалтсетов, оно может получить заданный по
номеру, все стоящие перед ним будут игнорированы, а ПБ получив нужный
заканчивает выполнение ХП. Не очень приятное поведение ДВ, но ничего не
поделаешь. Так что в данном вопросе все в основном зависит от клиента.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33618697
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВообще-то, такие вещи делать не рекомендуется.


Это почему это ? Кем не рекомендуется ? Ничем это не запрещено и не ограничено, ничего плохого не сулит. ASE (и MSSQL ) тем и хороши, что позволяют в любом месте выполнять любые операторы TSQL в любом количестве. Множество любых DML можно выполнять в любом месте и в любом сочетании.
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33618699
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UrsegoЕсли хранимая процедура возвращает record set, могу ли я добавить SQL statement (DELETE, не SELECT) после SELECT-а, возвращающего record set?


Можешь. Можешь добавить даже не только DELETE, но и INSERT или UPDATE, или даже еще один SELECT, который формирует еще один record set.
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33618705
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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-комманда на клиенте ?
Я не понял .
А клиент может , обработав первый набор, сделать только одну из двух вещей :

Попросить следующий набор данных

либо отказаться от следующего набора.

В любом случае все будет работать.

А вот если он зависнет как красная девица в восторженном ожидании непонятно чего -- это ошибка программирования клиента. Такого быть не должно.
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33618710
Фотография Ursego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем. Я поговорил с нашими девелоперами - это обычная практика (клиент - PowerBuilder), мне показали работающий пример. Дело в том, что record set формирует только SELECT, выполненный "в никуда" (т.е. без INTO). А команды DML возвращают лишь код удачи/неудачи, который не выходит за предели процедуры (а может быть проверен лишь внутри неё).
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33618713
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer
Так и есть. Причем в PowerBuilder, к примеру, ДВ основанное на ХП не
способно получать несколько резалтсетов, оно может получить заданный по
номеру, все стоящие перед ним будут игнорированы, а ПБ получив нужный
заканчивает выполнение ХП. Не очень приятное поведение ДВ, но ничего не
поделаешь.


Поясню: ДВ - это Data Window, грид, в котором показывается набор данных.

А вот если подумать, то окажется что такое неприятное поведение PowerBuilder или того же Delphi на самом деле - единственно возможное поведение. Что Дельфям делать с ТРЕМЯ таблицами ? Одну он в грид засунет, а где ему несколько гридов брать ? Для того, чтобы несколько наборов обработать, надо иметь какую-то логику программную, а создатели RAD хотят описать все исключительно метаданными, без такой логики. Так что им несколько таблиц просто некуда засунуть ...
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33618715
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати забыл сказать. Лучше еще ставить
set nocount on в начале таких процедур. Почему - долго объяснять...
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33618739
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНет, в первом случае не будет второго набора.
Пустой набор - это набор колонок но без записей. А тут не будет даже набора колонок.Набора колонок не будет, а резалтсет будет. Ну вот такой странный резалтсет :) А как еще назвать-то?
Если например клиент пишется на ODBC, то в приведеном примере команда delete не будет выполнена пока клиент не скомандует SQLMoreResults(hStmt);

MasterZiv White OwlЛюбая другая sql команда отменит работу ХП сразу после первого select.Что означает второе предложение ? Какая -такая SQL-комманда на клиенте ?ээээ... это я с isql cмешал :) Оно автоматом сбрасывает все невыбраные резалтсеты если дашь любую команду кроме resume.

MasterZivА вот если он зависнет как красная девица в восторженном ожидании непонятно чего -- это ошибка программирования клиента. Такого быть не должно."Вообще-то, такие вещи делать не рекомендуется." :)
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33619317
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Поясню: ДВ - это Data Window, грид, в котором показывается набор данных.
А вот если подумать, то окажется что такое неприятное поведение PowerBuilder или того же Delphi на самом деле - единственно возможное поведение. Что Дельфям делать с ТРЕМЯ таблицами ? Одну он в грид засунет, а где ему несколько гридов брать ? Для того, чтобы несколько наборов обработать, надо иметь какую-то логику программную, а создатели RAD хотят описать все исключительно метаданными, без такой логики. Так что им несколько таблиц просто некуда засунуть ...
ДВ это не датагрид, точнее не только датагрид, это объект, в котором реализованы механизмы работы с БД. И когда в ДВ настроено, получить 3-ий резалтсет из ХП такой-то, то при комманде ретрив ПБ делает следующее: запускает ХП, открывает курсор, получает некие данные(возможно даже и не получает, это известно только разработчикам ПБ), закрывает курсор, повторяет открытие и закрытие курсора пока не доберется до нужного резалтсета, а потом, самое интересное, получив нужный заканчивает работу с процедурой. Просто закрывает ее и все. И что тут невозможного, реализовать тупое открытие-закрытие курсора после получения нужного резалтсета, ведь впередиидущие он же способен пропустить?! И в данном случаем алгоритм работы клиента БД написан разработчиками ПБ и обходной путь единственный - не использовать для выполнения такой ХП датавиндов, а вызывать ручками.
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33619408
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
"Вообще-то, такие вещи делать не рекомендуется." :)


Так не "не рекомендуется", а просто нельзя.
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33619441
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLerИ что тут невозможного, реализовать тупое открытие-закрытие курсора после получения нужного резалтсета, ведь впередиидущие он же способен пропустить?! И в данном случаем алгоритм работы клиента БД написан разработчиками ПБ и обходной путь единственный - не использовать для выполнения такой ХП датавиндов, а вызывать ручками.

Я не про это говорил. Это возможно реализовать, но НЕ НУЖНО. Потому что в RAD ты тыкаешь пальчиком в процедуру и говоришь "А покажи ка ее данные в таком гриде". Максимум что можно сделать (и как ты говоришь сделано в PB) - "А покажи ка мне третий набор данных из этой процедуры в этом гриде".

А чтобы сказать " а покажи ка мне объединение первого, второго, и , если соблюдаются такие-то условия, пятого, а иначе, шестого набора в этом вот гриде, причем недостающие колонки надо заполнять так-то и так-то" нужно писать программу, а не пальчиком тыкать. Задача же разработчиков RAD - дать возможность тыкать пальчиком. А программу ты всегда сам можешь написать...
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33619520
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
А чтобы сказать " а покажи ка мне объединение первого, второго, и , если соблюдаются такие-то условия, пятого, а иначе, шестого набора в этом вот гриде, причем недостающие колонки надо заполнять так-то и так-то" нужно писать программу, а не пальчиком тыкать. Задача же разработчиков RAD - дать возможность тыкать пальчиком. А программу ты всегда сам можешь написать...
Это все понятно, я просто сказал автору, что нужно обращать внимание на алгоритм работы с такими процедурами. И в качестве примера описал механизм работы ДВ с ХП, который не позволяет выполнять код ХП после получения требуемого набора. А то я очень долго ломал себе голову, пока экпериментальным путем не установил как работает ретрив ДВ основанным на ХП.
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33621929
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer, что там кому чего не позволяет ? Я не понял.
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33624792
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К примеру у нас есть хп:
begin
....
select * from ...
delete from ...
select * from ...
update table..
end
Так вот, если в PB создать ДВ основанное на этой ХП, и указать что надо
брать данные 2-го резалтсета, то все прекрасно работает, за исключением того
, что update не выполняется. Т.е. данные возвращенные 2-м селектом в ДВ
попадают, но хп дальше этого селекта не выполняется.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33624859
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer
Так вот, если в PB создать ДВ основанное на этой ХП, и указать что надо
брать данные 2-го резалтсета, то все прекрасно работает, за исключением того, что update не выполняется. Т.е. данные возвращенные 2-м селектом в ДВ попадают, но хп дальше этого селекта не выполняется.


Быть такого не может. Если это так, то PB надо срочно выкидывать на помойку как редчайший отстой. Повторяюсь - ЕСЛИ ЭТО ТАК.

Может сами чего нахимичили ?
В процедурах стоит set nocount on ?

Кроме того, и вообще такого быть не может, может быть что выполнение приостанавливается, но чтобы совсем дальше не выполнялось -- вообще быть не может. Механизмов таких нету.
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33624863
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivКроме того, и вообще такого быть не может, может быть что выполнение приостанавливается, но чтобы совсем дальше не выполнялось -- вообще быть не может. Механизмов таких нету.
Почему нету? Есть.
Если клиент считает что он все выбрал уже, он может закрыть стейтмент в любой момент. PB выбрал все что считает нужным (SQLFetch(hStmt) вернул SQL_NO_DATA). И значит все, можно закрывать курсор. А закрыт он через SQLCloseCursor(hStmt) или через SQLCancel(hStmt), на одно-резалтсетном запросе роли не играет :)
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33624865
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЕсли клиент считает что он все выбрал уже, он может закрыть стейтмент в любой момент. PB выбрал все что считает нужным (SQLFetch(hStmt) вернул SQL_NO_DATA). И значит все, можно закрывать курсор.

Ну так если он этот "курсор" закроет, то сервер автоматом дальше пойдет. Сервер может висеть только на неотосланных данных.
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33625477
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именно так ПБ и делает. ASCRUS проверить может, но мне кажется он в курсе,
что так оно и есть.
Процедура сама по себе дальше не бежит, если клиент не разрешит это. А
клиент в состоянии сказать чтобы процедура завершилась, не проверяя есть ли
на сервере еще данные к получению.
Поэтому и говорю, что такое поведение ПБ неприятно.)
P.S.: Не знаю как в ASE, но в ASA именно такой эффект.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33626103
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Говорю еще раз - такого быть не может. Если это так, то надо писать в Sybase по какому-то конкретному поводу, жаловаться на жизнь и открывать CASE-ы. Ибо это баг.
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33626167
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivГоворю еще раз - такого быть не может. Если это так, то надо писать в Sybase по какому-то конкретному поводу, жаловаться на жизнь и открывать CASE-ы. Ибо это баг.
Еще как может - проявляется для стареньких систем доступа к данным. В тех же BDE компонентах для Delphi так же, после получения курсора ASA из процедуры, прерывается ее выполнение, а в ADO компонентах процедура отрабатывает до конца. Обьясняется тем, что ASA после получения курсора из процедуры ожидает выполнения оператора RESUME, а старые компоненты (в т.ч. DW), видимо не посылают этот оператор.
...
Рейтинг: 0 / 0
Возвращение record set-а из хранимой процедуры TSQL
    #33628119
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv White OwlЕсли клиент считает что он все выбрал уже, он может закрыть стейтмент в любой момент. PB выбрал все что считает нужным (SQLFetch(hStmt) вернул SQL_NO_DATA). И значит все, можно закрывать курсор. Ну так если он этот "курсор" закроет, то сервер автоматом дальше пойдет. Сервер может висеть только на неотосланных данных.Если клиент сказал SQLCancel(hStmt); то сервер уже никуда не пойдет :)
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Возвращение record set-а из хранимой процедуры TSQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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