Oracle clob добавить строку

Обновлено: 06.07.2024

У меня возникли некоторые реальные проблемы с PL/SQL.

Я написал хранимую процедуру, которая подготавливает запись из XML и вставляет ее в таблицу базы данных.

Это компилируется чисто для ввода одной записи. Но я ищу способ вставить все записи большого файла XML и не могу понять, как сделать так, чтобы внешний вид функционировал правильно.

Вот код, который работает для ввода одной записи:

Вы можете видеть, что я прокомментировал свою неудачную попытку зацикливания. Может ли кто-нибудь помочь мне здесь, почему мой цикл через XML, чтобы затем сделать вставку, не работает?

Обновление - вот пример XML

Я попробовал следующее - значительно упростив структуру XML - включая два reocrds, которые будут вставлены в базу данных.

Единственная вставка (с единственной записью в XML) работает просто отлично, но именно та вставка, где у меня есть две, терпит неудачу.

Я получаю следующую ошибку:

ORA-19279: XPTY0004 - XQuery динамическое несоответствие типа: ожидаемая последовательность singleton - полученная многопозиционная последовательность

ORA-06512: в строке 67

ORA-06512: в строке 67

ORA-06512: в строке 121

ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ

Это тот самый рабочий

2 ответа

Я отлаживаю пакет Oracle с помощью разработчика PL/SQL, но столкнулся с проблемой - один из параметров - это CLOB (это большая задница XML). Я могу передать его со стороны приложения и сделать его CLOB, но в отладчике PL/SQL я помещаю строковое представление XML в отладчик, чтобы proc в пакете.

Пожалуйста, предположим, что у меня есть поле CLOB в таблице Oracle, в которой я сохранил сценарий создания package/procedure/function. Я хотел бы удалить все пробелы в конце каждой строки , но: а) DBMS_LOB.TRIM (поле CLOB) - это процедура, а не функция; б) RTRIM (CLOB) не терпит неудачи, но не.

Это работает для одного узла dortoSalesInputIF:

Если вы поставите свой xml между f.e:

этот код также будет работать

Моя хранимая функция создает временный экземпляр LOB, используя: Dbms_Lob.CreateTemporary(BUFFER, TRUE, Dbms_Lob.SESSION); , где BUFFER -локальная переменная CLOB . После этого функция заполняет BUFFER некоторыми данными и возвращает их. Параметр длительности Dbms_Lob.CreateTemporary в моем случае.

Я сделал эту функцию pl sql, чтобы получить данные oracle в формате xml. Но я получил эту ошибку: PL/SQL: ORA-00932: несогласованные типы данных: ожидаемый CLOB got - вот мой код pl sql: create or replace PACKAGE PAYROLL AS FUNCTION get_all_payroll_transactions return clob; END PAYROLL; FUNCTION.

Вот пример, который вы должны иметь возможность обновить, чтобы добавить в rest ваших столбцов:

Это работает с документами XML, которые содержат один узел "dortoSalesInputIF", а также несколько, как я вам показал. Я также передал два документа XML за один раз, предполагая, что ваш XML хранится в таблице (вы бы заменили ссылки на "your_xml" своим именем таблицы, если это так).

В противном случае, если XML передается в качестве параметра, вы можете просто передать параметр непосредственно в XMLTABLE - т. Е. Вам не нужно будет присоединяться, просто сделайте это:

После того, как у вас есть оператор select, вы можете использовать его в операторе insert, например:

Это будет быстрее, чем ваша процедура "извлечение строки, извлечение данных в переменные, вставка строки в таблицу", поскольку база данных выполняет всю тяжелую работу без переключения контекста между SQL и PL/SQL, и без передачи данных.

Добавить вставку в PL/SQL легко; вы просто вставляете ее в begin/end,, вот так:

(Вам не понадобятся create or replace или / , если это процедура внутри пакета.)

Похожие вопросы:

Я застрял на проблеме с использованием статического метода класса java в базе данных Oracle 11g, называемой via PL/SQL: У меня есть класс java, который содержит метод, который выглядит следующим.

Мне нужно экспортировать таблицу, имеющую тип данных столбца, как clob. Мне нужны скрипты вставок для этой таблицы. Но я получаю следующую ошибку, когда пытаюсь экспортировать таблицу из.

Если я использую много переменных CLOB в хранимой процедуре PL/SQL для хранения многих длинных строк, есть ли какие-либо проблемы с производительностью? Является ли длина CLOB также переменной.

