Oracle clob добавить строку
У меня возникли некоторые реальные проблемы с 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 является ориентированным на соединение, обеспечивая высокую надежность услуг. На обоих концах (клиенты и терминалы сервера) должны иметь один или более гнезда, так что передающий.
Читайте также: