powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Нужны примеры работы с большим LOB
7 сообщений из 7, страница 1 из 1
Нужны примеры работы с большим LOB
    #39816020
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не так давно начал работать с DB2, до этого работал с несколькими другими базами. Некоторые вещи просто приводят в ступор, не ожидал такого от ИБМ. Есть таблица с полем CLOB, большинство записей небольшие,но есть и побольше. Насколько - не знаю, поскольку пакет DBMS_LOB работает с LOB длинной только до 10M, и я получаю
SQL Error [22001]: Value "******************************************" is too long.. SQLCODE=-433, SQLSTATE=22001
при выполнении
SELECT t.feature_id, DBMS_LOB.GETLENGTH(t.RESIDUES) AS len FROM feature t
Я не могу даже размер LOB узнать, если он больше 10Mб! Есть ли какие-нибудь пакеты на C или JAVA для работы с LOB в DB2?
Опять же в тех примерах, которые уже нашёл, предланалт создавать переменные типа CLOB(2G). Это что, весь LOB за раз в память тащить? Так и базу в своп свалить недолго. Может, я чего-то не понимаю? Версия 11.2 LUW.
...
Рейтинг: 0 / 0
Нужны примеры работы с большим LOB
    #39816142
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergei.Agalakov,

Так работает?
Код: sql
1.
SELECT t.feature_id, LENGTH(t.RESIDUES) AS len FROM feature t 
...
Рейтинг: 0 / 0
Нужны примеры работы с большим LOB
    #39816385
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergei.AgalakovНе так давно начал работать с DB2, до этого работал с несколькими другими базами. Некоторые вещи просто приводят в ступор, не ожидал такого от ИБМ. Есть таблица с полем CLOB, большинство записей небольшие,но есть и побольше. Насколько - не знаю, поскольку пакет DBMS_LOB работает с LOB длинной только до 10M, и я получаю
SQL Error [22001]: Value "******************************************" is too long.. SQLCODE=-433, SQLSTATE=22001
при выполнении
IBM заставляет Вас использовать LOB LOCATORs, и это (обычно) правильно.

Для C смотрите:
sqllib/samples/c/dtlob.sqc
sqllib/samples/cli/dtlob.c

Для ODBC/CLI "словами":
LOB locators in CLI applications

Для Java смотрите
тут - LOB locators with the IBM Data Server Driver for JDBC and SQLJ
и тут - Progressive streaming with the IBM Data Server Driver for JDBC and SQLJ
...
Рейтинг: 0 / 0
Нужны примеры работы с большим LOB
    #39816730
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein,
Спасибо, LENGTH работает, но мне надо подстроку искать и заменять, а там то же ограничение в 10Mb. Ну хоть узнал, что у меня есть CLOB на 220Mb. Начал писать свои функции на JAVA, пока получаю
Код: plaintext
1.
SQL Error [42724]: Java stored procedure or user-defined function "DB2INST1.GETLENGTH", specific name "SQL190522092641080" could not call Java method "getlength", signature "()I".. SQLCODE=-4306, SQLSTATE=42724, DRIVER=4.25.13
на элементарном
Код: java
1.
2.
3.
4.
5.
6.
import COM.ibm.db2.app.*;
public class JLOB extends UDF {
  public void getlength( int len) throws Exception {
   set( 1, (int) 42);
  }
}



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create OR replace function getlength()
RETURNS int
LANGUAGE java
EXTERNAL NAME 'JLOB!getlength'
FENCED THREADSAFE
NO SQL
NOT NULL CALL
DETERMINISTIC
NO EXTERNAL ACTION
DISALLOW PARALLEL
PARAMETER STYLE java;



разбираюсь, что не так. Пытаюсь следовать
JAVA routines
но пока где-то косячу.
...
Рейтинг: 0 / 0
Нужны примеры работы с большим LOB
    #39816741
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CawaSPb,
Спасибо за ссылки, не видел раньше. Смущает
Код: plaintext
1.
2.
A LOB object is also materialized when an application program performs any of the following actions, regardless of the progressiveStreaming or streamBufferSize settings:

Invokes a user-defined function with a LOB value as an argument

Calls a stored procedure with a LOB value as an input or output argument

Assigns a LOB host variable to a LOB locator host variable

в Progressive streaming with the IBM Data Server Driver for JDBC and SQLJ
Получается, что полноценная работа с большими LOB для DB2 возможна только вне базы. При попытке найти/заменить подстроку в CLOB 1Gb из хранимки придется материализовать весь LOB в переменную, отожрав 1 Gb памяти за раз. А если так звезды встали, что несколько пользователей решили это сделать одновременно? Может, есть какой-то обходной путь для использовния локатора в хранимках? Как-то у Оракла это все достаточно беспроблемно работало.
...
Рейтинг: 0 / 0
Нужны примеры работы с большим LOB
    #39817014
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergei.Agalakov,

А Вы что-то типа sqlj.install_jar('file:<path>/JLOB.jar', 'JLOB') делали?
(см. sqllib/samples/java/jdbc/ - udfcat, udfjcat, UDF*.java, UDF*.db2)

Про "LOB object is also materialized..." - там происходит "передача по значению", и такое поведение естественно.
Передовайте Primary Key соответствующей строки и формируйте LOB LOCATOR/используйте возможности progressive streaming внутри хранимки или UDF.

При этом у Вас получатся или более приближённые к бизнес-логике UDF/процедурки, или некоторый "фреймвок" со своими соглашениями, если Вы хотите сделать универсальный набор инструментов для работы с LOBами.
...
Рейтинг: 0 / 0
Нужны примеры работы с большим LOB
    #39817360
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CawaSPb,
Спасибо, хороший совет. Лучше б только ИБМ за меня этот код написала.
Я JAR не делал, пока обошёлся отдельной хранимкой. Так и не смог заставить работать с
Код: plaintext
PARAMETER STYLE JAVA
Внизу код, который работает у меня, может, кому ещё пригодится. Я пока на другое переключился, но, видимо, потом буду дописывать свой пакет для работы с LOB.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
//       ------  JLOB.class ----------
//import java.sql.*;
import COM.ibm.db2.app.*;

public class JLOB extends UDF
{
        public void getlength(COM.ibm.db2.app.Clob clob, long len) throws Exception
        {
        if ( null == clob) {
        set(2, 0);
        return;
        }
        long res = clob.size();
        set( 2, res );
        }

}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
-- on DB2

drop function getlength;
CALL SQLJ.REFRESH_CLASSES();

create OR replace function getlength(c1 CLOB(300M))
RETURNS bigint
LANGUAGE java
EXTERNAL NAME 'JLOB!getlength'
NO EXTERNAL ACTION
DETERMINISTIC
FENCED THREADSAFE
RETURNS NULL ON NULL INPUT
PARAMETER STYLE DB2GENERAL
NO SQL
SCRATCHPAD 10
FINAL CALL
DISALLOW PARALLEL
NO DBINFO

-- SELECT getlength(clob('sdjfbsdfbgkjsdh')) FROM SYSIBM.SYSDUMMY1
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Нужны примеры работы с большим LOB
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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