Я отлаживаю пакет Oracle с помощью разработчика PL/SQL, но столкнулся с проблемой - один из параметров - это CLOB (это большая задница XML). Я могу передать его со стороны приложения и сделать его.

Пожалуйста, предположим, что у меня есть поле CLOB в таблице Oracle, в которой я сохранил сценарий создания package/procedure/function. Я хотел бы удалить все пробелы в конце каждой строки , но: а).

Моя хранимая функция создает временный экземпляр LOB, используя: Dbms_Lob.CreateTemporary(BUFFER, TRUE, Dbms_Lob.SESSION); , где BUFFER -локальная переменная CLOB . После этого функция заполняет.

Я сделал эту функцию pl sql, чтобы получить данные oracle в формате xml. Но я получил эту ошибку: PL/SQL: ORA-00932: несогласованные типы данных: ожидаемый CLOB got - вот мой код pl sql: create or.

У меня есть строка base64 изображения в столбце clob , которую я хочу сохранить в столбце типа varchar(max) в sql server . Я обращаюсь к sql server database с помощью ссылки db в базе данных oracle.

Я пытаюсь протестировать процедуру PL/SQL, которая принимает xml CLOB в качестве параметра PROCEDURE example_proc(ex_xml CLOB) IS BEGIN /* Find the second < (skip over declaration) */ ln_position.

Я пишу процедуру PL / SQL, которая будет проверять файлы типа XML на соответствие схеме. Документы XML хранятся в базе данных Oracle в таблице XMLType XML_TABLE с одним столбцом SYS_NC_ROWINFO$ .

Я хотел бы добавить большую строку (более 76 тыс. Символов) в столбец CLOB в базе данных Oracle. Мне нужно запустить скрипт из фреймворка Liquibase. Как этого добиться?

Простая вставка INSERT INTO table_clob (clob_column) VALUES (to_Clob('string above 72000 chars. ')); с и без to_clob() метод возвращает исключение, например:

ORA-01704: слишком длинный строковый литерал

Выполните поиск в Google, но не нашел решения для моих требований. Любой совет?

Этого недостаточно, так как мне нужно вручную вырезать текст на 3 фрагмента (около 30 тыс. Символов), но он работает. Теперь просто нужно понять, как это сделать динамически в случае, если строка будет иметь разную длину символов (например, более 10 тыс. Символов).

1 ответ

Жестко запрограммированная строка, заключенная в одинарные кавычки, называется строковым литералом . Пример: 'Hello world' . Другой пример - очень длинная строка, которую вы пытаетесь вставить в таблицу. Напротив, 'abc' || 'def' является строковым выражением, но не строковым литералом . Точно так же to_char(sysdate, 'yyyy-mm-dd') - строковое выражение, но не литерал . «Буквальный» означает постоянный жестко запрограммированный текст.

Проблема, с которой вы столкнулись, не имеет ничего общего с insert , to_clob() или типом данных столбцов в вашей таблице и т. Д. Она имеет отношение только к самому строковому литералу.

В Oracle строковый литерал может иметь длину не более 4000 байтов (или 32767 байтов, если база данных настроена с расширенным MAX_STRING_SIZE ). ПЕРИОД! Этого не избежать.

Итак, вопрос в том, как вы можете получить такую ​​длинную строку, как та, которая у вас есть, в таблицу со столбцом CLOB . Ответ зависит от того, как вы получаете строку в первую очередь. Лучшим вариантом было бы, если бы он уже был разбит на фрагменты - в виде набора строк с тегом (id), чтобы отслеживать, какой фрагмент принадлежит какому CLOB, и порядковым номером (чтобы показать, является ли это первым фрагментом, вторым и т. д.) Затем вы могли бы повторно собрать их, используя TO_CLOB() на первом фрагменте плюс оператор конкатенации.

Если ваш процесс состоит в том, чтобы ввести 72000 символов на клавиатуре, вам нужно будет ввести 4000 из них за раз, заключить в одинарные кавычки и использовать оператор конкатенации (по сути, выполняя вручную то, что я описал выше). Вам также придется использовать TO_CLOB() для первого фрагмента (иначе конкатенация не удастся).

Другой вариант состоит в том, чтобы строка поступала как значение из некоторого приложения, которое поддерживает длинные строки (что-то совместимое с CLOB Oracle) и которое может передавать такие значения в базу данных Oracle без необходимости полностью записывать жестко закодированную строку .

