|
SQLJava
|
|||
---|---|---|---|
#18+
Доброго дня всем! Столкнулся с странной на мой взгляд ситуациенй в embeded sql java. Конструкция #sql [s_ctx] { SELECT fil1,fil2,fil3 INTO :var1,:var2,:var3 FROM talble_1 where number == :num } В случае, когда запрос не возвращает строку генерит ошибку Exception in thread "main" java.sql.SQLException: no rows found for select into statement at sqlj.runtime.error.Errors.raiseError(Errors.java:125) at sqlj.runtime.error.Errors.raiseError(Errors.java:73) at sqlj.runtime.error.RuntimeRefErrors.raise_NO_ROW_SELECT_INTO(RuntimeRefErrors.java:74) версия продукта IBM Informix Embedded SQLJ version 1.01.JC2 built in December 2001 В User's гаде ни слова. Само по себе странно считать ошибкой то, что ошибкой на уровне sql не является. Можно ли как нибудь изменить реакцию на запрос, не возвращающий результат? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2009, 16:33 |
|
SQLJava
|
|||
---|---|---|---|
#18+
cpr, Желательно, предоставить DDL для таблицы и полный текст всей конструкции ... :) С уважением, Вадим. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2009, 18:56 |
|
SQLJava
|
|||
---|---|---|---|
#18+
cpr, Find Error 100 __________________________________________________________ No matching records found. The database server did not find any more data. This message is an ANSI- standard SQLCODE value. If you attempted to select or fetch data, you encountered the end of the data, or no data matched the criteria in the WHERE clause. Check for an empty table. Use this SQLCODE value to determine when a statement reaches the end of the data. For more information, see the discussion of SQLCODE in the IBM Informix ESQL/C Programmer's Manual. The database server can return this SQLCODE value to a running program ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2009, 09:22 |
|
SQLJava
|
|||
---|---|---|---|
#18+
dbschema -d test_no_row DBSCHEMA Schema Utility INFORMIX-SQL Version 7.31.FD10 Copyright IBM Corporation 1996, 2004 All rights reserved Software Serial Number AAD#J383561 grant dba to "informix"; { TABLE "informix".clientaddpar row size = 362 number of columns = 17 index size = 57 } create table "informix".clientaddpar ( number serial not null constraint "informix".clientaddpar_1, clnum integer not null constraint "informix".clientaddpar_2, address char(80) not null constraint "informix".clientaddpar_3, inn char(12), sex char(1), codenat char(3), coderes char(3), status char(1) default 'i' not null constraint "informix".clientaddpar_4, phoneh char(12), phonew char(12), phonem char(12), pensnum char(30), remark char(80), posborn char(80), codepart char(20), ref1 integer, ref2 integer, check (sex IN ('M' ,'F' )) constraint "informix".clientaddpar_c1, check (status IN ('n' ,'i' ,'m' ,'t' ,'e' )) constraint "informix".clientaddpar_c2 ); grant select on "informix".clientaddpar to "public" as "informix"; grant update on "informix".clientaddpar to "public" as "informix"; grant insert on "informix".clientaddpar to "public" as "informix"; grant delete on "informix".clientaddpar to "public" as "informix"; grant index on "informix".clientaddpar to "public" as "informix"; ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2009, 10:02 |
|
SQLJava
|
|||
---|---|---|---|
#18+
cat test_no_row.sqlj import java.io.*; import java.util.*; import java.lang.*; import java.sql.*; import java.math.*; import sqlj.runtime.*; //SQLJ runtime classes import sqlj.runtime.ref.*; public class test_no_row extends demoUtil { int number; int clnum; String address; String inn; String sex; String codenat; String coderes; String status; String phoneh; String phonew; String phonem; String pensnum; String remark; String posborn; String codepart; int ref1; int ref2; private SrcCtx s_ctx = null; private DstCtx d_ctx = null; String ifxsvr = ":informixserver=test3kon"; String host2 = "//mainhost:7200/test_no_row"; String url2 = "jdbc:informix-sqli:" + host2 + ifxsvr; String driver = "com.informix.jdbc.IfxDriver"; public static void main (String args[]) throws SQLException { test_no_row main = new test_no_row(); main.Work (); } void Work () throws SQLException { try { set_driver(driver); set_user("informix"); set_passwd("informix"); set_url(url2); s_ctx = new SrcCtx(getConnect()); } catch (SQLException s) { System.err.println( "Error running demo program: " + s ); System.err.println( "Error Code : " + s.getErrorCode()); System.err.println( "Error Message : " + s.getMessage()); } System.out.println("Connect"); #sql [s_ctx] { SELECT * INTO :number,:clnum,:address,:inn,:sex,:codenat,:coderes,:status ,:phoneh,:phonew,:phonem,:pensnum,:remark,:posborn,:codepart ,:ref1,:ref2 FROM clientaddpar WHERE number == 1 }; System.out.println("Number="+number); System.out.println("Clnum="+clnum); System.out.println("Address="+address); s_ctx.close(); } } ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2009, 10:06 |
|
SQLJava
|
|||
---|---|---|---|
#18+
Класс DemoUtil из стандартной поставки JDBC 3.0, утили собственно embeded sqljava ifxsqlj.jar и ifxtools.jar соответственно тоже. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2009, 10:13 |
|
SQLJava
|
|||
---|---|---|---|
#18+
Танcpr, Find Error 100 __________________________________________________________ No matching records found. The database server did not find any more data. This message is an ANSI- standard SQLCODE value. If you attempted to select or fetch data, you encountered the end of the data, or no data matched the criteria in the WHERE clause. Check for an empty table. Use this SQLCODE value to determine when a statement reaches the end of the data. For more information, see the discussion of SQLCODE in the IBM Informix ESQL/C Programmer's Manual. The database server can return this SQLCODE value to a running program Простите, но какое отношение это имеет к моему вопросу? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2009, 10:15 |
|
SQLJava
|
|||
---|---|---|---|
#18+
Еще один сюрприз Exception in thread "main" sqlj.runtime.SQLNullException: cannot fetch null into primitive data type at sqlj.runtime.profile.ref.RTResultSetJDBC.getIntNoNull(RTResultSetJDBC.java:225) at client_rec.ap_number(myetl.java:291) at myetl.Work(myetl.java:661) at myetl.main(myetl.java:484) А в документации написано что Unlike other host languages (for example, C), Java allows null data. Therefore, you do not need to use null indicator variables with Embedded SQLJ. The Java null value is equivalent to the SQL NULL value. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2009, 10:28 |
|
SQLJava
|
|||
---|---|---|---|
#18+
cprЕще один сюрприз Exception in thread "main" sqlj.runtime.SQLNullException: cannot fetch null into primitive data type at sqlj.runtime.profile.ref.RTResultSetJDBC.getIntNoNull(RTResultSetJDBC.java:225) at client_rec.ap_number(myetl.java:291) at myetl.Work(myetl.java:661) at myetl.main(myetl.java:484) А в документации написано что Unlike other host languages (for example, C), Java allows null data. Therefore, you do not need to use null indicator variables with Embedded SQLJ. The Java null value is equivalent to the SQL NULL value. я конечно в запросе использую NVL, но это не есть гуд. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2009, 10:29 |
|
SQLJava
|
|||
---|---|---|---|
#18+
cprЕще один сюрприз Exception in thread "main" sqlj.runtime.SQLNullException: cannot fetch null into primitive data type at sqlj.runtime.profile.ref.RTResultSetJDBC.getIntNoNull(RTResultSetJDBC.java:225) at client_rec.ap_number(myetl.java:291) at myetl.Work(myetl.java:661) at myetl.main(myetl.java:484) А в документации написано что Unlike other host languages (for example, C), Java allows null data. Therefore, you do not need to use null indicator variables with Embedded SQLJ. The Java null value is equivalent to the SQL NULL value. Если объявить хост-переменные как объектные типы, то все ОК ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2009, 12:07 |
|
SQLJava
|
|||
---|---|---|---|
#18+
cprТанcpr, Find Error 100 __________________________________________________________ No matching records found. The database server did not find any more data. This message is an ANSI- standard SQLCODE value. If you attempted to select or fetch data, you encountered the end of the data, or no data matched the criteria in the WHERE clause. Check for an empty table. Use this SQLCODE value to determine when a statement reaches the end of the data. For more information, see the discussion of SQLCODE in the IBM Informix ESQL/C Programmer's Manual. The database server can return this SQLCODE value to a running program Простите, но какое отношение это имеет к моему вопросу? не знаю я спорила с Вашим утверждением о том, что запрос, не вернувший данных, не считается ошибкой надо было процитировать конечно... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2009, 12:07 |
|
SQLJava
|
|||
---|---|---|---|
#18+
Тан, А тут есть о чем спорить? В случае, когда select не возвращает запись в sqlca.sqlcode записывается 100. Ошибка, это когда записывается отрицательное число. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2009, 12:34 |
|
SQLJava
|
|||
---|---|---|---|
#18+
cpr, Думаю, что дело в хост-переменных - они дикларированы, но не определены. Это все равно, что объявить указатель без инициализации, а потом пытаться использовать его на свой страх и риск в приложении. Более правильно, инициализировать хост-переменные до выполнение SQL-запроса !!! С уважением, вадим. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2009, 13:47 |
|
SQLJava
|
|||
---|---|---|---|
#18+
GVF112GVFcpr, Думаю, что дело в хост-переменных - они дикларированы, но не определены. Это все равно, что объявить указатель без инициализации, а потом пытаться использовать его на свой страх и риск в приложении. Более правильно, инициализировать хост-переменные до выполнение SQL-запроса !!! С уважением, вадим. Проинициализировать их до запроса не проблема, в реальной программе я так и делаю. Но есть ли возможность изменить реакцию sqljava? Теоретически изменить реакцию возможно т.к. проверка на отсутствие возвращаемых данных выполняется явным образом в java-коде , который получается после препроцессирования sqljav'ой. Этот эксэпшен в принципе перехватывается catch'ем, но код ошибки при этом 0 и идентифицировать ситуацию можно только по тексту сообщения. Это на мой взгляд выглядит криво. Если же говорить в космическом смысле, то с точки зрения кода необходимость использования try-catch осложняет его (код) в данном случае неоправданно. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2009, 18:13 |
|
SQLJava
|
|||
---|---|---|---|
#18+
cpr, Как вариант, можно написать java-класс и выполнить инициализацию переменных в конструкторе или написать свой wrapper. Вы можете использовать SPL для создания хранимой процедуры и вызывать ее из java. С уважением, Вадим. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2009, 18:27 |
|
SQLJava
|
|||
---|---|---|---|
#18+
GVF112GVFcpr, Как вариант, можно написать java-класс и выполнить инициализацию переменных в конструкторе или написать свой wrapper. Вы можете использовать SPL для создания хранимой процедуры и вызывать ее из java. С уважением, Вадим. SPL кстати в моем случае врядли поможет. В 7.31 нелзья именовать колонки возвращаемого курсора, а sqljava привязывает свой итератор к именам полей. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2009, 13:28 |
|
SQLJava
|
|||
---|---|---|---|
#18+
cpr, Зачем Вам СУБД, которую сняли с производства три недели назад ?! Если Вам нужен динамический SQL или использование итераторов - попробуйте IDS 11.50. Если нет денег, как вариант - IBM DB2 Express-C ... C уважением, Вадим. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2009, 16:28 |
|
SQLJava
|
|||
---|---|---|---|
#18+
GVF112GVFcpr, Зачем Вам СУБД, которую сняли с производства три недели назад ?! Если Вам нужен динамический SQL или использование итераторов - попробуйте IDS 11.50. Если нет денег, как вариант - IBM DB2 Express-C ... C уважением, Вадим. Хорошая шутка, спасибо посмеялся. Программа предназначена для выборки данных из продуктивных систем, которым больше десяти лет. Контора купила лиценции на 7.31 и не видит смысла апгрэдить их на 11.5 т.к. то что есть ее устраивает. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2009, 10:14 |
|
|
start [/forum/topic.php?fid=44&fpage=26&tid=1607712]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 148ms |
0 / 0 |