powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Выполнение EXECUTE BLOCK в Firebird 2.5
11 сообщений из 11, страница 1 из 1
Выполнение EXECUTE BLOCK в Firebird 2.5
    #38610191
StavRazor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Столкнулся с проблемой выполнения EXECUTE BLOCK с помощью интерфейса PreparedStatement. Чуть обрисую ситуацию: есть база данных под управлением Firebird 2.5, несколько таблиц , в которые необходимо вставить данные в одной транзакции, для формирования id таблиц используются специальные генераторы.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
sql = "execute block as declare variable id_d d_id; "
     + "declare variable id_key d_id; "
     + "begin "
     + "id_d = gen_id (SEQ_DOCUMENT,1); "
     + "id_key = gen_id (ext_information,1); "
     + "insert into ext_input_header (id, " // 1
     + "proceed, " // 2
     + "agent_code, " // 3
     + "pack_number, " // 4
     + "external_key, " // 5
     + "agent_dept_code, " // 6
     + "agent_agreement_code, " // 7
     + "metaobjectname, " // 8
     + "date_import) " // 9
     + "values (:id_d, ?, ?, ?, ?, ?, ?, 'EXT_RESPONSE', current_date); " 
     + "insert into ext_response (id, " // 1
     + "entity_name, " // 2
     + "response_date, " // 3
     + "entity_birthyear, " // 4
     + "entity_birthdate, " // 5
     + "entity_inn, " // 6
     + "id_num, " // 7
     + "ip_num, " // 8
     + "request_num, " // 9
     + "request_id, " // 10
     + "data_str, " // 11
     + "answer_type) " // 12
     + "values "
     + "(:id_d, ?, current_date, ?, ?, ?, ?, ?, ?, ?, ?, ?); " 
     + "insert into ext_information (id, " // 1
     + "act_date, " // 2
     + "entity_name, " // 3
     + "external_key, " // 4
     + "kind_data_type, " // 5
     + "entity_birthdate, "  // 6
     + "entity_birthyear, " // 7
     + "proceed, " // 8
     + "document_key, " // 9
     + "entity_inn) " // 10
     + "values "
     + "(:id_key, ?, ?, ?, ?, ?, ?, ?, ?, ?); " 
     + "insert into ext_sved_rab_data (id, " // 1
     + "adres_f, " // 2
     + "adres_j, " // 3
     + "naimorg) " // 4
     + "values "
     + "(:id_key, ?, ?, ?); "
     + "end";
 
PreparedStatement psToOSP = connectionToOSP.prepareStatement(sql);
psToOSP.setInt(1, 0);
psToOSP.setString(2, mvvAgentCode);
psToOSP.setLong(3, packNum);
psToOSP.setString(4, extKeyRab);
psToOSP.setString(5, mvvAgentDeptCode);
psToOSP.setString(6, mvvAgreementCodeRR);
psToOSP.setString(7, entityName);
psToOSP.setObject(8, entityBirthYear);
psToOSP.setObject(9, entityBirthDateD);
psToOSP.setString(10, entityINN);
psToOSP.setString(11, idNumber);
psToOSP.setString(12, ipNumber);
psToOSP.setString(13, requestNum);
psToOSP.setObject(14, requestIdL);
psToOSP.setString(15, dataStr);
psToOSP.setString(16, "05");
psToOSP.setDate(17, actDateD);
psToOSP.setString(18, entityName);
psToOSP.setString(19, extKeyRab);
psToOSP.setString(20, "05");
psToOSP.setObject(21, entityBirthDateD);
psToOSP.setObject(22, entityBirthYear);
psToOSP.setInt(23, 0);
psToOSP.setString(24, extKeyRab);
psToOSP.setString(25, entityINN);
psToOSP.setString(26, adresJ);
psToOSP.setString(27, adresF);
psToOSP.setString(28, naimOrg);
                    
psToOSP.executeUpdate();




При выполнении падает такое исключение:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
апр 09, 2014 4:06:31 PM regexchange.PFRResponse insertResponseToOSP
SEVERE: null
org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -901
undefined message number
	at org.firebirdsql.jdbc.AbstractPreparedStatement.<init>(AbstractPreparedStatement.java:138)
	at org.firebirdsql.jdbc.FBPreparedStatement.<init>(FBPreparedStatement.java:45)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
	at org.firebirdsql.jdbc.FBStatementFactory.createPreparedStatement(FBStatementFactory.java:89)
	at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:1187)
	at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:942)
	at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:896)
	at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:324)
	at regexchange.PFRResponse.insertResponseToOSP(PFRResponse.java:861)
	at regexchange.PFRResponse.importToOSP(PFRResponse.java:74)
	at regexchange.MainFrame.jButtonImportResponseToOSPPFRActionPerformed(MainFrame.java:462)
	at regexchange.MainFrame.access$500(MainFrame.java:19)
	at regexchange.MainFrame$6.actionPerformed(MainFrame.java:164)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6505)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
	at java.awt.Component.processEvent(Component.java:6270)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4861)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2719)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
	at java.awt.EventQueue.access$200(EventQueue.java:103)
	at java.awt.EventQueue$3.run(EventQueue.java:694)
	at java.awt.EventQueue$3.run(EventQueue.java:692)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:708)
	at java.awt.EventQueue$4.run(EventQueue.java:706)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Caused by: org.firebirdsql.gds.GDSException: Dynamic SQL Error
