Elettracompany.com

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java clob sql

Наиболее эффективное решение для чтения CLOB в строку и String в CLOB в Java?

У меня есть большой CLOB (более 32kB), который я хочу прочитать в строку, используя StringBuilder. Как сделать это наиболее эффективным способом? Я не могу использовать конструктор «int length» для StringBuilder, так как длина моего CLOB больше, чем «int», и требует «длинного» значения.

Я не так удобен с классами ввода-вывода Java и хотел бы получить некоторые рекомендации.

редактироватьЯ пробовал с этим кодом clobToString ():

11 ответов

Я не могу использовать конструктор «int length» для StringBuilder Так как длина моего CLOB больше, чем int и long значение.

если длина CLOB больше, чем вписывается в int, данные CLOB также не будут вписываться в строку. Вам придется использовать потоковый подход для работы с этим количеством XML-данных.

если фактическая длина CLOB меньше, чем Integer.MAX_VALUE , просто силу long to int положить (int) перед он.

Ok я предположу общее использование, сначала вам нужно скачать Апач Коммонс, там вы найдете служебный класс с именем IOUtils, который имеет метод с именем copy ();

теперь решение: получите входной поток вашего объекта CLOB с помощью getAsciiStream() и передайте его методу copy ().

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

что случилось с:

например, Oracle oracle.sql.CLOB сделать getSubString() внутренних char[] , которая определена в oracle.jdbc.driver.T4CConnection и просто System.arraycopy() и далее оберните в String . Вы никогда не получите более быстрое чтение тогда System.arraycopy() .

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

Если вы действительно должны использовать только стандартные библиотеки,то вам просто нужно немного расширить решение Omar. (IOUtils Apache-это в основном просто набор удобных методов, которые экономят на большом количестве кодирования)

вы уже можете получить входной поток через clobObject.getAsciiStream()

вам просто нужно «вручную перенести» символы в StringWriter:

имейте в виду, что

  1. если ваш clob содержит больше символов, чем подойдет, это не сработает.
  2. оберните InputStreamReader и StringWriter с BufferedReader и BufferedWriter соответственно для повышения производительности.

Если используется Mule, ниже приведены шаги.

выполните следующие действия.

Включить потоковую передачу в соединителе, т. е. progressiveStreaming=2

Typecast DB2 вернул CLOB на java.язык SQL.Clob (IBM поддерживает этот тип cast)

преобразуйте это в символьный поток (поток ASCII иногда может не поддерживать некоторые специальные символы). Таким образом, вы можете использовать getCharacterStream()

это вернет объект» reader», который можно преобразовать в » String» использование common-io (IOUtils).

короче говоря, используйте groovy component и добавьте ниже код.

Примечание: здесь я предполагаю » полезную нагрузку.field1 » удерживает данные clob.

Передайте Oracle клобов от и до Java

Я пишу фрагмент кода, чтобы применить очень специфичную для клиента кодировку к данным XML. Сначала я пытался сделать это, используя только PL-SQL, но столкнулся с очень плохой производительностью (1 час на 160 записей). После этого я попробовал его только с java, который дал отличную производительность (400.000 записей за 1 минуту)

Теперь я хочу посмотреть, какова производительность, когда я строю код в Java и загружаю его в базу данных.

Для этого у меня есть следующий код:

Этот код может быть выполнен следующим образом:

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что мне нужно, чтобы функция выполнялась на больших частях данных, хранящихся в clobs. Я знаю, что есть класс java.sql.Clob, и я могу заставить его работать в качестве входного параметра, но я не могу заставить его работать в качестве выходного параметра, я постоянно сталкиваюсь с исключениями nullpointer.

Это код, с которым я работал:

Есть идеи, где я ошибаюсь?

4 Ответов

Аналогично вашей проблеме, у меня было требование вставить clob в базу данных Oracle из программы Java, запущенной в базе данных. Ни один из ответов здесь не сработал для меня полностью.

В конце концов я нашел решение, хитрость в том, чтобы использовать oracle.sql.CLOB

Этот подход я и обнаружил:

NullpointerException происходит из-за линии

Я действительно не знаю, как инициализировать Clob в этом случае. В учебнике вы используете свое соединение, вы делаете что-то вроде

