Есть ли в ФБ аналог Returning?
Есть ли в ФБ аналог Returning?
Собственно, задача чуть шире, чем сформулирована тема: можно ли сформировать вложенный запрос так, чтобы выдать наружу, например, число измененных/удаленных записей, или список обновленных ключей или что-то подобное?
Пример: я хочу при удалении части записей вносить в некий лог количество удаленний, скажем, так:
INSERT INTO LOG (DEL_NUM) VALUES
--а вот тут собственно то, что хочется:
(DELETE ..... RETURNS COUNT);
Или скажем так:
INSERT INTO LOG (UPDATED_ID) VALUES
--а тут вносим ключи всех обновленных записей
(UPDATE MYTABLE ..... RETURNS MYTABLE_ID);
Вопрос ведь в том, что через ODBC можно вернуть количество записей, затронутых insert/update/delete, а тут я способа не нашел...
Еще вопрос: почему в ФБ не работает запись нескольких стейтментов одной строкой в prepared statement (пробовал в FIB Plus)?
Пример: я хочу при удалении части записей вносить в некий лог количество удаленний, скажем, так:
INSERT INTO LOG (DEL_NUM) VALUES
--а вот тут собственно то, что хочется:
(DELETE ..... RETURNS COUNT);
Или скажем так:
INSERT INTO LOG (UPDATED_ID) VALUES
--а тут вносим ключи всех обновленных записей
(UPDATE MYTABLE ..... RETURNS MYTABLE_ID);
Вопрос ведь в том, что через ODBC можно вернуть количество записей, затронутых insert/update/delete, а тут я способа не нашел...
Еще вопрос: почему в ФБ не работает запись нескольких стейтментов одной строкой в prepared statement (пробовал в FIB Plus)?
на сервере такое можно сделать только в FB. посмотри release notes на 1.5, там что-то вроде row_count или rows_affected есть. Сначала выполняешь оператор, потом проверяешь эту переменную на предмет числа обработанных записей.
В общем то, так делает любой сервер. то есть, он никогда не выполняет 2 оператора SQL одновременно. Другое дело, что у ряда серверов клиентская часть позволяет запихнуть одним махом несколько запросов на сервер.
потому что несколько операторов ЭТО СКРИПТ. в IB/FB все операторы выполняются с клиента только ПОШТУЧНО. Скрипты выполняются программами, которые парсят строки и закидывают в сервер операторы по одному.Еще вопрос: почему в ФБ не работает запись нескольких стейтментов одной строкой в prepared statement (пробовал в FIB Plus)?
В общем то, так делает любой сервер. то есть, он никогда не выполняет 2 оператора SQL одновременно. Другое дело, что у ряда серверов клиентская часть позволяет запихнуть одним махом несколько запросов на сервер.
-
- Заслуженный разработчик
- Сообщения: 644
- Зарегистрирован: 15 фев 2005, 11:34
Можно написать, например, такую обертку
потом на клиенте
select* from del_with_count (some_param)
Код: Выделить всё
CREATE PROCEDURE del_with_count(
my_param INTEGER)
RETURNS (
NUMBER INTEGER)
AS
DECLARE VARIABLE N INTEGER;
begin
select count(*)
from my_table
where some_field = :my_param
into number;
if (number > 0) then
delete
from my_table
where some_field = :my_param;
suspend;
end
select* from del_with_count (some_param)
Спасибо, в принципе, близко к тому что нужно. Тогда вопрос:
По сути, как я понял, во втором примере я получаю число записей косвенно (другим запросом). Что произойдет, если МЕЖДУ этими двумя запросами (select/delete) кто-то выполнит изменение базы?
Т.е. это уже не столь принципиально, но просто интересно.
По сути, как я понял, во втором примере я получаю число записей косвенно (другим запросом). Что произойдет, если МЕЖДУ этими двумя запросами (select/delete) кто-то выполнит изменение базы?
Т.е. это уже не столь принципиально, но просто интересно.
на количество записей возвращаемых селектом вообще нельзя закладываться, при любом уровне изолированности. Это ж многопользовательская работа...Что произойдет, если МЕЖДУ этими двумя запросами (select/delete) кто-то выполнит изменение базы?
если речь идет о кол-ве обновленных update или удаленных delete, то это число можно получать и ориентироваться на него на 100%. ведь речь, как я понял, идет о логе действий, а не о том, сколько там чего в базе на текущий момент.
В общем, пример с count для Delete тебе дали фиговый.
В снапшоте для контроля его собственной деятельности как раз можно. Другой вопрос насколько снимок соответствует текущему состоянию данных на самом деле. Но это ему наверное внушать и вправду рановато, сначала RTFMkdv писал(а): на количество записей возвращаемых селектом вообще нельзя закладываться, при любом уровне изолированности. Это ж многопользовательская работа...

-
- Заслуженный разработчик
- Сообщения: 644
- Зарегистрирован: 15 фев 2005, 11:34
deadlock вообще-то должен возникнуть.МЕЖДУ этими двумя запросами (select/delete) кто-то выполнит изменение базы?
to KDV
Скорее не провереный... К тому же такая характеристика как количество записей само по себе понятие расплывчатое, мали ли что там юзер дропнул... Скажем юзер "ВаясяПупкин" удалил 10 записей, нормально, а если 10000 ?В общем, пример с count для Delete тебе дали фиговый.
не факт.deadlock вообще-то должен возникнуть.
Иван... еле сдерживаюсь...Скорее не провереный..

бегом читать статьи
www.ibase.ru/devinfo/garbage.htm
www.ibase.ru/devinfo/mga.htm
www.ibase.ru/devinfo/delmany.htm
хотя бы эти. Потом приходи, и мы обсудим как select count, так и массовые delete.
-
- Заслуженный разработчик
- Сообщения: 644
- Зарегистрирован: 15 фев 2005, 11:34