SQL error code = -901
undefined message number
	at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.readStatusVector(AbstractJavaGDSImpl.java:2092)
	at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.receiveResponse(AbstractJavaGDSImpl.java:2042)
	at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.iscDsqlPrepare(AbstractJavaGDSImpl.java:1465)
	at org.firebirdsql.gds.impl.GDSHelper.prepareStatement(GDSHelper.java:190)
	at org.firebirdsql.jdbc.AbstractStatement.prepareFixedStatement(AbstractStatement.java:1441)
	at org.firebirdsql.jdbc.AbstractPreparedStatement.prepareFixedStatement(AbstractPreparedStatement.java:1285)
	at org.firebirdsql.jdbc.AbstractPreparedStatement.<init>(AbstractPreparedStatement.java:135)
	... 51 more




Перерыл кучу форумов и документаций, но не нашел хотя бы намека на то, в какую сторону смотреть. Понимаю, что Firebird мало где уже используется, но может кто-нибудь сталкивался с подобным и подскажет направление поисков?
...
Рейтинг: 0 / 0
Выполнение EXECUTE BLOCK в Firebird 2.5
    #38610209
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте
Connection.prepareCall() и CallableStatement
...
Рейтинг: 0 / 0
Выполнение EXECUTE BLOCK в Firebird 2.5
    #38610235
StavRazor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, попробовал, теперь выпадает исключение:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
апр 09, 2014 4:33:31 PM regexchange.PFRResponse insertResponseToOSP
SEVERE: null
org.firebirdsql.jdbc.FBSQLException: You cannot set value of an non-existing parameter.
	at org.firebirdsql.jdbc.FBProcedureCall$NullParam.setValue(FBProcedureCall.java:430)
	at org.firebirdsql.jdbc.AbstractCallableStatement.setInt(AbstractCallableStatement.java:1366)
	at regexchange.PFRResponse.insertResponseToOSP(PFRResponse.java:1027)
	at regexchange.PFRResponse.importToOSP(PFRResponse.java:75)
	at regexchange.MainFrame.jButtonImportResponseToOSPPFRActionPerformed(MainFrame.java:462)
	at regexchange.MainFrame.access$500(MainFrame.java:19)
	at regexchange.MainFrame$6.actionPerformed(MainFrame.java:164)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6505)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
	at java.awt.Component.processEvent(Component.java:6270)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4861)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2719)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
	at java.awt.EventQueue.access$200(EventQueue.java:103)
	at java.awt.EventQueue$3.run(EventQueue.java:694)
	at java.awt.EventQueue$3.run(EventQueue.java:692)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:708)
	at java.awt.EventQueue$4.run(EventQueue.java:706)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)



Пробовал заключать сам блок в фигурные кавычки - то же самое. Программа не может распарсить строку запроса для подстановки значений.
...
Рейтинг: 0 / 0
Выполнение EXECUTE BLOCK в Firebird 2.5
    #38610247
StavRazor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StavRazor
Пробовал заключать сам блок в фигурные кавычки - то же самое.
Скобки, конечно же, совсем заработался.
...
Рейтинг: 0 / 0
Выполнение EXECUTE BLOCK в Firebird 2.5
    #38610264
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И не распарсит то, что выходит за рамки стандарта. execute block - чисто файбердовская фича, и нет никакой гарантии, что jdbc её поддерживает, точно можно узнать только у разработчиков драйвера.
Остается либо лепить sql - строку (приет инъекциям!), либо batch
...
Рейтинг: 0 / 0
Выполнение EXECUTE BLOCK в Firebird 2.5
    #38610269
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала, конечно же, пример надо упростить: оставить только один insert.

Потом экспериментировать.
Я бы сначала убрал все параметры (поставил константы), чтобы убедиться, что по крайней мере не падаем на разборе стейтмента.

Потом -- и это мое основное подозрение -- вынес бы параметры в декларацию блока. Подозреваю, параметры внутри блока не разрешены. Синтаксис ведь такой:

