powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC: "Превышен размер данных, разрешенный для этого типа"
11 сообщений из 11, страница 1 из 1
JDBC: "Превышен размер данных, разрешенный для этого типа"
    #34557050
Kyamranbey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!

Посоветуйте по следующей проблеме:
Возникает ошибкав 9ке:
"Превышен размер данных, разрешенный для этого типа: oracle.jdbc.kprb.KprbDBStatement@9f70b26c"

при попытке сделать executeUpdate для PreparedStatement.
Этот PreparedStatement содержит привязки типа setString для поля типа LONG.
Возникает при размере параметра привязки больше 32К.
т.е. пытаюсь засунуть туда String > 32K.

Это работает в 10ке!

Вроде тестил это и на 9ке и работало. Может это связано с версией JDBC и т.д.

Заранее благодарен!
...
Рейтинг: 0 / 0
JDBC: "Превышен размер данных, разрешенный для этого типа"
    #34557435
biomen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Oracle® Database JDBC Developer's Guide and Reference
14 Java Streams in JDBC

In Oracle Database 10g, the size limitation on data that may be used with setBytes and setString have been reduced and, in certain cases, eliminated. Any Java byte array can be passed to setBytes, and any Java String can be passed to setString. The JDBC driver automatically switches to using setBinaryStream or setCharacterStream or to using setBytesForBlob or setStringForClob, depending on the size of the data, whether the statement is SQL or PL/SQL, and the driver used.

There are some limitation with earlier versions of Oracle Database and in the server-side internal driver.

Попробуйте заливать через поток.
...
Рейтинг: 0 / 0
JDBC: "Превышен размер данных, разрешенный для этого типа"
    #34558308
