Есть ли в ФБ аналог Returning?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
botpride
Сообщения: 2
Зарегистрирован: 24 авг 2005, 11:19

Есть ли в ФБ аналог Returning?

Сообщение botpride » 24 авг 2005, 12:11

Собственно, задача чуть шире, чем сформулирована тема: можно ли сформировать вложенный запрос так, чтобы выдать наружу, например, число измененных/удаленных записей, или список обновленных ключей или что-то подобное?
Пример: я хочу при удалении части записей вносить в некий лог количество удаленний, скажем, так:
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)?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 24 авг 2005, 12:21

на сервере такое можно сделать только в FB. посмотри release notes на 1.5, там что-то вроде row_count или rows_affected есть. Сначала выполняешь оператор, потом проверяешь эту переменную на предмет числа обработанных записей.
Еще вопрос: почему в ФБ не работает запись нескольких стейтментов одной строкой в prepared statement (пробовал в FIB Plus)?
потому что несколько операторов ЭТО СКРИПТ. в IB/FB все операторы выполняются с клиента только ПОШТУЧНО. Скрипты выполняются программами, которые парсят строки и закидывают в сервер операторы по одному.

В общем то, так делает любой сервер. то есть, он никогда не выполняет 2 оператора SQL одновременно. Другое дело, что у ряда серверов клиентская часть позволяет запихнуть одним махом несколько запросов на сервер.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 24 авг 2005, 13:04

Можно написать, например, такую обертку

Код: Выделить всё

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)

botpride
Сообщения: 2
Зарегистрирован: 24 авг 2005, 11:19

Сообщение botpride » 24 авг 2005, 13:14

Спасибо, в принципе, близко к тому что нужно. Тогда вопрос:
По сути, как я понял, во втором примере я получаю число записей косвенно (другим запросом). Что произойдет, если МЕЖДУ этими двумя запросами (select/delete) кто-то выполнит изменение базы?
Т.е. это уже не столь принципиально, но просто интересно.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 24 авг 2005, 13:53

It depends. RTFM уровни изоляции транзакций. ROW_COUNT - чистое решение.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 24 авг 2005, 15:20

Что произойдет, если МЕЖДУ этими двумя запросами (select/delete) кто-то выполнит изменение базы?
на количество записей возвращаемых селектом вообще нельзя закладываться, при любом уровне изолированности. Это ж многопользовательская работа...

если речь идет о кол-ве обновленных update или удаленных delete, то это число можно получать и ориентироваться на него на 100%. ведь речь, как я понял, идет о логе действий, а не о том, сколько там чего в базе на текущий момент.

В общем, пример с count для Delete тебе дали фиговый.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 24 авг 2005, 19:26

kdv писал(а): на количество записей возвращаемых селектом вообще нельзя закладываться, при любом уровне изолированности. Это ж многопользовательская работа...
В снапшоте для контроля его собственной деятельности как раз можно. Другой вопрос насколько снимок соответствует текущему состоянию данных на самом деле. Но это ему наверное внушать и вправду рановато, сначала RTFM :)

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 25 авг 2005, 09:30

МЕЖДУ этими двумя запросами (select/delete) кто-то выполнит изменение базы?
deadlock вообще-то должен возникнуть.

to KDV
В общем, пример с count для Delete тебе дали фиговый.
Скорее не провереный... К тому же такая характеристика как количество записей само по себе понятие расплывчатое, мали ли что там юзер дропнул... Скажем юзер "ВаясяПупкин" удалил 10 записей, нормально, а если 10000 ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 25 авг 2005, 09:43

deadlock вообще-то должен возникнуть.
не факт.
Скорее не провереный..
Иван... еле сдерживаюсь... :D
бегом читать статьи
www.ibase.ru/devinfo/garbage.htm
www.ibase.ru/devinfo/mga.htm

www.ibase.ru/devinfo/delmany.htm

хотя бы эти. Потом приходи, и мы обсудим как select count, так и массовые delete.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 25 авг 2005, 09:58

2 года в отпуску не был, через недельку отчаливаю на юга, я уж мысленно тама... приеду ешшо разок проРТФМлюсь :oops:

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 25 авг 2005, 10:22

тогда лучше забей :)

Ответить