Извлечение rdb$db_key firebird 1.5

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

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

Ответить
0xfceron
Сообщения: 3
Зарегистрирован: 20 июл 2012, 13:47

Извлечение rdb$db_key firebird 1.5

Сообщение 0xfceron » 20 июл 2012, 14:34

Здравствуйте уважаемые форумчане!
Каким образом можно получить rdb$db_key в firebird 1.5?

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

select rdb$db_key, n_inv, k_oper, data_oper from tb_mat_cen
А именно обработать, вставить это значение какую либо таблицу бд или обработать при помощи какой либо udf'ки или получить rdb$db_key в Delphi.
В IBExpert'e выборка происходит отлично и можно увидеть значение rdb$db_key
Но вот когда начинаешь:
- копировать значение ячейки
- становишься мышкой на ячейку в режиме редактирования чтобы скопировать находящийся там текст
- экспортируешь результаты запроса в скрипт
- обращаешься через функцию или как либо обращаешься к rdb$db_key при выборке, хотя бы достать макс. значение
то он показывает какой либо один символ в основном кракозябрик.
Я понимаю, что возможно редко кто пользуется rdb$db_key (в нете, встречаются примеры для удаления дубликатов), но на данный момент это является единственным выходом определить среди одинаковых записей, именно ту запись которая insert'илась последней.

А данные следующего вида, есть Материальные ценности, в которых следует определить последнюю операцию выполненную с мат.ценностью. Ее как я понял можно получить в моем случае только по rdb$db_key.

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

+--------+--------------------------------+-------------------------------------------------------+---------------+
| DB_KEY | Инвентарный номер мат.ценности | Код операции (приобретение, списание, передача, ... ) | Дата операции |
+--------+--------------------------------+-------------------------------------------------------+---------------+
| 14:24  | 001                            | 1                                                     | 12.01.2011    |
| 14:89  | 001                            | 2                                                     | 12.01.2011    |
| 14:56  | 001                            | 31                                                    | 12.01.2011    |
| ...    | ...                            | ..                                                    | ..            |
+--------+--------------------------------+-------------------------------------------------------+---------------+
В данной таблице вторая строчка с значением "DB_KEY 14:89", является последней вставленной, она как раз таки мне и нужна)
Я перешарил весь нэт, UDF'ку написал) думал мож удастся вытащить и обработать как либо, но нет, сегодня только понял что UDF дохлый номер.
Прошу Вас, подсказать какие еще варианты есть для того чтобы достать значение rdb$db_key ? Возможно есть какие либо варианты? :)

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Извлечение rdb$db_key firebird 1.5

Сообщение Dimitry Sibiryakov » 20 июл 2012, 14:56

Добавь к имеющейся дате время с точностью до микросекунд и ты получишь гораздо более надёжный критерий. Или заведи поле, заполняемое из последовательности. db_key не всегда монотонно возрастает. Точнее сказать - почти никогда.

0xfceron
Сообщения: 3
Зарегистрирован: 20 июл 2012, 13:47

Re: Извлечение rdb$db_key firebird 1.5

Сообщение 0xfceron » 20 июл 2012, 15:02

Dimitry Sibiryakov писал(а):Добавь к имеющейся дате время с точностью до микросекунд и ты получишь гораздо более надёжный критерий. Или заведи поле, заполняемое из последовательности. db_key не всегда монотонно возрастает. Точнее сказать - почти никогда.
Спасибо за совет Дмитрий, подобную идею уже реализовал недавно, с учетом времени у даты. Но данные в отчет начиная с 2005 года, все таки надо извлечь с кодом последней операции.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Извлечение rdb$db_key firebird 1.5

Сообщение hvlad » 20 июл 2012, 15:56

0xfceron писал(а):это является единственным выходом определить среди одинаковых записей, именно ту запись которая insert'илась последней
Никто не гарантирует монотонное возрастание db_key, если в таблице бывают update\delete

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Извлечение rdb$db_key firebird 1.5

Сообщение hvlad » 20 июл 2012, 15:58

0xfceron писал(а):Прошу Вас, подсказать какие еще варианты есть для того чтобы достать значение rdb$db_key ? Возможно есть какие либо варианты? :)
Обычное поле CHAR(8) OCTETS, какие проблемы ?

0xfceron
Сообщения: 3
Зарегистрирован: 20 июл 2012, 13:47

Re: Извлечение rdb$db_key firebird 1.5

Сообщение 0xfceron » 21 июл 2012, 11:49

Всем спасибо, решил при помощи UDF'ки исходник тут http://pastebin.mozilla-russia.org/110232, а вообще мягко сказать "не сообразил" при объявлении функции. А точнее как сказано вот здесь http://www.ibase.ru/devinfo/udf_ok.htm "все передаваемые в UDF параметры всегда передаются по ссылке, т.е. должны быть объявлены как var или как указатели."
Вопрос исчерпан, тема может быть закрыта.

Ответить