У меня есть текст, хранящийся в таблице базы данных, много коротких строк длиной около 70-90 символов. (по историческим причинам). Я хочу добавить эти поля (строки) в CLOB в APEX (CKEditor), и он во многих случаях превышает 32k. Я пытался во многих отношениях, но это, кажется, какой-то предел. Мой код работает нормально, пока текст меньше 32 КБ! Мой план - сохранить его в новой таблице и использовать вместо него clob. У меня есть APEX 5.01. Я получаю «ORA-06502: PL / SQL: ошибка числового значения или значения», когда он превышает 32 КБ.

3 ответа

Проблема в последней строке вашего кода. Все переменные состояния сеанса (например, P10_WP ) имеют VARCHAR2 и ограничены 32767 символами. Вы можете видеть это в вызывающих их функциях APEX (пример ) . Таким образом, вы не можете назначить более 32 тыс. Символов для элемента страницы PL / SQL .

Но очевидно, что вы можете поместить более 32 тыс. Символов в элемент HTML-формы! Так что это неловкий обходной путь - вы должны получать данные clob внутри и вне элемента формы HTML без использования элементов страницы APEX. Обычно это делается путем записи clob в Collection, а затем с помощью AJAX-вызовов к процессу приложения для его извлечения, поскольку у JavaScript нет проблем с ограничениями символов.

Похоже, что вы частично продвинулись там с вашей коллекцией TEXT , но вам все равно придется написать собственный процесс приложения по требованию, чтобы вы могли загрузить коллекцию в JavaScript и поместить ее в элемент формы HTML оттуда. Будет проще, если вы используете встроенную функциональность apex.ajax.clob с коллекцией CLOB_CONTENT .

Я просмотрел несколько статей об этом и это довольно хорошо написано и просто.

Короткая версия состоит в том, чтобы изменить имя вашей коллекции в вашем коде на CLOB_CONTENT , затем поместить эту функцию JavaScript на свою страницу и вызвать ее.

PL / SQL предоставляет пакет dbms_lob для манипулирования этим типом данных. Для решения аналогичной проблемы в другой технологии (zope / python), которую я рассмотрел, было создание фреймворка: для чтения из базы данных он возвращал данные в виде многострочных строк. ,

PL / SQL в APEX ограничены 32k, pl / sql рассматривает clobs как varchar и все. Моя проблема не может быть решена в рамках APEX

(1) В Oracle есть тип, называемый типом большого объекта, который делится на двоичный двоичный объект и тип символьных символов, который используется для хранения символьных строк, превышающих 4000 (ограничение длины varchar2 составляет 4000 байтов), представляющее Существует фронт-джонс стиль. Так что это приносит нам проблему вставки и обновления данных. Когда данные меньше 4000, Oracle автоматически преобразует символьную строку в тип большого объекта. Когда данные больше 4000, выполняется другой тест.
Вставка Oracle clob: объясните встречающиеся ямы, CLOB не может использовать jdk, поставляется с clob, вам нужно использовать CLOB в OJDBC14.jar (пакет руководства - import oracle.sql.CLOB ;)

Этот метод фактически используется в настоящее время для разработки, и есть другие методы, которыми можно поделиться.
(2) В этом блоге ранее упоминалось, что обновление и вставка сгустка Oracle одинаковы, но после практики считается неудачным. (1) Успешное обновление после вставки происходит потому, что для поля сгустка установлено значение empty_clob (). В реальной ситуации значение поля clob может быть пустым, поэтому вводится метод модификации и обновления clob.

Используйте это, чтобы обновить предыдущие ошибки —__—!

Интеллектуальная рекомендация


Michael.W Поговорите о Hyperledger Fabric. Проблема 20 - Подробная индивидуальная сортировка узла с пятью порядками с исходным кодом для чтения.

Michael.W Поговорите о Hyperledger Fabric. Проблема 20 - Подробная индивидуальная сортировка узла с пятью порядками с исходным кодом чтения Fabric Файл исходного кода одиночного режима находится в ord.


Мяу Пасс Матрица SDUT

Мяу Пасс Матрица SDUT Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description Лянцзян получил матрицу, но эта матрица была особенно уродливой, и Лянцзян испытал отвращение. Чт.


Гессенская легкая двоичная структура удаленного вызова

Hessian - это легкая двоичная структура удаленного вызова, официальный адрес документа, в основном он включает протокол удаленного вызова Hessian, протокол сериализации Hessian, прокси-сервер клиента .


TCP Pasket и распаковка и Нетти Solutions

Основные введение TCP является ориентированным на соединение, обеспечивая высокую надежность услуг. На обоих концах (клиенты и терминалы сервера) должны иметь один или более гнезда, так что передающий.

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