Сначала вам нужно получить доступ к соединению JDBC. Из хранимой процедуры Java вы должны сделать это следующим образом :

Вы можете использовать createClob() метод java.sql.Connection для создания экземпляра объекта для представления вашего CLOB.

Хорошо, я пробовал это, но это не похоже на то, когда код java фактически хранится в базе данных Oracle. Я изменил код на:

Но когда я пытаюсь его скомпилировать, то получаю следующие ошибки:

XMLNUMERICENCODER:12: не удается найти символ

символ: метод createClob()

расположение: интерфейс java.sql.Connection

Типа CLOB xmlclob_out = conn.createClob();

Я также попытался создать соединение следующим образом: Connection conn = DriverManager.getConnection («jdbc:oracle:thin:@//localhost:1521/dbname», «username», «password»)

но это дало мне ту же ошибку.

Мне кажется немного странным, что мне нужно создать соединение, так как я уже нахожусь в базе данных.

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

У нас есть требование, когда клиент переносит свой oracle для поддержки ORACLE RAC (Real application cluster). Наше приложение написано в java и в настоящее время развернуто на weblogic. У нас есть.

Недавно я обнаружил разницу между Oracle добавляет месяцы к заданной дате (используя функцию ADD_MONTHS) и способом Java добавляет месяцы к календарному объекту. Например, в oracle: select.

Я хочу обновить свой jdk по некоторым причинам безопасности в системе Redhat и успешно обновился до jdk7u79 . Redhat опубликовал некоторые уязвимости java на своем сайте с именем Oracle java для.

Мы хотели бы синхронизировать данные (вставить, обновить) от Oracle (11g) до PostgreSQL (10). Наш подход был следующим: Триггер на таблице в Oracle обновляет столбец с nextval из последовательности.

У меня есть ETL-ложка, которая считывает таблицу из Postgres и записывает в Oracle. Никакой трансформации, никакого рода. SELECT от col1, поле col2 . col33 от стола. 350 000 строк на входе.

Я должен связаться с внешней процедурой Oracle, которая имеет sys_refcursor в качестве входного параметра: процедура merge_objects(p_table_name в varchar2, p_id_array в varchar2, p_cur_data в.

Является ли точность числового формата oracle, включая знак? Является ли Oracle NUMBER(3) от -999 до 999 или от -99 до 99? Считается ли знак цифрой в значении точности?

У нас есть большой объем данных, и мы хотим знать, как быстро он может быть записан в Oracle. Есть ли способ оценить пропускную способность записи от java до Oracle DB? Мы можем использовать любой.

Я пишу приложение Spring, где мне нужно вызвать внешнее задание и дождаться завершения задания (которое обновляет поле в таблице Oracle) — я думаю опросить таблицу до ее обновления. Может ли.

Собеседование по Java EE — SQL, JDBC (вопросы и ответы). Часть 2

Вторая часть Вопросов и ответов для собеседования о применении SQL, JDBC в Java приложениях.

к списку вопросов раздела JEE

Вопросы

31. Расскажите про Apache DBCP API.
32. Какие вы знаете уровни изоляции соединений в JDBC?
33. Что вы знаете о JDBC RowSet? Какие существуют различные типы RowSet?
34. В чем разница между ResultSet и RowSet?
35. Приведите пример наиболее распространенных исключений в JDBC.
36. Расскажите о типах данных CLOB и BLOB в JDBC.
37. Что вы знаете о «грязном чтении» (dirty read) в JDBC? Какой уровень изоляции предотвращает этот тип чтения?
38. Какие есть две фазы commit?
39. Приведите пример различных типов блокировки в JDBC.
40. Как вы понимаете DDL и DML выражения?
41. Какая разница между java.util.Date и java.sql.Date?
42. Как вставить изображение или необработанные данные в базу данных?
43. Что вы можете рассказать о фантомном чтении? Какой уровень изоляции его предотвращает?
44. Что такое SQL Warning? Как возвратить SQL предупреждения в JDBC программе?
45. Как запустить Oracle Stored Procedure с объектами базы данных IN/OUT?
46. Приведите пример возникновения java.sql.SQLException: No suitable driver found.
47. Best Practices в JDBC.

Читать еще:  Восстановление данных с флешки микро sd программа

Ответы

31. Расскажите про Apache DBCP API.

При использование DataSource для получения соединения с базой данных возникает проблема тесной связи кода с драйвером реализации DataSource. Кроме того, большинство из кода является шаблонно повторяющимся (т.н. boilerplate code), за исключением выбора класса реализации источника данных.

Apache DBCP API помогает нам избавиться от этих проблем, предоставляя реализацию DataSource, который работает в качестве уровня абстракции между нашей программой и различными драйверами JDBC. Библиотека Apache DBCP API основана на библиотеке Commons Pool library, поэтому необходимо удостовериться, что все необходимые зависимости правильно подключены к проекту.

32. Какие вы знаете уровни изоляции соединений в JDBC?

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

Когда мы используем транзакции в JDBC для обеспечения целостности данных, СУБД использует блокировки, чтобы заблокировать доступ других обращений к данным, участвующим в транзакции. Такие блокировки необходимы, чтобы предотвратить грязное чтение (Dirty Read), неповторяющиеся чтение (Non-Repeatable Read) и фантомное чтение (Phantom-Read).
Уровень изоляции транзакции JDBC используемый СУБД для механизма блокировки можно задать с помощью метода setTransactionIsolation() . Получить информацию о применяемом уровне изоляции поможет метод Connection getTransactionIsolation() .

33. Что вы знаете о JDBC RowSet? Какие существуют различные типы RowSet?

JDBC RowSet содержит табличные данные в более гибком формате по сравнению с ResultSet. Все объекты RowSet являются производными из ResultSet, так что они имеют все возможности ResultSet с некоторыми дополнительными функциями. RowSet интерфейс определяется в javax.sql пакета. Можно выделить следующие дополнительные функции, предоставляемые RowSet:

  • Функции похожие на Java Beans со свойствами и getset методами для работы с ними. RowSet использует модель событий JavaBeans. В результате можно посылать уведомления любого зарегистрированного компонента для таких событий, например, движение курсора, обновления / вставка / удаление из строки и изменять содержимое RowSet.
  • Объекты RowSet поддерживают скроллинг по данным (scrollable), а так же являются обновляемыми по умолчанию. Так что если СУБД не поддерживает скроллинг или обновляемый ResultSet, мы можем использовать RowSet, чтобы получить эти функции.

RowSet можно разделить на два типа:

  1. Connected RowSet Objects – эти объекты подключаются к БД и очень похожи на объекты ResultSet. JDBC API предоставляет только одно подключение объекта RowSet — javax.sql.rowset.JdbcRowSet и это является стандартной реализации класса com.sun.rowset.JdbcRowSetImpl .
  2. Disconnected RowSet Objects – эти объекты RowSet не требуют подключения к базе данных. Они более легковесные и могут быть сериализованы. Такие объекты хорошо подходят для передачи данных по сети. Существуют четыре реализации такого типа объектов (disconnected RowSet objects).

Кратко рассмотрим четыре реализации Disconnected RowSet Objects:

  • CachedRowSet — объекты могут получить соединение и выполнить запрос, считать данные ResultSet для заполнения данных RowSet. Мы можем управлять и обновлять данные на время отключения от БД и записать измененные данные при очередном подключении.
  • WebRowSet получены из CachedRowSet — такие объекты могут читать и записывать XML документы.
  • JoinRowSet получены из WebRowSet — могут образовывать SQL JOIN без подключения к источнику данных.
  • FilteredRowSet получены из WebRowSet — поддержка применения критериев фильтрации, поэтому видны только выбранные (полученные) данные.

34. В чем разница между ResultSet и RowSet?

Объекты RowSet являются производными из ResultSet, так что они имеют все возможности ResultSet с некоторыми дополнительными функциями. Одним из существенных преимуществ является возможность работы с данными без соединения с базой, а так же их легковесность и возможности пересылки данных объектов по сети.

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

35. Приведите пример наиболее распространенных исключений в JDBC.

Некоторые из наиболее распространенных исключений JDBC:

  • java.sql.SQLException — это базовый класс для исключений JDBC.
  • java.sql.BatchUpdateException — возникает при исключительных ситуациях пакетной обработки запросов. Может зависеть от типа драйвера JDBC, который может выбросить взамен базовый SQLException.
  • java.sql.SQLWarning — для предупреждающих сообщений различных SQL операций.
  • java.sql.DataTruncation — когда значения данных неожиданно усекаются по причинам, не зависящим от превышения MaxFieldSize.

36. Расскажите о типах данных CLOB и BLOB в JDBC.

Character Large OBjects (CLOBs) — тип данных (внутренний символьный объект), используемый для хранения больших объектов. При выборе значения любого LOB-типа посредством оператора SELECT возвращается указатель, а не само значение; кроме того, типы LOB могут быть и внешними. Этот тип данных является подходящим для хранения текстовой информации, которая может выходить за пределы обычного типа данных VARCHAR (верхний предел 32 Кбайт).
Внутренний большой двоичный объект (BLOB) — двоичный объект большого размера, который может содержать переменное количество данных. Этот тип данных может хранить данные объемом более VARBINARY (32K предел). Тип данных, предназначенный, в первую очередь, для хранения изображений, аудио и видео, а также компилированного программного кода.

37. Что вы знаете о «грязном чтении» (dirty read) в JDBC? Какой уровень изоляции предотвращает этот тип чтения?

«Грязное» чтение (англ. dirty read) — чтение данных, добавленных или изменённых транзакцией, которая впоследствии не подтвердится (откатится). Получение недействительного в последствии значения (после отката транзакции) может приводить к непредвиденным результатам.

Dirty Read можно предотвратить, используя следующие уровни изоляции: TRANSACTION_READ_COMMITTED , TRANSACTION_REPEATABLE_READ и TRANSACTION_SERIALIZABLE .

38. Какие есть две фазы commit?

Когда мы работаем в распределенных системах, где участвуют несколько баз данных, мы должны использовать протокол с 2 фазами фиксации. 2 фазовый протокол фиксации является атомарным протоколом для распределенных систем. На первом этапе, менеджер транзакций передает commit-request всем ресурсам транзакции. Если все ресурсы транзакции ответили ОК, то менеджер транзакций фиксирует изменения транзакций для всех ресурсов. Если какой-либо из ресурсов транзакций уведомляет об отмене, то менеджер транзакций может откатить все изменения транзакций.

39. Приведите пример различных типов блокировки в JDBC.

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

Оптимистическая блокировка — не ограничивает модификацию обрабатываемых данных сторонними сессиями, однако перед началом предполагаемой модификации запрашивает значение некоторого выделенного атрибута каждой из строк данных (обычно используется наименование VERSION и целочисленный тип с инициальным значением 0). Перед записью модификаций в базу данных перепроверяется значение выделенного атрибута, и если оно изменилось, то транзакция откатывается или применяются различные схемы разрешения коллизий. Если значение выделенного атрибута не изменилось — производится фиксация модификаций с одновременным изменением значения выделенного атрибута (например, инкрементом) для сигнализации другим сессиям о том, что данные изменились.
Пессимистическая блокировка — накладывается перед предполагаемой модификацией данных на все строки, которые такая модификация предположительно затрагивает. Всё время действия такой блокировки исключена модификация данных из сторонних сессий, данные из блокированных строк доступны согласно уровню изолированности транзакции. По завершению предполагаемой модификации гарантируется непротиворечивая запись результатов.

40. Как вы понимаете DDL и DML выражения?

Data Definition Language (DDL) (язык описания данных) — это семейство компьютерных языков, используемых в компьютерных программах для описания структуры баз данных. Функции языков DDL определяются первым словом в предложении (часто называемом запросом), которое почти всегда является глаголом. В случае с SQL это глаголы — «create» («создать»), «alter» («изменить»), «drop» («удалить»).

Читать еще:  Флешка не определяется компьютером как восстановить данные

Data Manipulation Language (DML) (язык управления (манипулирования) данными) — это семейство компьютерных языков, используемых в компьютерных программах или пользователями баз данных для получения, вставки, удаления или изменения данных в базах данных. Функции языков DML определяются первым словом в предложении (часто называемом запросом), которое почти всегда является глаголом. В случае с SQL эти глаголы — «select» («выбрать»), «insert» («вставить»), «update» («обновить»), и «delete» («удалить»). Это превращает природу языка в ряд обязательных утверждений (команд) к базе данных.

41. Какая разница между java.util.Date и java.sql.Date?

java.util.Date содержит информацию о дате и времени, тогда как java.sql.Date содержит информацию только о дате, но не имеет информации о времени. Если необходимо сохранить информацию о времени в базе данных, то желательно использовать поля Timestamp или DateTime.
Java.util.Date — основной универсальный объект. В нем просто сохраняется дата (как long).

java.sql.Date расширяет java.util.Date и добавляет следующую функциональность:

1) toString выводит дату в качестве «yyyy-mm-dd», а не как у конкретного языкового стандарта строки (локали).

2) Добавлен метод valueOf для чтения строк формата «yyyy-mm-dd» и дальнейшего разбора ее в объект sql.Date.

42. Как вставить изображение или необработанные данные в базу данных?

Для этого можно использовать тип данных BLOB, чтобы вставить картинку или двоичные данные в базу данных.

43. Что вы можете рассказать о фантомном чтении? Какой уровень изоляции его предотвращает?

Ситуация, когда при повторном чтении в рамках одной транзакции одна и та же выборка дает разные множества строк. Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:

Использование Java классов и объектов в Oracle8i

Эта статья является второй из серии, рассматривающей методику, связанную с использованием Java из окружения, написанного на PL/SQL. В предыдущей статье я описывал, как конструировать простые Java-классы для доступа к основным функциональным возможностям Java, загружать Java-классы в программы базы данных Oracle, управлять этими новыми объектами базы данных, и публиковать их для использования в PL/SQL. В этой статье я продолжу этот вводный курс, подробно исследуя «поддерживаемые черты» — пространство Java-имен в Oracle8i, проверка и экспорт элементов кода Java, хранимых в базе данных, возможность вывода на экран из Java-методов, и обработка исключений для Java-методов из PL/SQL.

Что в имени?

Oracle8i с виртуальной машиной Java (VM) хранит каждый Java-класс как объект схемы. Имя объекта выводится из полного квалифицированного имени класса (но не идентично ему), и включает имена всех содержащих пакетов. Например, полным квалифицированным именем класса OracleSimpleChecker является Oracle.sqlj.checker.OracleSimpleChecker