http://firebirdsql.su/doku.php?id=execute_block EXECUTE BLOCK [ (inparam datatype = :<название параметра>, ...) ]
[ RETURNS (outparam datatype, ...) }
AS
[DECLARE VARIABLE varparam datatype; ...]
BEGIN
...
END

Вот все "?" вынес бы после EXECUTE BLOCK, а внутри уже обращался по именам.
...
Рейтинг: 0 / 0
Выполнение EXECUTE BLOCK в Firebird 2.5
    #38610308
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StavRazor, когда пишешь подобную простыню на целый скрин то неудивительно ошибаться.
Если запрос сложный то воспользуйся какими-то SQL-builder-ами. Например в OracleDeveloper
есть режим где можно мышкой собрать валидный текст. Или есть пакет DBMS_чево-то-там
билдер. Наверное и для постгреса есть тул.
...
Рейтинг: 0 / 0
Выполнение EXECUTE BLOCK в Firebird 2.5
    #38610460
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StavRazorSQL error code = -901
undefined message number[/src]Какой из вариантов jaybird и какой версии используете?
Через isql (после подстановки конкретных параметров) ваш блок работает?
Результат совпадает с ожидаемым?
...
Рейтинг: 0 / 0
Выполнение EXECUTE BLOCK в Firebird 2.5
    #38610722
StavRazor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за ответы!
maytonStavRazor, когда пишешь подобную простыню на целый скрин то неудивительно ошибаться.
Если запрос сложный то воспользуйся какими-то SQL-builder-ами. Например в OracleDeveloper
есть режим где можно мышкой собрать валидный текст. Или есть пакет DBMS_чево-то-там
билдер. Наверное и для постгреса есть тул.
Запрос составлял в IBExpert, там он отработал без ошибок. Ваш пост натолкнул на мысль, что, возможно, есть java-библиотеки для работы с запросами для Firebird. Поищу.
Alexander A. SakДля начала, конечно же, пример надо упростить: оставить только один insert.

Потом экспериментировать.
Я бы сначала убрал все параметры (поставил константы), чтобы убедиться, что по крайней мере не падаем на разборе стейтмента.

Потом -- и это мое основное подозрение -- вынес бы параметры в декларацию блока. Подозреваю, параметры внутри блока не разрешены. Синтаксис ведь такой:

http://firebirdsql.su/doku.php?id=execute_block
EXECUTE BLOCK [ (inparam datatype = :<название параметра>, ...) ]
[ RETURNS (outparam datatype, ...) }
AS
[DECLARE VARIABLE varparam datatype; ...]
BEGIN
...
END

Вот все "?" вынес бы после EXECUTE BLOCK, а внутри уже обращался по именам
Запрос написан правильно, проверялся в IBExpert. С константами все нормально работает.
Basil A. SidorovStavRazor
SQL error code = -901
undefined message number[/src]
Какой из вариантов jaybird и какой версии используете?
Через isql (после подстановки конкретных параметров) ваш блок работает?
Результат совпадает с ожидаемым?
jaybird 2.2.4 от разработчиков Firebird.
Через isql блок работает и результаты совпадают с ожидаемыми.
ivanraИ не распарсит то, что выходит за рамки стандарта. execute block - чисто файбердовская фича, и нет никакой гарантии, что jdbc её поддерживает, точно можно узнать только у разработчиков драйвера.
Остается либо лепить sql - строку (приет инъекциям!), либо batch
Исходя из всего мной опробованного, только этот вариант дал положительный результат. Скорее всего действительно jaybird просто-напросто пока не поддерживает EXECUTE BLOCK. А жаль.
Всем еще раз спасибо за информацию!
...
Рейтинг: 0 / 0
Выполнение EXECUTE BLOCK в Firebird 2.5
    #38610978
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то не увидел варианта

авторВот все "?" вынес бы после EXECUTE BLOCK, а внутри уже обращался по именам.

Вот тут https://groups.yahoo.com/neo/groups/Firebird-Java/conversations/topics/9416
вроде люди так делают. Правда, остановились на том, что точка с запятой в конце не нужна.
...
Рейтинг: 0 / 0
Выполнение EXECUTE BLOCK в Firebird 2.5
    #38611742
StavRazor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexander A. SakЧто-то не увидел варианта

авторВот все "?" вынес бы после EXECUTE BLOCK, а внутри уже обращался по именам.

Вот тут https://groups.yahoo.com/neo/groups/Firebird-Java/conversations/topics/9416
вроде люди так делают. Правда, остановились на том, что точка с запятой в конце не нужна.
Получилось! Спасибо большое, добрый человек! Все работает, как и должно работать. Еще раз огромное спасибо!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Выполнение EXECUTE BLOCK в Firebird 2.5
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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