операции с BLOB-данными в Informix - PullRequest
2 голосов
/ 17 декабря 2010

Как мы можем использовать операции с подстрокой, обрезкой, длиной для некоторого текста типа данных blob.И как мы можем обновить столбец типа данных blob с помощью запроса?

Спасибо,

Ответы [ 3 ]

3 голосов
/ 17 декабря 2010

С трудом!

Прежде всего, о каком из 4 различных типов BLOB-объектов вы обсуждаете:

  • BYTE
  • TEXT
  • BLOB
  • CLOB

Они приходят парами (как Лорды Ситхов): есть двоичная версия (BYTE, BLOB) и текстовая версия (TEXT, CLOB). Также есть другая пара: старая (BYTE, TEXT) и более новая (BLOB, CLOB). Типы BYTE и TEXT были введены с Informix OnLine 4.00 примерно в 1989 году. Типы BLOB и CLOB были представлены с Informix Universal Server 9.00 в 1996 году и также известны как SmartBlobs.

Однако есть очень реальный смысл, в котором не имеет значения, к какому типу вы относитесь.

Существует очень мало операций, которые могут быть выполнены с BLOB-объектами и байтами TEXT. Их можно извлекать и хранить, но для всех практических целей это все. Я полагаю, что вы можете использовать ДЛИНУ для определения длины BLOB-объекта TEXT. Я не верю, что есть какие-либо методы для обновления части BLTE или BLEX-объекта; это замена «все или ничего». Кроме того, замена выполняется из переменной хоста соответствующего типа - нет литералов BYTE или TEXT.

С SmartBlobs ситуация немного лучше, но я не эксперт по ним. Существуют механизмы для получения дескриптора LO (большого объекта), а затем манипулирования им, но я не думаю, что они доступны на стороне сервера (из SQL или SPL). Возможно, я умышленно не понимаю, что доступно со SmartBlobs, но я думаю, что операции доступны только из API программирования, а не в SQL. Также нет ни BLOB, ни CLOB-литералов. Однако вы можете использовать SQL для загрузки из файлов (FILETOBLOB, FILETOCLOB) и записи в файлы (LOTOFILE) - с файлами либо на сервере, либо на клиенте.

1 голос
/ 17 декабря 2010

Я уже ответил на ваш вопрос о подстроке: операция подстроки над текстом BLOB в Informix .С BLOB вы можете использовать оператор подстроки, но не SUBSTRING() или SUBST() функции.

Вы также можете использовать LENGTH(), но не TRIM().

Пример кода:

CREATE TABLE _text_test (id serial, txt_vch varchar(200),  txt_text text);
INSERT INTO _text_test (txt_vch, txt_text) VALUES ('1234567890', '1234567890');
SELECT txt_vch, txt_text, txt_vch[3,5], txt_text[3,5], length(txt_text) FROM _text_test;

В моем примере я использовал TEXT тип блоба (Джонатан показал вам больше типов блобов, вы должны показать нам, какой тип блоба вы используете в вопросе).Последний выбор показывает использование оператора подстроки и функции LENGTH().Вы можете заменить функцию LENGTH() другими функциями, такими как TRIM(), чтобы протестировать ее в своей среде.В моем случае TRIM() тест заканчивается:

ODBC Error: -880 [Informix][Informix ODBC Driver][Informix]
Trim character and trim source must be of string data type.

Последний выбор хорошо работает с драйвером JDBC 3.70JC1, но кажется, что драйвер ODBC 3.70TC1 имеет ошибку и показывает 3 первых символа: 123 вместо345.Попробуйте сами.

0 голосов
/ 05 марта 2015

В последней версии (12.10) есть пакет DBMS_LOB Однако он не работает так, как задокументировано: например, нет функции dbms_lob.get_length.Вместо этого я обнаружил, что dbms_lob_get_length работает как положено.Поэтому для полей CLOB у вас есть следующие полезные операции:

  • dbms_lob_get_length;
  • dbms_lob_instr;
  • dbms_lob_substr (к сожалению, он получает данные и после get_length);

Я также нашел одну недокументированную, но очень и очень полезную функцию: dbms_lob_new_clob, которая получает аргумент lvarchar и преобразует его в CLOB.Я знаю, что этот ответ очень поздно.Я думаю, что это может быть полезно для других людей, ищущих способы обработки больших двоичных объектов в Informix (я нашел этот пост несколько дней назад, когда начинал мини-исследование об использовании больших двоичных объектов для хранения XML).

...