Тип данных оракула Clob

Обновлено: 30.06.2024

Все базы данных опираются на типы данных: строки, числа и даты. И поэтому я полагаю, что примерно ко второму дню работы с Oracle вы начнете достаточно комфортно работать с типами данных VARCHAR2, NUMBER и TIMESTAMP. И это хорошо, знакомство с этими тремя типами данных поможет вам в освоении

Все базы данных опираются на типы данных: строки, числа и даты. И поэтому я полагаю, что примерно ко второму дню работы с Oracle вы начнете достаточно комфортно работать с типами данных VARCHAR2, NUMBER и TIMESTAMP. И это хорошо, знакомство с этими тремя типами данных поможет вам в карьере по работе с базой данных Oracle.

Однако существует множество типов данных "вторая строка", с которыми вы, вероятно, тоже захотите ознакомиться. Это как когда встречаешь кого-то и влюбляешься. Конечно, вы хотите знать все о прекрасном человеке, в которого вы влюблены, но, чтобы по-настоящему узнать его, разве вам не нужно немного узнать о его семье?< /p>

Итак, вот некоторые из других типов данных Oracle — вот некоторые из их особенностей, и вот случаи, когда вы можете их использовать (я буду говорить только о символьных и числовых типах данных, а также о немного о больших объектах; я написал отдельную статью о различных типах данных даты).

Типы символов

Тип данных CHAR очень похож на своего более популярного родственника VARCHAR2. Единственная разница между ними заключается в том, что VARCHAR2 является переменным типом данных типа charcharacter, а CHAR всегда имеет фиксированную длину. А когда строка не достигает заданной фиксированной длины, CHAR дополняет ее пробелами. Я покажу вам, что я имею в виду; давайте создадим таблицу со столбцом CHAR и VARCHAR2.

Если мы вставим строку длиной менее 10 символов в оба столбца и запросим таблицу, мы сразу не заметим разницы.

Однако, если мы запросим у Oracle длину каждой строки, мы заметим кое-что любопытное.

Причина этого несоответствия становится очевидной, если мы соединим символ, скажем, x, в начале и в конце каждого поля.

Столбцы CHAR, как я уже говорил ранее, дополняются пробелами справа. Это может пригодиться однажды в вашей карьере (иногда мне приходилось генерировать файлы фиксированной длины, и я использовал CHAR в таких случаях), однако многие эксперты советуют вам избегать CHAR. Из-за своей негибкой длины он может занимать место на диске (по сравнению с VARCHAR2), и нет ничего такого, чего не мог бы сделать rpad (varchar2).

Однако CHAR — не самый ненавистный символьный тип данных. Эта сомнительная честь предназначена для…

Самые первые слова в документации Oracle по типу данных LONG: «Не создавайте таблицы с столбцами LONG». Это связано с тем, что этот тип данных устарел и включается в каждую последующую версию базы данных только для обеспечения обратной совместимости. Однако я, должно быть, сделал что-то очень плохое в прошлой жизни, потому что я часто работал с базами данных, где другие разработчики в своей «мудрости» решили использовать ДЛИННЫЕ столбцы.

Что же такого плохого в LONG, спросите вы.

Для начала в таблице может быть только один ДЛИННЫЙ столбец. И если этого недостаточно, вы не можете использовать этот столбец LONG в предложении where; это просто не разрешено. Это также не разрешено в вашем предложении group by, or order by или в отдельном. И это еще не все — хранимые функции не могут возвращать LONG.

Поэтому никогда не используйте LONG. И если вы когда-нибудь столкнетесь с ДЛИННЫМ столбцом в базе данных, с которой работаете, найдите минутку, чтобы проклясть дурака, который его использовал, а затем помните о его ограничениях.

Не создавайте таблицы с ДЛИННЫМИ столбцами, говорится в документации Oracle; вместо этого используйте столбцы больших объектов (CLOB, NCLOB).

Большие объекты персонажей — CLOB для их друзей — могут хранить до 4 ГБ данных. Это сумасшедший объем данных — около 260 000 страниц MS Word; это делает 32767 символов, которые VARCHAR2 может удерживать, кажутся крошечными, как двухлетняя девочка, плачущая под дождем.

Не знаю, как у вас, но на самом деле у меня не так много документов Word на 260 000 страниц, которые мне нужно сохранить, поэтому мой совет: если вы не знаете, что ваш текст превысит ограничение в 32 767 символов, вам следует придерживаться с VARCHAR2. CLOB не страдают от глупых ограничений, которые портят LONG, но они все же несут небольшие потери производительности по сравнению с VARCHAR2.

Кроме того, вы можете использовать ряд конструкций SQL, которые вы используете с VARCHAR2, с CLOB. Я покажу тебе; давайте начнем с создания таблицы с двумя столбцами CLOB (чего мы не смогли бы сделать с помощью LONG).

CLOB означает большой символьный объект. SQL Clob — это встроенный тип данных, который используется для хранения больших объемов текстовых данных.Используя этот тип данных, вы можете хранить данные длиной до 2 147 483 647 символов.

Интерфейс java.sql.Clob API JDBC представляет тип данных CLOB. Поскольку объект Clob в JDBC реализован с использованием локатора SQL, он содержит логический указатель на SQL CLOB (а не на данные).

База данных MYSQL поддерживает этот тип данных с помощью четырех переменных.

TEXT: тип CLOB с максимальной длиной 216–1 (65 535) символов.

MEDIUMTEXT: тип CLOB с максимальной длиной 224-1 (16777215) символов.

LONGTEXT: тип CLOB с максимальной длиной 232-1 (4294967295) символов.

Сохранение типа данных Clob в таблице базы данных

Чтобы сохранить тип данных Clob в базе данных, с помощью программы JDBC выполните шаги, указанные ниже

Шаг 1. Подключитесь к базе данных

Вы можете подключиться к базе данных с помощью метода getConnection() класса DriverManager.

Подключитесь к базе данных MySQL, передав URL-адрес MySQL, который имеет вид jdbc:mysql://localhost/sampleDB (где sampleDB — это имя базы данных), имя пользователя и пароль в качестве параметров метода getConnection().

Шаг 2. Создайте подготовленный оператор

Создайте объект PreparedStatement с помощью метода prepareStatement() интерфейса Connection. В этот метод передайте запрос на вставку (с заполнителями) в качестве параметра.

Шаг 3. Установите значения для заполнителей

Задайте значения заполнителей с помощью методов установки интерфейса PreparedStatement. Выберите методы в соответствии с типом данных столбца. Например, если столбец имеет тип VARCHAR, используйте метод setString(), а если он имеет тип INT, вы можете использовать метод setInt().

И если это тип Clob, вы можете установить для него значение, используя методы setCharacterStream() или setClob(). В эти методы передается целочисленная переменная, представляющая индекс параметра, и объект класса Reader в качестве параметров.

Шаг 4. Выполните инструкцию

Выполните созданный выше объект PreparedStatement с помощью метода execute() интерфейса PreparedStatement.

Получение большого двоичного объекта из базы данных

Метод getClob() интерфейса ResultSet принимает целое число, представляющее индекс столбца (или строковое значение, представляющее имя столбца), извлекает значение в указанном столбце и возвращает его в виде Объект Clob.

Метод getCharacterStream() интерфейса Clob извлекает содержимое текущего объекта Clob и возвращает его как объект Reader.

Используя метод getClob(), вы можете получить содержимое Clob как объекта Reader и создать текстовый файл с извлеченным содержимым, используя метод write() объекта FileOutputStream.

Пример

В следующем примере создается таблица в базе данных MySQL с типом данных Clob. Вставляет в него большие текстовые данные из файла. Извлекает текст обратно и сохраняет его в другом текстовом файле.

В Oracle тип данных CLOB хранит символьные данные переменной длины (большие символьные объекты) в наборе символов базы данных, который может быть однобайтным или многобайтовым (поддерживает более 4 ГБ).

Оракул:

Тип данных CLOB – обзор преобразования

Oracle SQL Server
Синтаксис CLOB VARCHAR(max)
Максимальный размер 4 ГБ * db_block_size 2 ГБ
Строковые литералы в DML
Вставить пустое значение EMPTY_CLOB() '' (пустая строковая константа)
Получить длину LENGTH() В символах LEN() В символах
DBMS_LOB.GETLENGTH() DATALENGTH() В байтах
Набор символов База данных
Поддержка транзакций
Альтернативы < /td> NCLOB UTF-8 или UTF-16 NVARCHAR2(max) Un icode UCS-2
LONG Устарело
ТЕКСТ Устарело
NTEXT Юникод UCS-2, устарело < img class="lazyload" data-src="https://www.sqlines.com/_media/exclamation.jpg" />

Последнее обновление: Oracle 11g Release 2 и Microsoft SQL Server 2012.

Тип данных CLOB – сведения о конверсии

Обратите внимание, что если вы используете '' (пустую строку) в операторе INSERT, Oracle вставит NULL:

Оракул:

Содержимое таблицы в Oracle:


Обратите внимание, что вам может потребоваться заменить '', используемый в операторах INSERT для Oracle, на NULL в операторах INSERT для SQL Server, чтобы получить те же результаты, что и для Oracle:

Содержимое таблицы в SQL Server:


Получить длину CLOB

