Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Выполнение EXECUTE BLOCK в Firebird 2.5 / 11 сообщений из 11, страница 1 из 1
09.04.2014, 16:23
    #38610191
StavRazor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение EXECUTE BLOCK в Firebird 2.5
Доброго времени суток!
Столкнулся с проблемой выполнения 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
09.04.2014, 16:32
    #38610209
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение EXECUTE BLOCK в Firebird 2.5
Попробуйте
Connection.prepareCall() и CallableStatement
...
Рейтинг: 0 / 0
09.04.2014, 16:50
    #38610235
StavRazor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение EXECUTE BLOCK в Firebird 2.5
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
09.04.2014, 16:57
    #38610247
StavRazor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение EXECUTE BLOCK в Firebird 2.5
StavRazor
Пробовал заключать сам блок в фигурные кавычки - то же самое.
Скобки, конечно же, совсем заработался.
...
Рейтинг: 0 / 0
09.04.2014, 17:05
    #38610264
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение EXECUTE BLOCK в Firebird 2.5
И не распарсит то, что выходит за рамки стандарта. execute block - чисто файбердовская фича, и нет никакой гарантии, что jdbc её поддерживает, точно можно узнать только у разработчиков драйвера.
Остается либо лепить sql - строку (приет инъекциям!), либо batch
...
Рейтинг: 0 / 0
09.04.2014, 17:07
    #38610269
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение EXECUTE BLOCK в Firebird 2.5
Для начала, конечно же, пример надо упростить: оставить только один 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
09.04.2014, 17:30
    #38610308
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение EXECUTE BLOCK в Firebird 2.5
StavRazor, когда пишешь подобную простыню на целый скрин то неудивительно ошибаться.
Если запрос сложный то воспользуйся какими-то SQL-builder-ами. Например в OracleDeveloper
есть режим где можно мышкой собрать валидный текст. Или есть пакет DBMS_чево-то-там
билдер. Наверное и для постгреса есть тул.
...
Рейтинг: 0 / 0
09.04.2014, 20:35
    #38610460
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение EXECUTE BLOCK в Firebird 2.5
StavRazorSQL error code = -901
undefined message number[/src]Какой из вариантов jaybird и какой версии используете?
Через isql (после подстановки конкретных параметров) ваш блок работает?
Результат совпадает с ожидаемым?
...
Рейтинг: 0 / 0
10.04.2014, 09:21
    #38610722
StavRazor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение EXECUTE BLOCK в Firebird 2.5
Всем спасибо за ответы!
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
10.04.2014, 11:59
    #38610978
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение EXECUTE BLOCK в Firebird 2.5
Что-то не увидел варианта

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

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

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

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


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