Однако, в базе данных Oracle полным квалифицированным именем Java-объекта схемы будет следующее: oracle/sqlj/checker/OracleSimpleChecker

Другими словами, при сохранении Java-класса в базе данных Oracle, точки заменяются слешами.

Имя объекта в базе данных Oracle, вне зависимости от того, является ли этот объект таблицей или классом, не может быть длиннее 30 символов. Java не имеет таких ограничений. Вы можете загрузить Java-класс с именем более 4000 символов в базу данных Oracle. Если имя элемента Java содержит более 30 символов, то программное обеспечение Oracle автоматически генерирует корректный (менее 31 символа) псевдоним, или «короткое имя» для элемента.

Но не беспокойтесь! Вам не придется даже ссылаться на псевдонимы, вместо этого вы можете продолжать использовать реальное имя элемента в вашем коде. Oracle автоматически устанавливает соответствие между этим длинным именем и псевдонимом (именем в схеме), когда это нужно. Для получения полного или длинного имени для заданного короткого имени можно использовать функцию DBMS_JAVA.LONGNAME. Следующий запрос (хранимый в скрипте longname.sql) выводит длинные имена для всех Java- классов, описанных в текущей (той, к которой присоединены) схеме базы данных, у которых не совпадают краткое и полное имена:

(Этот запрос также содержится в файле myJava.pkg, в пакете myJava, использование которого показано ниже.) Предположим, вы объявили класс, с очень длинным именем, например:

