Новый триал IBProvider v3.50 (сборка 28476)
В новой сборке доступна новая фича в виде поддержки OUT-параметров в запросах для добавления новых записей «обновляемых» множеств. Это значит что теперь можно использовать «INSERT … RETURNING … INTO» для перечитывания значений колонок новых записей множества.
Пользуясь случаем, хочу передать привет самому себе. Пять лет прошло, Карл. Пять лет.
Фича пока доступна только для запросов, явно указанных в свойстве набора рядов «insert_sql».
Для демонстрации работоспособности этой штуки, предлагаю посмотреть следующий небольшой пример на VBScript и ADODB. Давно я на этой паре ничего не писал 🙂
Код примера
option explicit rem ---------------------------- 1 dim cn set cn=createobject("ADODB.Connection") cn.Provider="LCPI.IBProvider.3" cn.Properties("location") ="inet4://localhost/d:\database\ram\ibp_test_fb30_d3.gdb" cn.Properties("user id") ="GAMER" cn.Properties("password") ="vermut" cn.Properties("auto_commit") =true cn.Properties("dbclient_type") ="fb.direct" call cn.Open() rem ---------------------------- 2 dim cmd set cmd=createobject("ADODB.Command") set cmd.ActiveConnection=cn cmd.Properties("IRowsetChange")=true cmd.Properties("Append-Only Rowset")=true cmd.Properties("insert_sql")= _ "insert into TEST_MODIFY_ROW_WD "& _ "default values "&_ "returning TEST_ID, COL_INTEGER "& _ "into :COL.TEST_ID, :COL.COL_INTEGER" cmd.CommandText= _ "select TEST_ID, COL_INTEGER from TEST_MODIFY_ROW_WD" rem ---------------------------- 3 dim rs set rs=cmd.Execute() rem ---------------------------- 4 call rs.AddNew() rem ---------------------------- 5 wscript.echo "TEST_ID : "&rs("TEST_ID").value wscript.echo "COL_INTEGER: "&rs("COL_INTEGER").value
Краткое описание
Пример работает с таблицей TEST_MODIFY_ROW_WD, в которой определены две колонки: TEST_ID и COL_INTEGER.
TEST_ID — это первичный ключ таблицы, который может заполняться триггером «BEFORE INSERT».
COL_INTEGER — колонка с типом INTEGER, у которой есть значение по умолчанию «4».
По шагам:
1. Подключаемся к базе (FB3). Разрешаем автоматические транзакции (auto_commit=true)
2. Создаем и настраиваем команду.
В свойстве «insert_sql» указывается текст запроса, который будет отработан при добавлении новой записи. Обратите внимание, что используется «default values». То есть, мы игнорируем значения колонок добавляемой записи. В секции INTO указаны маркеры колонок, в которые будут загружены значения из секции RETURNING.
3. Выполняем команду и получаем объект результирующего множества.
4. Добавляем новую пустую запись.
5. Выводим значения колонок добавленной записи.
Вывод в консоль
При многократных запусках этого шедевра мы видим следующее:
TEST_ID каждый раз, как и ожидалось, увеличивается на единицу. Это отрабатывает триггер, дергающий генератор.
В COL_INTEGER попадает значение по умолчанию (4).
Что дальше
OUT-параметры пока поддерживаются только для операции добавления новых записей. Для обновления и удаления(!) эта поддержка умышленно не прикручена — нужно провести дополнительное исследование на тему «что будет если UPDATE/DELETE обработает нулевое количество записей или число затронутых записей будет больше 1?»
Так же нужно будет соорудить генераторы запросов, чтобы не прописывать их руками.
На все это потребуется некоторое время. Большая часть из которого уйдет на написание тестов.
Dmitry Kovalenko on 26 апреля, 2018
>нужно провести дополнительное исследование на тему …
FB3. UPDATE … RETURNING.
Если обрабатывается нулевое количество записей, то в OUT-параметрах приезжают NULL-ы.
Если обрабатывается больше одной записи, то возвращается ошибка «multiple rows in singleton select». Сами записи не меняются.
Последнее (то что записи не меняются) реально радует. Правда.