barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)
Показаны сообщения с ярлыком Oracle. Показать все сообщения
Показаны сообщения с ярлыком Oracle. Показать все сообщения

пятница, 22 ноября 2019 г.

Oracle ATG: <print-item> в dynadmin

Если попытаться получить все item'ы по определенному item-descriptor в dynadmin с помощью:
<print-item item-descriptor="xxx"/>
то будет выведено только 100 item-ов. Для получения абсолютно всех item'ов необходимо воспользоваться:
<query-items item-descriptor="xxx">all</query-items>
Правда, если item'ов очень много, они все равно могут все не напечататься, вывод обрезается в произвольном месте. Workaround - запрашивать частями с использованием RANGE:
<query-items item-descriptor="xxx">
all RANGE +30000
</query-items>
затем
<query-items item-descriptor="xxx">
all RANGE 30000+30000
</query-items>
и т.п. 

вторник, 3 апреля 2018 г.

Oracle Weblogic: ALTER SESSION-команды в Init SQL

Задача - в качестве Init SQL необходимо выполнить 2 ALTER SESSION-команды
Решение - ALTER SESSION-команды в Init SQL заворачиваем в анонимный PL/SQL-блок, а внутри него каждую команду - в execute immediate:
SQL BEGIN execute immediate('alter session set ...');execute immediate('alter session set ...'); END;

Oracle: посчитать число индексов по char/varchar-колонкам

SELECT COUNT(DISTINCT i.INDEX_NAME)
FROM dba_ind_columns i
    JOIN dba_tab_columns c
        ON (c.TABLE_NAME = i.TABLE_NAME AND c.OWNER = i.TABLE_OWNER AND c.COLUMN_NAME = i.COLUMN_NAME)
WHERE
    (UPPER(c.DATA_TYPE) LIKE 'VARCHAR%'
        OR UPPER(c.DATA_TYPE) LIKE 'CHAR%')

четверг, 21 декабря 2017 г.

Узнать SID сессии по database link

Проблема

Есть БД "А" и БД "Б", в первой создан DATABASE LINK ко второй. Нужно запросом к БД "А" узнать идентификатор сессии (SID) между БД "А" и БД "Б".

Решение

Из всех опробованных вариантов заработал только этот:
select
   to_number(substr(dbms_session.unique_session_id@DBLINK_NAME,1,4),'XXXX') mysid
from dual;
, где DBLINK_NAME - имя DATABASE LINK'а.

четверг, 23 ноября 2017 г.

Oracle DB: определение размера MATERIALIZED VIEW

Следующий запрос возвращает размеры (в Мб) всех материализованных представлений в БД:
SELECT segment_name,sum((BYTES)/(1024*1024)) "Allocated(MB)"
FROM dba_extents
WHERE segment_name in (SELECT mview_name FROM dba_mviews)
GROUP BY segment_name ;
Спасибо http://javeedkaleem.blogspot.ru/2010/04/find-space-used-by-materialized-views.html.

понедельник, 13 ноября 2017 г.

ORA-02020: используется слишком много каналов связи БД

Проблема

Есть ADF-приложение, в нем некоторые Entity смотрят на вьюхи, которые, в свою очередь, смотрят на удаленные таблицы через DATABASE LINK. При работе с этими Entity падает ошибка:
ORA-02020: используется слишком много каналов связи БД

Решение