Вы можете удостовериться в том, что Oracle создал собственное короткое имя, следующим образом:

Просмотр Java-элементов

После загрузки исходных кодов Java, классов и элементов ресурсов в базу данных, можно получить информацию об этих элементах из нескольких представлений словаря данных (см. таблицу).

Представления словаря данных, содержащие информацию о Java-объектах

Вы можете писать запросы к этим представлениям, либо создавать программы, которые используют эту информацию различными способами. Листинг 1 содержит скрипт с запросом, показывающим все Java-связанные объекты в вашей схеме и результат выполнения этого запроса. Предложение WHERE отсекает те объекты, которые Oracle создал для управления Java-объектами. Файл myjava.pkg содержит пакетный вариант запроса, представленный в Листинге 1, который позволяет просматривать Java-объекты, используя следующий процедурный вызов:

Следующая команда выводит список всех Java-элементов, имена которых начинаются на OE:

Столбец object_name в представлении словаря данных user_objects содержит полные имена Java-объектов схемы, за исключением имен, которые длиннее 30 символов или содержат непереводимые символы из набора символов UNICODE. В этом случае в столбце object_name хранится короткое имя. Для преобразования коротких имен в полные можно использовать функцию longname из пакета утилит DBMS_JAVA (см следующий раздел).

Помните следующие характеристики Java-элементов схемы в базе данных:

  • При использовании команды loadjava для загрузки Java-элементов в базу данных, исходный код ваших Java-элементов не переносится, — в базу данных помещаются только такие файлы, как class, jar, zip, и java,.
  • При использовании команды CREATE JAVA , исходный код Java-элементов хранится в базе данных. Объекты типа JAVA SOURCE можно увидеть в представлении словаря данных USER_OBJECTS, а также в представлениях ALL_OBJECTS, DBA_OBJECTS для этого элемента. Для извлечения исходного кода, размещения его в структурах данных PL/SQL и отображения или изменения текста этого кода можно использовать процедуру DBMS_JAVA.EXPORT_SOURCE, как об этом сказано в следующем разделе.