В Oracle вы можете использовать функцию LENGTH() или DBMS_LOB.GETLENGTH(), чтобы получить длину столбца CLOB в символах.

Существует функция LENGTHB() для получения длины в байтах, но ее можно использовать только для однобайтовых CLOB, поэтому она возвращает тот же результат, что и LENGTH().

Оракул:

Вы можете видеть, что и LENGTH(), и DBMS_LOB.GETLENGTH() возвращают 0 для пустого CLOB и NULL, если CLOB равен NULL:


Как и в Oracle, обе функции LEN() и DATALENGTH() возвращают 0 для пустого значения и NULL, если VARCHAR(max) равен нулю:


Как определить набор символов базы данных, используемый для CLOB

В Oracle столбцы CLOB хранятся в наборе символов базы данных, который определяет, сколько байтов можно использовать для хранения одного символа CLOB.

Вы можете использовать следующий запрос, чтобы определить, какой набор символов базы данных используется вашей базой данных Oracle для типов данных CHAR, VARCHAR и CLOB:

Оракул:

В этом примере была возвращена кодировка UTF-8 (это значение по умолчанию для Oracle 11g). Также в странах Западной Европы многие установки Oracle используют WE8ISO8859P1 (Latin-1) в качестве набора символов базы данных.

Хранилище CLOB

Если вы включите параметр ENABLE STORAGE IN ROW (это значение по умолчанию), Oracle хранит данные CLOB размером до 4000 байт в строке. Данные размером более 4000 байт всегда хранятся во внешнем хранилище, и вы можете указать другое табличное пространство и характеристики хранения.

Согласно документации столбцы типов данных CLOB и NCLOB могут хранить до 8 терабайт символьных данных.

У меня есть текст, который содержит 100 000 символов, как я могу выполнить такой запрос:

Если в тексте количество символов не превышает 32767, можно использовать анонимный блок PL/SQL:

Что делать, если текст очень большой и содержит, например, 100 000 символов?

обновить

Я пытаюсь использовать dbms_lob.append :

Тем не менее, также возникла ошибка: строковый литерал слишком длинный.

Я делаю что-то не так?

Откуда берутся эти данные? Ввод 100 тыс. символов был бы плохим выбором, поэтому прямой SQL или анонимный блок PL/SQL не являются хорошей идеей. Если данные находятся в файлах, вы можете использовать UTL_FILE напрямую. Если данные поступают из приложения, вы можете использовать любой язык, на котором они написаны, для прямого взаимодействия с объектами clob.

3 ответа 3

Вы должны использовать пакет dbms_lob, процедура добавления строки в clob — dbms_lob.append .


Спасибо, я пытаюсь использовать dbms_lob.append , хотя также получил ошибку: строковый литерал слишком длинный . См. соответствующее обновление.

Varchar ограничен 32 тысячами символов. Ваша переменная c2 не может содержать 100 тыс. символов. Вы должны вызывать функцию append несколько раз, каждый раз добавляя не более 32 000 символов.

Техническое примечание. Если вы пропустите присваивание c1 := 'abc' и если вы измените объявление с помощью c1 clob := EMPTY_CLOB(), вы получите ошибку INVALID LOB LOCATOR. Clob всегда должен иметь непустое значение.

Я нашел этот вопрос, когда гуглил, как добавлять данные в CLOB. Для моей конкретной проблемы я использую устаревшую систему PL/SQL, в которой я не могу использовать пакет dbms_lob, поэтому я подумал, что поделюсь своим ответом на благо других в моей ситуации.

Решение. Используйте функцию CONCAT Oracle в запросе SELECT, функция CONCAT работает для типа данных CLOB`. Например (на примере @AlenOblak):

Надеюсь, это поможет.

Мне удалось решить эту проблему с помощью функции импорта данных в Oracle SQL Developer:

  1. Создайте файл .dsv с большой строкой и другими атрибутами.
  2. Просто нажмите на таблицу и выберите "Импорт данных".
  3. Выберите файл
  4. В мастере импорта данных, шаг 1: выберите правый разделитель, разделитель строк, ограничение строки, символы-контейнеры и т. д.
  5. Шаг 2. Метод импорта = Вставка. Шаг 3. Сопоставьте столбцы файла и таблицы друг с другом.
  6. Шаг 4. Запустите импорт данных


Не тот ответ, который вы ищете? Просмотрите другие вопросы с тегами oracle oracle11g lob или задайте свой вопрос.

Связано

Связанные

Горячие вопросы о сети

Чтобы подписаться на этот RSS-канал, скопируйте и вставьте этот URL-адрес в программу для чтения RSS.

дизайн сайта / логотип © 2022 Stack Exchange Inc; вклады пользователей под лицензией cc by-sa. версия 2022.3.22.41738

Читайте также: