Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC and STRUCT / 17 сообщений из 17, страница 1 из 1
29.07.2004, 09:39
    #32626468
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
Win XP, Oracle 9i, Java 1.4.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TYPE test_obj AS OBJECT(obj_id NUMBER, obj_name VARCHAR2( 30 ));
/

CREATE TABLE test_table(x test_obj);

INSERT INTO test_table VALUES(test_obj( 1 , 'First'));
INSERT INTO test_table VALUES(test_obj( 2 , 'Second'));
COMMIT;


Код: plaintext
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.
import java.sql.*;
import oracle.sql.*;
import oracle.jdbc.driver.*;


class testObj {
	public static void main(String[] args) {
		Connection conn = null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:<DB>", <user>, <pass>);
		} catch (Exception e) {
			System.out.println("Error.");
			System.exit( 0 );
		} //try

		try {
			Statement stmt = conn.createStatement();
			ResultSet rs = stmt.executeQuery("SELECT * FROM test_table");
			while (rs.next()) {
				oracle.sql.STRUCT struct = ((OracleResultSet)rs).getSTRUCT( 1 );
				Object[] attrs = struct.getAttributes();
				for (int i= 0 ; i<attrs.length; i++) {
					System.out.print(attrs[i] + "; ");
				} //for
				System.out.println();
			} // while

			rs.close(); rs = null;
			stmt.close(); stmt = null;
			conn.close(); conn = null;
		} catch (Exception e) {
			e.printStackTrace();
		} //try

	}
};

Вот что выводит:
Код: plaintext
1.
 1 ; 0x4669727374;
 2 ; 0x5365636F6E64;

Почему вместо строк выводятся шестнадцатиричные коды символов этих строк?
...
Рейтинг: 0 / 0
29.07.2004, 11:10
    #32626653
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
В Оракле я не силен, но все же, вот эти строки
Код: plaintext
1.
2.
3.
Object[] attrs = struct.getAttributes();
...
System.out.print(attrs[i] + "; ");

В них может нужно сделать приведение типов, а то у тебя возвращается какой то объект, что за объект, какого типа хз. Если тип не простои, то нужно переопредеоить метод toString();
...
Рейтинг: 0 / 0
29.07.2004, 13:45
    #32627131
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
Типы
1) obj_id приводится к int
2) obj_name приводится к String
Это делается автоматически. Принудительное приведение типов дает тот же результат.
...
Рейтинг: 0 / 0
29.07.2004, 13:53
    #32627148
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
По-моему, это какой-то локальный эффект. Попробовал то же самое - все нормально прочиталось. Единственное что: при коннекте через THIN-драйвер у меня выскакивает исключение:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
java.sql.SQLException: Исключение ввода/вывода: Connection refused
(DESCRIPTION=(TMP=)(VSNNUM= 153093376 )(ERR= 12505 )
(ERROR_STACK=(ERROR=(CODE= 12505 )(EMFI= 4 ))))
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java: 134 )
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java: 179 )
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java: 333 )
	at oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java: 404 )
	at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java: 468 )
	at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java: 314 )
	at java.sql.DriverManager.getConnection(DriverManager.java: 512 )
	at java.sql.DriverManager.getConnection(DriverManager.java: 171 )
...

Попробуй через OCI-драйвер - то же самое?

Win2000, Oracle 9.2.0.5, кодировка UTF8
...
Рейтинг: 0 / 0
29.07.2004, 14:11
    #32627212
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
Может и локальный. Но в чем причина? Пробовал у себя дома на компе. Конфигурация та же, только винда русская. Эффект тот же. Через OCI-драйвер я не работал. Может кинешь кусок кода для подключения к бд?
...
Рейтинг: 0 / 0
29.07.2004, 14:14
    #32627225
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
Denis PopovЕдинственное что: при коннекте через THIN-драйвер у меня выскакивает исключение:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
java.sql.SQLException: Исключение ввода/вывода: Connection refused
(DESCRIPTION=(TMP=)(VSNNUM= 153093376 )(ERR= 12505 )
(ERROR_STACK=(ERROR=(CODE= 12505 )(EMFI= 4 ))))
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java: 134 )
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java: 179 )
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java: 333 )
	at oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java: 404 )
	at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java: 468 )
	at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java: 314 )
	at java.sql.DriverManager.getConnection(DriverManager.java: 512 )
	at java.sql.DriverManager.getConnection(DriverManager.java: 171 )