Экспорт Java-ресурсов

Пакет Oracle DBMS_JAVA содержит процедуры для экспорта исходного кода, классов и ресурсов. Вообще говоря, эти процедуры можно использовать для экспорта Java-ресурсов в типы данных Oracle8i BLOB или CLOB.

Пример процедуры в Листинге 2 дает представление о том, каким образом можно экспортировать исходный код Java-объектов схемы. Можно использовать команду CREATE JAVA для создания исходных Java-объектов, как показано ниже:

Если для функции пакета DBMS_OUTPUT установлена возможность вывода в текстовый буфер, то можно просмотреть исходный код, как показано ниже:

Класс нельзя экспортировать в CLOB, только в BLOB. Кроме того, внутреннее представление исходного кода использует формат UTF8, поэтому этот формат применяется также для хранения исходного кода в BLOB.

Предоставление возможности вывода данных для Java

Когда классы System.out и System.err выполняются внутри базы данных, они посылают свои выходные данные в текущий файл трассировки. Этот файл не слишком удобное хранилище, особенно если вам просто нужно проверить правильно ли работает ваш код. Пакет DBMS_JAVA содержит процедуру, которую можно вызывать, чтобы перенаправить выходные данные в текстовый буфер DBMS_OUTPUT, из которого данные автоматически выводятся на экран SQL*Plus. Вот синтаксис вызова этой процедуры:

А вот пример ее использования:

Документация по взаимодействию между DBMS_JAVA и DBMS_OUTPUT очень скудная. С помощью тестирования я выявил следующие правила:

  • Минимальный (и заданный по умолчанию) размер буфера составляет всего лишь 2000 байт; максимальный — 1000000 байт. Можно указывать число, выходящее за эти пределы, при этом не будет возникать ошибка (за исключением действительно больших чисел); SQL*Plus будет просто игнорировать его.
  • Размер буфера, заданный командой SET SERVEROUTPUT, замещает размер, указанный в DBMS_JAVA.SET_OUTPUT. Другими словами, если вы укажете меньшее значение при вызове DBMS_JAVA, то оно будет проигнорировано SQL*Plus, и будет использоваться большее значение.
  • Если выходные данные в Java превышают размер буфера, вы не получите сообщение, которое появляется при использовании DBMS_OUTPUT, а именно:

Но вместо этого выходные данные будут усечены до размера буфера, указанного в SQL*Plus по умолчанию, и выполнение кода продолжится.

Как и в случае с DBMS_OUTPUT, выходные данные, выводимые Java-вызовами, не будут отображены до тех пор, пока не закончится выполнение хранимой процедуры, через которую они вызываются.

Читать еще:  Сколько стоит восстановление фото с карты памяти

Обработка исключений в Java

С одной стороны, архитектура обработки исключений в Java-очень похожа на обработку исключений в PL/SQL. В языке Java, вы возбуждаете (throw) исключение и затем перехватываете (catch) его. В языке PL/SQL, вы возбуждаете (raise) исключение и затем обрабатываете (handle) его.

С другой стороны, обработка исключений в Java гораздо более трудоемка. Java предлагает базовый класс, называемый Exception. Все исключения являются объектами, основанными на этом классе, или на классах, происходящих от (расширяющих) Exception. Вы можете передавать исключения как параметры и манипулировать ими точно также как объектами любого другого класса.

Когда при выполнении SQL-оператора из хранимого Java-метода возбуждается исключение, это исключение является объектом подкласса java.sql.SQLException. Этот класс содержит два метода, которые возвращают код сообщения об ошибке Oracle, — getErrorCode(), и само сообщение об ошибке — getMessage() .

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

Рассмотрим теперь различные способы обработки ошибок и результирующие выходные данные. Допустим, что вы создали класс, использующий JDBC, для удаления объектов базы данных (смотри Листинг 3; этот пример скопирован из документации Oracle). Эта строка перехватит и отобразит на экране любое SQL-исключение:

Вы можете встроить этот класс в процедуру PL/SQL следующим образом:

Листинг 4 показывает два результата, один из которых получается при попытке удалить несуществующий объект. Результаты, представленные в файле, напоминают о том, что вывод из System.err.println не появится на экране до тех пор, пока это не будет разрешено явным образом, путем вызова DBMS_JAVA.SET_OUTPUT. В любом случае, однако, исключение не будет распространяться на вызывающий блок, поскольку оно перехватывается внутри Java. После второго вызова процедуры dropany, можно увидеть, что сообщение об ошибке, переданное из метода getMessage(), является ошибкой Oracle.

Если закомментировать строки try и catch в методе DropAny.obj, то результат выполнения будет совершенно другим, как показано в Листинге 5. Здесь требуется небольшое пояснение. Все что написано между

представляет собой дамп стека ошибок, генерируемый Java, и направленный на стандартный вывод, вне зависимости от того, как обрабатываются ошибки в PL/SQL. Другими словами, даже если раздел исключений выглядит следующим образом:

EXCEPTION WHEN OTHERS THEN NULL;

все эти сообщения все равно будут выведены на экран. Обработка в другом блоке (если он есть) будет затем продолжена. Последние три строки отображаемого вывода генерируются вызовом DBMS_OUTPUT.PUT_LINE.

Заметим, что возникает не ошибка Oracle ORA-00942, а общая Java-ошибка ORA-29532. Это действительно проблема. Как обнаружить при перехвате ошибки, что именно является настоящей ошибкой? Похоже, настал черед Человека, Пишущего Утилиты (Write-a-Utility Man)!

Я обратил внимание, что сообщение об ошибке, возвращаемое функцией SQLERRM, имеет следующий вид:

Следовательно, можно проверять наличие слова java.sql.SQLException и затем использовать функцию SUBSTR. Листинг 6 содержит процедуру, созданную с целью компенсации неудобного формата сообщений об ошибках Java. Процедура возвращает код ошибки и сообщение для текущей ошибки. Блок кода в Листинге 7 демонстрирует, каким образом можно использовать эту процедуру (процедура использует пакет log81, созданный файлом log81.pkg, чтобы записать информацию об ошибке в журнал).

Хотя эта процедура хранит информацию об ошибках в журнальных таблицах базы данных, она по-прежнему возвращает клиентской сессии стек исключений Java. Например, при запуске скрипта в SQL*Plus, стек исключений Java будет отображаться на экране.

Легкость интеграции

Темы, охваченные в этой статье, рассматривают некоторые приемы и основные принципы, используемые при встраивании функциональных возможностей Java в существующее Oracle PL/SQL окружение. Хотя магазины, работающие с базами данных Oracle, вероятно, не будут в ближайшем будущем переводить оптовую торговлю на Java, многие из нас захотят использовать Java как можно скорее. Информация, приведенная в этой статье, должна помочь вам сделать это рационально и эффективно.

Листинг 1. Java-связанные объекты в схеме

Этот запрос показывает все Java-связанные объекты в вашей схеме :

Вот результат выполнения этого запроса:

Листинг 2. Процедура экспорта из пакета Oracle DBMS_JAVA

Процедура экспорта из пакета Oracle DBMS_JAVA позволяет извлекать

исходный код Java-объектов схемы.

Листниг 3. Создание класса для удаления объектов из базы

Вы можете создать класс, использующий JDBC, для удаления объектов из базы данных Oracle.

Листинг 4. Попытка удаления несуществующего объекта

При попытке удаления несуществующего объекта, вы получите следующие результаты:

Java clob sql

32730 просмотра

6 ответа

9932 Репутация автора

Мой вопрос: как вы обходите ORA-01704: string literal too long ошибку при вставке (или выполнении чего-либо в запросах) с помощью CLOB s?

Я хочу иметь такой запрос:

Когда я пробую это с реальными значениями, я ORA-01704: string literal too long вернусь. Это довольно очевидно, но как я могу вставлять clobs (или вообще выполнять какие-либо инструкции с помощью clob)?

Я попытался рассмотреть этот вопрос , но я не думаю, что у него есть то, что я ищу. У клобов, которые у меня есть, есть List и я повторяю их, чтобы сделать заявление. Мой код выглядит следующим образом:

Ответы (6)

2 плюса

185195 Репутация автора

Вам нужно будет использовать переменные связывания, а не строить SQL-оператор, используя конкатенацию строк. Это будет полезно с точки зрения безопасности, производительности и надежности, так как это уменьшит риск атаки SQL-инъекций, уменьшит время, затрачиваемое Oracle на проведение сложных анализов SQL-запроса, и устранит потенциал, который там является специальным символом в строке, который приводит к тому, что недопустимый оператор SQL генерируется (т. е. одинарная кавычка).

Я ожидал бы, что вы хотите что-то вроде

7 плюса

283504 Репутация автора

Вы делаете это сложно.

Используйте PreparedStatement и addBatch () для каждого clob в вашем списке:

Не возиться с экранированием строк, не проблема с длиной литералов, нет необходимости создавать временные складки. И, скорее всего, так же быстро, как использование одного оператора INSERT ALL.

Если вы используете текущий драйвер (> 10.2), то я думаю, что вызов setCharacterStream () и создание Reader тоже не нужны. Простой setString(1, query) , скорее всего, тоже будет работать.

2 плюса

21 Репутация автора

BLOB (двоичные большие объекты) и CLOB (характерные большие объекты) являются специальными типами данных и могут содержать большие куски данных в виде объектов или текста. Объекты Blob и Clob сохраняют данные объектов в базе данных как поток.

Автор: Pratap Размещён: 06.10.2012 05:04

2 плюса

107 Репутация автора

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

Для операторов PL / SQL

Методы setBytes и setBinary stream используют прямую привязку для данных размером менее 32767 байт.

Методы setBytes и setBinaryStream используют привязку LOB для данных размером более 32766 байт.

Методы setString, setCharacterStream и setAsciiStream используют прямую привязку для данных размером менее 32767 байт в наборе символов базы данных.

Методы setString, setCharacterStream и setAsciiStream используют привязку LOB для данных размером более 32766 байт в наборе символов базы данных.

Методы setBytesForBlob и setStringForClob, присутствующие в интерфейсе oracle.jdbc.OraclePreparedStatement, используют привязку LOB для любого размера данных.

Далее приведен пример размещения содержимого файла во входной параметр CLOB процедуры PLSQL:

плюса

1 Репутация автора

Мне нравится использовать классы из java.sql. * Package, а не oracle. * Stuff. Для меня простой подход

перестали работать, когда тестирование (текущий tomcat, jdbc) перешло в производство (застряло в Tomcat6 по глупым причинам). con.createClob () возвращает null по причинам, неизвестным в этой версии, поэтому я должен был сделать это с двойным приемом (мне потребовалось много времени, чтобы понять, чтобы я делился здесь . )

для полноты здесь

спасибо из других источников.

плюса

619 Репутация автора

Ознакомьтесь с некоторыми примерами, связанными с CLOB, на github .

Ссылка на основную публикацию
Adblock
detector