Срабатывает ограничение OPEN_LINKS (ограничение на число link-ов в рамках одной сессии, см. https://docs.oracle.com/cd/B19306_01/server.102/b14237/initparams139.htm#REFRN10138) или OPEN_LINKS_PER_INSTANCE (тоже самое, но не на уровне сессии, а глобально, актуально при использовании SHARED-линков и распределенных транзакций, см. https://docs.oracle.com/cd/B19306_01/server.102/b14237/initparams140.htm#REFRN10139). Оба по-умолчанию равны 4. Посмотреть текущие значения можно SQL-запросом:
show parameter OPEN_LINKS
Необходимо поменять значения командами:
ALTER SYSTEM SET OPEN_LINKS=255 SCOPE=SPFILE;
ALTER SYSTEM SET OPEN_LINKS_PER_INSTANCE=255 SCOPE=SPFILE; 
(для применения потребуется рестартануть БД)

воскресенье, 12 ноября 2017 г.

ORA-24777: использование непереносимых ссылок на базы данных недопустимо

Проблема

Есть ADF-приложение, работающее на weblogic. Приложение использует Data source, предоставляемый weblogic'ом, для соединения с БД. Некоторые Entity приложения смотрят на вьюхи, которые, в свою очередь, смотрят на удаленные таблицы через DATABASE LINK.
При попытке приложения обратиться к данным в удаленной БД падает ошибка:
ORA-24777: использование непереносимых ссылок на базы данных недопустимо
Решение

Data source на weblogic использует JDBC-драйвер "oracle.jdbc.xa.client.OracleXADataSource, либо обычный (non-XA) драйвер oracle.jdbc.OracleDriver, но в настройках датасорса стоит галочка "Supports Global Transactions" (которая, кстати, установлена там по-умолчанию). При этом DATABASE LINK создан не как SHARED.
Соответственно, варианта 2:
  1. Использовать oracle.jdbc.OracleDriver со снятой галочкой "Supports Global Transactions", если распределенные транзакции по факту приложению не нужны
  2. Пересоздать DATABASE LINK с использованием SHARED-опции (подробнее см. https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5005.htm#i2061693).  Например:
CREATE SHARED PUBLIC DATABASE LINK MY_DBLINK
CONNECT TO "USR1" IDENTIFIED BY "PSWRD1"
AUTHENTICATED BY "USR1" IDENTIFIED BY "PSWRD1"
USING 'MYRMTORCL';

вторник, 26 сентября 2017 г.

Oracle Database11g Express Edition: "ORA-12505, TNS:listener does not currently know of SID given in connect descriptor"

Установил я Oracle Database11g Express Edition Release 2 на Win 10 x64. Проблемы начались еще при скачивании дистрибутива. Сайт Oracle ругался на Unauthorized Request "In order to download products from Oracle Technology Network you must agree to the OTN license terms", хотя я, естественно, условия лицензии принял. Пришлось качать с rutracker. Наконец поставив, пытаюсь подключиться через JDeveloper по jdbc:oracle:thin:@localhost:1521:XE. Получаю:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
Тоже самое через cmd с помощью:
sqlplus sys/******@XE as sysdba
Вроде бы службы запущены, "Start Database" в меню Пуск я нажимал. Перезапуск служб не помог (хотя вроде бы стартовал в правильном порядке - сначала OracleXETNSListener, потом - OracleServiceXE).
Помогло следующее. Приконнектился с помощью:
sqlplus sys/111111 as sysdba
Выполнил:
alter system set local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' scope = both;
alter system register;
exit;
После чего:
lsnrctl stat 
Вуаля, можно коннектится.

пятница, 15 сентября 2017 г.

Oracle BI Publisher: невозможно войти после некорректной настройки LDAP-авторизации

Проблема

Некорректно настроил LDAP-авторизацию в Oracle BI Publisher (Администрирование -> Конфигурация защиты -> Авторизация). Из-за этого после рестарта не могу авторизоваться в publisher ни под одним пользователем (даже под администратором, чтобы скорректировать настройки авторизации).

Решение

Открываем файл $DOMAIN_HOME/bidata/components/bipublisher/repository/Admin/Configuration/xmlp-server-config.xml, меняем значение свойства SECURITY_MODEL на XDO (соответствует опции модели защиты "Защита BI Publisher"). Рестартуем BI, входим под дефолтными Administrator/Administrator.

Oracle BI Publisher: ошибка старта "[Security:090302]Authentication Failed: User specified user denied" после смены пароля пользователя weblogic

Проблема
Был рабочий Oracle BI Publisher. Сменил пароль пользователя weblogic через console weblogic-сервера, пытаюсь рестартаную сервер - AdminServer стартует нормально, а вот bi_server не стартует, в логах ошибка:
[Security:090302]Authentication Failed: User specified user denied
Перепробовал множество разных вариантов, даже сменил пароль weblogic обратно на старый - ничего не помогало, все та же ошибка в логах.

Решение 
Необходимо выполнить следующие шаги:
  1. Идем в $DOMAIN_HOME/bin
  2. Выполняем
    . ./setDomainEnv.sh
    (точка в начале обязательна)
  3. Останавливаем сервер
    $DOMAIN_HOME/bitools/bin/stop.sh
  4. Идем в $DOMAIN_HOME/security, выполняем
    mv DefaultAuthenticatorInit.ldift DefaultAuthenticatorInit.ldift.old
  5. Сбрасываем логин/пароль администратора weblogic-сервера
    java weblogic.security.utils.AdminAccount weblogic <new_password> .
    (точка в конце обязательна)
  6. Выполняем
    mv $DOMAIN_HOME/servers/AdminServer/data/ldap $DOMAIN_HOME/servers/AdminServer/data/ldap.old
  7. Идем в $DOMAIN_HOME/servers/AdminServer/security, создаем там boot.properties (или редактируем существующий), прописываем:
    password=<username>
    username=weblogic
  8. Стартуем сервер
    $DOMAIN_HOME/bitools/bin/start.sh

вторник, 11 июля 2017 г.

access-лог во встроенном Weblogic 12c

Проблема

Есть JDeveloper 12.1.3 и идущий вместе с ним в комплекте Weblogic. Пытаюсь настроить на нем access-логирование, но почему-то вообще ничего не вижу в access-логе несмотря на активное обращение к задеплоенному на weblogic приложению.

Причина

Weblogic почему-то не пишет в access-лог обращения, если они идут к localhost / 127.0.0.1. Если попытаться обратиться к задеплоенному приложению по внешнему IP рабочей машины, лог пишется.

среда, 30 ноября 2016 г.

пятница, 22 августа 2014 г.

Ошибка java.lang.NullPointerException в классе ClassFinderMetaDataEnumaration при старте веб-приложения на weblogic

Проблема

При старте веб-приложения на weblogic 10.3.5 падает ошибка:
weblogic.application.ModuleException: Failed to load webapp: 'xxx'
at weblogic.servlet.internal.WebAppModule.prepare(WebAppModule.java:393)
at weblogic.application.internal.flow.ScopedModuleDriver.prepare(ScopedModuleDriver.java:176)
at weblogic.application.internal.flow.ModuleListenerInvoker.prepare(ModuleListenerInvoker.java:199)
at weblogic.application.internal.flow.DeploymentCallbackFlow$1.next(DeploymentCallbackFlow.java:517)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:52)
Truncated. see log file for complete stacktrace
Caused By: java.lang.NullPointerException at weblogic.application.utils.ClassFinderMetaDataEnumaration.hasMoreElements(ClassFinderMetaDataEnumaration.java:32)
at weblogic.servlet.internal.WebAnnotationProcessorImpl.getAnnotatedClasses(WebAnnotationProcessorImpl.java:139)
at weblogic.servlet.internal.War.getAnnotatedClasses(War.java:1038)
at weblogic.servlet.internal.WebAppServletContext$ServletContextWebAppHelper.getAnnotatedClasses(WebAppServletContext.java:3833)
at weblogic.servlet.internal.WebAnnotationProcessorImpl.processAnnotations(WebAnnotationProcessorImpl.java:84)
Truncated. see log file for complete stacktrace
Причина

В приложении был класс класс Settings с вложенным статическим приватным классом Settings.PropertyNames. Не было времени разбираться, что именно мешало weblogic'у, имя класса PropertyNames или же приватный доступ вложенного статического класса, но после того, как я убрал этот класс, приложение начало стартовать.

воскресенье, 26 января 2014 г.

Pentaho: подключение к БД Oracle по Service Name

При создании "Database connection" в Pentaho при выборе СУБД Oracle нет возможности выбрать, как подключаться к БД - по SID или по Service Name. Есть только единственное поле - "Database". При этом, если ввести в него просто значение Service Name, на некоторых серверах подключение проходит успешно, тогда как на других приводит к ошибке:
2014/01/25 20:06:27 - ERROR (version 4.4.0-stable, build 17588 from 2012-11-21 16.02.21 by buildguy) : Error connecting to database: (using class oracle.jdbc.driver.OracleDriver)
2014/01/25 20:06:27 - ERROR (version 4.4.0-stable, build 17588 from 2012-11-21 16.02.21 by buildguy) : Listener refused the connection with the following error:ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
Из текста ошибки видно, что СУБД считает, что подключение ведется по SID, а не по Service Name. Почему ошибка возникает лишь на некоторых серверах - не знаю, видимо это зависит от каких-то настроек на стороне сервера.
Почему СУБД считает, что подключение ведется именно по SID, понятно: форматы JDBC-URL'а при подключении по SID и по Service Name различаются. Для SID URL выглядит так (используется thin-драйвер):
jdbc:oracle:thin:@server:1521:mysid
, а для Service Name - так:
jdbc:oracle:thin:@server:1521/myservicename
Pentaho использует первый формат, что и ведет к ошибке. Однако, не все так плохо: если указать в начале значения поля "Database" прямой слеш (перед значением Service Name) подключение проходит успешно. Спасибо http://forums.pentaho.com/archive/index.php/t-87866.html?s=57295456a6292b611f3e46e3fa0ea7d6.

суббота, 25 января 2014 г.

Как я сдавал 1Z0-897 "Oracle Certified Expert, Java EE 6 Web Services Developer"

Сразу оговорюсь, сдал я не особо - 68% при проходном 64%. Сказалась, как обычно, нехватка времени на подготовку, да еще и отсутствие в свободном доступе внятной информации о том, что конкретно будет на экзамене, а также более ли менее близких к составу экзаменационных вопросов книг и mock-экзаменов.
Собственно на подготовку ушла ровно неделя, точнее целиком я готовился только 2 выходных дня, а в остальные 5 дней в среднем по 3-4 часа. Опыт в разработке SOAP веб-сервисов у меня около 2 лет, но на момент начала подготовки я не мог похвастаться особо глубокими знаниями JAX-WS, т.к. разрабатываемые мной веб-сервисы в основном были достаточно тривиальными, и я довольствовался "обязательным минимумом" знаний. Что такое XML Schema и WSDL я знал, но в последнем также не был большим знатоком. REST же для меня был вообще практически новым словом, что это такое, я конечно представлял, но на практике никогда применять не приходилось. Собственно это все и стало предпосылкой к сдаче экзамена, т.к. экзамен - отличный повод "прибраться" в своих знаниях, систематизировать их, а также узнать что-то новое, что потом можно использовать на практике.
При подготовке я в основном ориентировался на содержимое вот этой странички на код-ранче: http://www.coderanch.com/how-to/java/ScdjwsLinks, поэтому первое, с чего я начал подготовку - прочитал книжку "Java Web Services: Up and Running" под авторством Martin Kalin (2009). Книжка по объему достаточно скромная - всего 318 страниц (+ некоторые разделы, например про историю веб-сервисов, можно смело пропускать), поэтому осилить ее можно достаточно быстро. По ходу чтения делал заметки, чтобы перед экзаменом была возможность быстро освежить в памяти полученные из нее знания. Из книги узнал для себя много нового, многие вещи, казавшиеся раньше загадочными, теперь стали очевидными. Не могу сказать, что книга дает исчерпывающие значения по теме, но она определенно показывает, в какую сторону копать при наличии той или иной задачи. Сказать, что этой книги достаточно для успешной сдачи экзамена, тоже с полной уверенностью нельзя. Но об этом немного позже.
После прочтения книги у меня закрались сомнения в том, что полученных знаний хватит для получения сертификата, и я начал судорожно искать, где бы еще что-нибудь почитать по теме. Для начала просмотрел вот этот гайд: http://java.boot.by/ocewsd6-guide/, - там многое пересекается с книгой (даже возникает впечатление, что оно оттуда и скопировано), но в тоже время есть и новая информация, в частности, по REST и JAX-RS. Чтобы окончательно удостовериться в том, что полученные мной знания по REST и JAX-RS достаточно полны, я также прочитал статью на сайте IBM: http://www.ibm.com/developerworks/ru/library/wa-jaxrs/.
В довершение, уже вечером перед экзамен, я пробежался по тестам тут:  http://www.examclouds.com/ (в разделе "WS Quiz"). Тесты меня несколько испугали, т.к. ответы на многие вопросы я не знал. Но как оказалось, это и не нужно - на экзамене ничего подобного не было.
Собственно вот и вся подготовка. Выспаться перед экзаменом не получилось, но свежесваренный кофе сделал свое дело =)
Сдавал я в Unix Education Center, там же, где 10 месяцами ранее я экзаменовался на OCJP. На экзамен дается 1.5 часа, вопросов в тесте - 60. В общем-то, расслабляться нельзя, времени не много. Я успел ответить на все вопросы за 1:15, потом просмотрел еще раз те вопросы, по которым были сомнения. Была пара вопросов, отображавшихся некорректно из-за того видимо, что xml, входящий в текст вопроса, забыли экранировать, и он попросту не показывался. Написал жалобу в pearsonvue, через которых заказывал экзамен, обещали разобраться.
Теперь про вопросы на экзамене. Их уровень не запредельный, обойтись одной только книжкой "Java Web Services: Up and Running" было бы сложно, но в целом, запомни я все прочитанное получше, сдать можно было бы на более высокий балл. Единственная тема, к которой я был совершенно не готов (а на которую, однако, было не менее 4-5 вопросов) - это WS-I.

понедельник, 18 ноября 2013 г.

Weblogic: использование зашифрованного пароля в конфигурации DataSource

Хранить пароль от БД в конфигурации DataSource можно и в открытом виде, т.е.:
    <properties>
      <property>
        <name>user</name>
        <value>user1</value>
      </property>
      <property>
        <name>password</name>
        <value>11111</value>
      </property>
    </properties>
Однако, порой это недопустимо из соображений безопасности. В таком случае подойдет хранение зашифрованного пароля, для этого предназначен специальный тег <password-encrypted>:
<properties>
<property>
<name>user</name>
<value>user1</value>
</property>
</properties>
<password-encrypted>{3DES}IQHx+vYPxQI5k1W1Dbwubw==</password-encrypted>
Чтобы поместить туда пароль, его сначала нужно зашифровать. Делается это так:
  1. Идем в DOMAIN_HOME
  2. Выполняем:
    setDomainEnv.cmd
    или
    . ./setDomainEnv.sh
    Наличие точки в начале команды для Unix важно, т.к. скрипт устанавливает переменные окружения, и без точки они не будут видны в вызывающем shell'е, из-за чего при выполнении следующего шага получим:
    Could not find or load main class weblogic.security.Encrypt
  3. Выполняем:
    java weblogic.security.Encrypt 11111
  4. Используем полученный зашифрованный пароль внутри <password-encrypted>
Спасибо http://middlewaremagic.com/weblogic/?p=1400

четверг, 22 августа 2013 г.

Oracle + Weblogic connection pool: задание схемы по-умолчанию

Недавно писал про организацию пула соединения с БД в приложении, развертываемом на Weblogic (http://barbitoff.blogspot.ru/2013/07/weblogic-1035-connection-pooling.html). Xml-конфигурация пула позволяет задать все параметры соединения, кроме имени используемой схемы. Хардкодить имя схемы в SQL-запросах не хочется, как и изобретать велосипед с подтягиванием имени схемы из какого-то своего отдельного конфига. Выход - использовать в SQL схему по-умолчанию (т.е. не задавать имя схемы вообще) и воспользоваться таким параметром пула, как "init-sql". В этом параметре нужно указать SQL-запрос, который при инициализации соединения с БД поменяет схему по-умолчанию на необходимую нам. Этот SQL зависит от используемой СУБД, для Oracle он выглядит так:
  <jdbc-connection-pool-params>
    <max-capacity>20</max-capacity>
    <connection-reserve-timeout-seconds>25</connection-reserve-timeout-seconds>
    <test-table-name>SQL SELECT 1 FROM DUAL</test-table-name>
    <init-sql>SQL ALTER SESSION SET CURRENT_SCHEMA = USR</init-sql>  </jdbc-connection-pool-params>

четверг, 18 июля 2013 г.

Oracle: "SELECT ... INTO ..." и ошибка "No data found"

В случае, если есть вероятность, что запрос, используемый в SELECT ... INTO ..., не вернет строк, можно либо указать обработчик исключения, либо воспользоваться следующей конструкцией, которая в случае, если запрос не вернет строк, запишет NULL в переменную my_var:
SELECT (SELECT some_field FROM some_table WHERE <some_condition>) INTO my_var FROM dual

суббота, 29 июня 2013 г.

Oracle: смена схемы по-умолчанию в рамках сессии

ALTER SESSION SET CURRENT_SCHEMA = ABC

Oracle: '' LIKE '%' = false

Столкнулся с достаточно неожиданным поведением Oracle: пустые строки у него эквивалентны NULL, поэтому выражение:
'' LIKE '%'
дает false, хотя вроде бы '%' предполагает 0+ любых символов. Т.о., если по LIKE '%' фильтруется какая-то колонка, то записи с пустой строкой в этой колонке в выборку не попадут. Однако, есть и workaround, позволяющий добавить в выборку как записи с пустой строкой, так и с NULL:
COALESCE('',' ') LIKE '%' = true
PS конечно,  LIKE '%' - достаточно странное условие, реально у меня используется:
LIKE ?||'%'
но при пустом значении параметра оно превращается именно в  LIKE '%', которое по идее должно выдавать все записи.