powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC and STRUCT
17 сообщений из 17, страница 1 из 1
JDBC and STRUCT
    #32626468
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JDBC and STRUCT
    #32626653
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Оракле я не силен, но все же, вот эти строки
Код: plaintext
1.
2.
3.
Object[] attrs = struct.getAttributes();
...
System.out.print(attrs[i] + "; ");

В них может нужно сделать приведение типов, а то у тебя возвращается какой то объект, что за объект, какого типа хз. Если тип не простои, то нужно переопредеоить метод toString();
...
Рейтинг: 0 / 0
JDBC and STRUCT
    #32627131
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Типы
1) obj_id приводится к int
2) obj_name приводится к String
Это делается автоматически. Принудительное приведение типов дает тот же результат.
...
Рейтинг: 0 / 0
JDBC and STRUCT
    #32627148
Фотография 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 )
...

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

Win2000, Oracle 9.2.0.5, кодировка UTF8
...
Рейтинг: 0 / 0
JDBC and STRUCT
    #32627212
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может и локальный. Но в чем причина? Пробовал у себя дома на компе. Конфигурация та же, только винда русская. Эффект тот же. Через OCI-драйвер я не работал. Может кинешь кусок кода для подключения к бд?
...
Рейтинг: 0 / 0
JDBC and STRUCT
    #32627225
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JDBC and STRUCT
    #32627342
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Облажался я:) Оказывается, в данном случае значение SID регистрозависимое даже для Oracle. Вот уж не подумал бы.

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

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

где <alias> - имя из tnsnames.ora. Соответственно, должен стоять оракловый клиент.
...
Рейтинг: 0 / 0
JDBC and STRUCT
    #32627365
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал через OCI. Не получается подсоединиться к бд. выскакивает с сообщением:
Код: plaintext
java.lang.UnsatisfiedLinkError: free_c_state
строку соединения задавал так:
Код: plaintext
"jdbc:oracle:oci8:"
...
Рейтинг: 0 / 0
JDBC and STRUCT
    #32627405
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OCI не помог. Та же фигня.
...
Рейтинг: 0 / 0
JDBC and STRUCT
    #32628065
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JDBC and STRUCT
    #32628410
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кувалдин РоманА toString для объекта Object как раз возвращает подобные значения (адреса в памяти)
Возвращается не адрес в памяти!
вместо строк выводятся шестнадцатиричные коды символов этих строк
...
Рейтинг: 0 / 0
JDBC and STRUCT
    #32628413
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кувалдин Романа потом сохранять/загружать его в BLOB-поля.
А по-моему это уже извращение.
...
Рейтинг: 0 / 0
JDBC and STRUCT
    #32629547
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал использовать Custom Object Classes for Oracle Objects. Не помогло. Что за чертовщина?
...
Рейтинг: 0 / 0
JDBC and STRUCT
    #32629590
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел упоминание на Металинке схожей проблемы, ответ был таков:


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
JDBC and STRUCT
    #32629638
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ужас! Представляете, в path БЫЛ прописан путь до nls_charset12.zip. Прикол в том, что каким то макаром перед ним была точка! Соответственно, и не работало из-за этого. Сейчас все работает, спасибо за внимание.
...
Рейтинг: 0 / 0
JDBC and STRUCT
    #32629679
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО точка очень даже может быть прописана в CLASSPATH, она влияет на возможность выполнения класса из текущей директории. У меня, к примеру:

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

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


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