Kyamranbey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо
но что то тоже самое выдает :-(
сделал так примерно для теста:

public static void putTest (oracle.sql.CLOB pCLOB)
throws SQLException, IOException, Exception {
Connection conn = new OracleDriver().defaultConnection();
PreparedStatement stmt = conn.prepareStatement("insert into testlong(id, l) values(1, ?)");
Reader rd = pCLOB.getCharacterStream();
stmt.setCharacterStream(1, rd, 33000);
int result = stmt.executeUpdate();
stmt.close();
conn.close();
}

может по-другому надо?
...
Рейтинг: 0 / 0
JDBC: "Превышен размер данных, разрешенный для этого типа"
    #34558791
garry_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй так
Код: 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.
37.
sqlgetNewId = conn.prepareStatement("SELECT schema.packageName.getMethod1 FROM DUAL");
sqlInsertRow = conn.prepareStatement("INSERT INTO schema.tableName VALUES (?, ?, (SELECT schema.packageName.getMethod2(?) FROM DUAL), ?)");
sqlGetEmptyClob = conn.prepareStatement("SELECT clobColumn FROM schema.tableName WHERE ID = ? FOR UPDATE");
 
public void updateTableWithClob(String docName,
InputStream is) throws Exception{
ResultSet rs = null;
  try{
    byte[] data = new byte[is.available()];	is.read(data);
    String docData = new String(data); 
	
    rs = sqlgetNewId.executeQuery();
    rs.next();
    int newRowId = rs.getInt( 1 );
    //insert the row
    sqlInsertRow.setInt( 1 , newRowId);
    sqlInsertRow.setString( 2 , docName);
    sqlInsertRow.setString( 3 , docName);
    //Empty lob with no connection to db but it is NOT null
    oracle.sql.CLOB emptyClob = oracle.sql.CLOB.empty_lob();
    sqlInsertRow.setClob( 4 , emptyClob);
    int result = sqlInsertRow.executeUpdate();
    
    //update the row
    sqlGetEmptyClob.setInt( 1 , newRowId);
    rs = sqlGetEmptyClob.executeQuery(); //get rs containing the clob to be updated
    rs.next();
    Clob clobFromTable = rs.getClob( 1 ); //get the clob from rs
    ( (oracle.sql.CLOB)clobFromTable ).putChars(  1  , docData.toCharArray() ); //update the clob
     rs.close();
    conn.commit();
    System.out.println("executed succesfully part2");
  }
  catch(Exception ex){
    ex.printStackTrace();
    conn.rollback();
  }
}
...
Рейтинг: 0 / 0
JDBC: "Превышен размер данных, разрешенный для этого типа"
    #34559328
Romanzek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А драйвер какой используешь? Надо ojdbc14.jar подключать и в режиме не thin драйвера, а oci. Должно получиться.
...
Рейтинг: 0 / 0
JDBC: "Превышен размер данных, разрешенный для этого типа"
    #34559777
Kyamranbey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня сделано так:
Connection conn = new OracleDriver().defaultConnection();

Буду признателен если приведете пример как это сделать...
както с этим не сталкивался не разбирался...
...
Рейтинг: 0 / 0
JDBC: "Превышен размер данных, разрешенный для этого типа"
    #34560891
Kyamranbey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может кто-нибудь еще сталкивался и может помочь советом?
...
Рейтинг: 0 / 0
JDBC: "Превышен размер данных, разрешенный для этого типа"
    #34561548
biomen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам garry_k подробно написал, как делается.
Вставляете строку с пустым лобом, получаете его локатор, затем в него пишите.
http://download-uk.oracle.com/docs/cd/B19306_01/java.102/b14355/oralob.htm#CHDFHHHG

пример коннекта

http://download-uk.oracle.com/docs/cd/B19306_01/java.102/b14355/getsta.htm#i1003811
...
Рейтинг: 0 / 0
JDBC: "Превышен размер данных, разрешенный для этого типа"
    #34563028
Kyamranbey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а для поля типа LONG это подойдет?
...
Рейтинг: 0 / 0
JDBC: "Превышен размер данных, разрешенный для этого типа"
    #34563161
Kyamranbey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при выполнении этого обрубает коннекцию... либо вообще валит базу...

Connection conn = null;
DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
String url = "jdbc:oracle:oci:@TEST";
conn = DriverManager.getConnection (url,"user","passw");

может кто-нить знает в чем проблема?

а так конечно через OCI в LONG можно и при помощи setString загнать > 32K.
но вот зараза ложит базы и всё...

помогите советом-просто не занимался этим раньше...


а вообще конечно хотелось бы обойтись без OCI и если ктото знает как обойти ограничения на 32К в 9ке используя не OCI, а используя DefaultConnection(как в 10ке - kprb как я понимаю) - буду благодарен...
а потоки тут не причем тк на setString JDBC переключает сам на setBinaryStream or setCharacterStream.

вот... ну хотябы с OCI подскажите почему валит базу... для 9-к будет тогда OCI
...
Рейтинг: 0 / 0
JDBC: "Превышен размер данных, разрешенный для этого типа"
    #34566766
Kyamranbey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle 9.2.0.6.0
PL/SQL + Java
Проблема такая:
Пытался разными путями выполнить соединение используя OCI.
При выполнении процедуры либо разрывает текущую сессию из которой запускал процедуру либо ложит базу.

делал такие варианты:
1.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
OracleDataSource ods = new OracleDataSource();
ods.setDriverType("oci");
ods.setServerName("Имя сервера или IP");
ods.setNetworkProtocol("tcp");
ods.setServiceName("Сервайс");
ods.setPortNumber( 1521 );
ods.setUser("юзер");
ods.setPassword("пароль");
Connection conn = ods.getConnection();
2.
Код: plaintext
1.
2.
String url = "jdbc:oracle:oci:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(PORT=1521) (HOST=Имя сервера или IP))(CONNECT_DATA=(SERVICE_NAME=Сервайс)))";
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection(url);
и так тоже делал:
3.
Код: plaintext
1.
2.
String url = "jdbc:oracle:oci:@TNS_NAME"; 
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection(url);
Интересно то, что это выполнялось и даже данные добавлялись в базу(используя стейтменты).
Но при повторе выполнения либо разрывается сессия с которой запускаешь или просто падает база.
Пытались увеличить параметры типа java_pool_size и т.д. а также табличные пространства
не помогло.

Подскажите пожалуйста где и что нужно смотреть или покрутить.

Заранее благодарен!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC: "Превышен размер данных, разрешенный для этого типа"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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