powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / SQLJava
18 сообщений из 18, страница 1 из 1
SQLJava
    #36260034
cpr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cpr
Гость
Доброго дня всем!

Столкнулся с странной на мой взгляд ситуациенй в 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 не является.
Можно ли как нибудь изменить реакцию на запрос, не возвращающий результат?
...
Рейтинг: 0 / 0
SQLJava
    #36260502
GVF112GVF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cpr,

Желательно, предоставить DDL для таблицы и полный текст всей конструкции ... :)

С уважением,
Вадим.
...
Рейтинг: 0 / 0
SQLJava
    #36261156
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
SQLJava
    #36261237
cpr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cpr
Гость
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";
...
Рейтинг: 0 / 0
SQLJava
    #36261247
cpr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cpr
Гость
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();
}
}
...
Рейтинг: 0 / 0
SQLJava
    #36261261
cpr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cpr
Гость
Класс DemoUtil из стандартной поставки JDBC 3.0,
утили собственно embeded sqljava ifxsqlj.jar и ifxtools.jar соответственно тоже.
...
Рейтинг: 0 / 0
SQLJava
    #36261270
cpr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
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

Простите, но какое отношение это имеет к моему вопросу?
...
Рейтинг: 0 / 0
SQLJava
    #36261300
cpr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
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.
...
Рейтинг: 0 / 0
SQLJava
    #36261302
cpr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cpr
Гость
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, но это не есть гуд.
...
Рейтинг: 0 / 0
SQLJava
    #36261594
cpr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cpr
Гость
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.

Если объявить хост-переменные как объектные типы, то все ОК
...
Рейтинг: 0 / 0
SQLJava
    #36261596
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

Простите, но какое отношение это имеет к моему вопросу?

не знаю
я спорила с Вашим утверждением о том, что запрос, не вернувший данных, не считается ошибкой
надо было процитировать конечно...
...
Рейтинг: 0 / 0
SQLJava
    #36261686
cpr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cpr
Гость
Тан,

А тут есть о чем спорить?

В случае, когда select не возвращает запись в sqlca.sqlcode записывается 100.
Ошибка, это когда записывается отрицательное число.
...
Рейтинг: 0 / 0
SQLJava
    #36261924
GVF112GVF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cpr,

Думаю, что дело в хост-переменных - они дикларированы, но не определены.

Это все равно, что объявить указатель без инициализации, а потом пытаться
использовать его на свой страх и риск в приложении.

Более правильно,
инициализировать хост-переменные до выполнение SQL-запроса !!!

С уважением,
вадим.
...
Рейтинг: 0 / 0
SQLJava
    #36262752
cpr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cpr
Гость
GVF112GVFcpr,

Думаю, что дело в хост-переменных - они дикларированы, но не определены.

Это все равно, что объявить указатель без инициализации, а потом пытаться
использовать его на свой страх и риск в приложении.

Более правильно,
инициализировать хост-переменные до выполнение SQL-запроса !!!

С уважением,
вадим.

Проинициализировать их до запроса не проблема, в реальной программе я так и делаю.
Но есть ли возможность изменить реакцию sqljava?

Теоретически изменить реакцию возможно т.к. проверка на отсутствие возвращаемых данных выполняется явным образом в java-коде , который получается после препроцессирования sqljav'ой.
Этот эксэпшен в принципе перехватывается catch'ем, но код ошибки при этом 0 и идентифицировать ситуацию можно только по тексту сообщения. Это на мой взгляд выглядит криво.

Если же говорить в космическом смысле, то с точки зрения кода необходимость использования try-catch осложняет его (код) в данном случае неоправданно.
...
Рейтинг: 0 / 0
SQLJava
    #36262788
GVF112GVF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cpr,

Как вариант,
можно написать java-класс и выполнить инициализацию переменных в конструкторе или написать свой wrapper.
Вы можете использовать SPL для создания хранимой процедуры и вызывать ее из java.

С уважением,
Вадим.
...
Рейтинг: 0 / 0
SQLJava
    #36264150
cpr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cpr
Гость
GVF112GVFcpr,

Как вариант,
можно написать java-класс и выполнить инициализацию переменных в конструкторе или написать свой wrapper.
Вы можете использовать SPL для создания хранимой процедуры и вызывать ее из java.

С уважением,
Вадим.

SPL кстати в моем случае врядли поможет. В 7.31 нелзья именовать колонки возвращаемого курсора, а sqljava привязывает свой итератор к именам полей.
...
Рейтинг: 0 / 0
SQLJava
    #36264847
GVF112GVF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cpr,

Зачем Вам СУБД, которую сняли с производства три недели назад ?!
Если Вам нужен динамический SQL или использование итераторов - попробуйте IDS 11.50.

Если нет денег, как вариант - IBM DB2 Express-C ...

C уважением,
Вадим.
...
Рейтинг: 0 / 0
SQLJava
    #36266090
cpr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cpr
Гость
GVF112GVFcpr,

Зачем Вам СУБД, которую сняли с производства три недели назад ?!
Если Вам нужен динамический SQL или использование итераторов - попробуйте IDS 11.50.

Если нет денег, как вариант - IBM DB2 Express-C ...

C уважением,
Вадим.

Хорошая шутка, спасибо посмеялся.
Программа предназначена для выборки данных из продуктивных систем, которым больше десяти лет.
Контора купила лиценции на 7.31 и не видит смысла апгрэдить их на 11.5 т.к. то что есть ее устраивает.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / SQLJava
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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