...

Может ты в урле не поменял имя бд? Ошибка на это похоже.
...
Рейтинг: 0 / 0
29.07.2004, 14:51
    #32627342
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
Облажался я:) Оказывается, в данном случае значение SID регистрозависимое даже для Oracle. Вот уж не подумал бы.

Хм, у меня и через THIN все нормально, значит, дело не в этом. А работа через OCI отличается одной строкой:

Код: plaintext
1.
conn = DriverManager.getConnection("jdbc:oracle:oci8:@<alias>", <user>, <pass>);

где <alias> - имя из tnsnames.ora. Соответственно, должен стоять оракловый клиент.
...
Рейтинг: 0 / 0
29.07.2004, 14:58
    #32627365
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
Попробовал через OCI. Не получается подсоединиться к бд. выскакивает с сообщением:
Код: plaintext
java.lang.UnsatisfiedLinkError: free_c_state
строку соединения задавал так:
Код: plaintext
"jdbc:oracle:oci8:"
...
Рейтинг: 0 / 0
29.07.2004, 15:10
    #32627405
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
OCI не помог. Та же фигня.
...
Рейтинг: 0 / 0
29.07.2004, 19:12
    #32628065
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
System.out.print(attrs + "; ");
==
System.out.print(attrs.toString() + "; ");

А toString для объекта Object как раз возвращает подобные значения (адреса в памяти)

С моей точки зрения - правильнее в Java описать соответствующий объект:

class test_obj
{
public int obj_id;
public String obj_name;
}

а потом сохранять/загружать его в BLOB-поля.
...
Рейтинг: 0 / 0
30.07.2004, 08:36
    #32628410
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
Кувалдин РоманА toString для объекта Object как раз возвращает подобные значения (адреса в памяти)
Возвращается не адрес в памяти!
вместо строк выводятся шестнадцатиричные коды символов этих строк
...
Рейтинг: 0 / 0
30.07.2004, 08:37
    #32628413
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
Кувалдин Романа потом сохранять/загружать его в BLOB-поля.
А по-моему это уже извращение.
...
Рейтинг: 0 / 0
30.07.2004, 14:41
    #32629547
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
Попробовал использовать Custom Object Classes for Oracle Objects. Не помогло. Что за чертовщина?
...
Рейтинг: 0 / 0
30.07.2004, 14:55
    #32629590
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
Нашел упоминание на Металинке схожей проблемы, ответ был таков:


I have just found out this is due to the missing of nls_charset12.zip file in the classpath in the PC environment.


Какая версия Оракла? В какой кодировке создана база? Глянь еще сюда: Java: Русские буквы и не только... , поищи упоминание файла nls_charset12.zip.
...
Рейтинг: 0 / 0
30.07.2004, 15:14
    #32629638
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
Ужас! Представляете, в path БЫЛ прописан путь до nls_charset12.zip. Прикол в том, что каким то макаром перед ним была точка! Соответственно, и не работало из-за этого. Сейчас все работает, спасибо за внимание.
...
Рейтинг: 0 / 0
30.07.2004, 15:29
    #32629679
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
ИМХО точка очень даже может быть прописана в CLASSPATH, она влияет на возможность выполнения класса из текущей директории. У меня, к примеру:

Код: plaintext
1.
CLASSPATH=.;C:\oracle\ora92\jdbc\lib\classes12.jar

Другое дело, что nls_charset12.zip не упоминается в CLASSPATH вообще, и все-таки как-то работает:)
...
Рейтинг: 0 / 0
30.07.2004, 15:36
    #32629703
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC and STRUCT
Про точку в classpath я знаю, просто там было написано не
Код: plaintext
<some_path>;.;c:\oracle\...
а
Код: plaintext
<some_path>;.c:\oracle\...
Вот и все дела.
У тебя работает без пути, потому что бд в кодировке подходящей (utf8, например)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC and STRUCT / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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