, , , ,

Неправильно формированный тэг br при выполнении xmltransform (wrong br after xmltransform)

суббота, 27 марта 2010 г. 0 коммент.

Под 11 версией базы неожиданно перестал правильно работать xmltransform.

В соответсвии с W3C рекомендациями элементы написанные как
<br/> или <br></br> должны быть трансформированы в <br>, но этого не происходит.

Рассмотрим на примере. XML для трансформации:


<?xml version="1.0" encoding="Windows-1251"?>
<REQUEST xmlns="http://localhost/schemas/data" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<DATA>
<ID>12345</ID>
<ID_PARENT>1234</ID_PARENT>
<NAME>Узел 12345</NAME>
<FULL_NAME>Узел 12345, родитель 1234</FULL_NAME>
</DATA>
</REQUEST>

XSLT для трансформации:


<?xml version="1.0" encoding="Windows-1251"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sdt="http://localhost/schemas/data" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<head>
<title>Элемент дерева</title>
</head>
<body>
ИД: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:ID"/></b>< br></br>
ИД родителя: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:ID_PARENT"/></b>< br/>
Имя: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:NAME"/></b>< br> </br>
Полное имя: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:FULL_NAME"/></b>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Выполним трансформацию в Oracle DB 10g и 11g. Сначала в Oracle DB 11g


SQL> set long 32000
SQL> select * from v$version where rownum=1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production

SQL>
SQL> select xmltransform(xmltype(
2 '<?xml version="1.0" encoding="Windows-1251"?>
3 <REQUEST xmlns="http://localhost/schemas/data" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4 <DATA>
5 <ID>12345</ID>
6 <ID_PARENT>1234</ID_PARENT>
7 <NAME>Узел 12345</NAME>
8 <FULL_NAME>Узел 12345, родитель 1234</FULL_NAME>
9 </DATA>
10 </REQUEST>'), xmltype(
11 '<?xml version="1.0" encoding="Windows-1251"?>
12 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
13 xmlns:sdt="http://localhost/schemas/data" version="1.0">
14 <xsl:output method="html"/>
15 <xsl:template match="/">
16 <html>
17 <head>
18 <title>Элемент дерева</title>
19 </head>
20 <body>
21 ИД: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:ID"/></b>< br></br>
22 ИД родителя: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:ID_PARENT"/></b>< br/>
23 Имя: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:NAME"/></b>< br> </br>
24 Полное имя: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:FULL_NAME"/></b>
25 </body>
26 </html>
27 </xsl:template>
28 </xsl:stylesheet>')).getclobval()
29 from dual;

XMLTRANSFORM(XMLTYPE('<?XMLVER
--------------------------------------------------------------------------------
<html><head><title>Элемент дерева</title></head><body>
ИД: <b>12345</b>< br></br>
ИД родителя: <b>1234</b>< br></br>
Имя: <b>Узел 12345</b>< br></br>
Полное имя: <b>Узел 12345, родитель 1234</b></body></html>

SQL>

Теперь в Oracle DB 10g


SQL> set long 32000
SQL> select * from v$version where rownum=1;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod

SQL>
SQL> select xmltransform(xmltype(
2 '<?xml version="1.0" encoding="Windows-1251"?>
3 <REQUEST xmlns="http://localhost/schemas/data" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4 <DATA>
5 <ID>12345</ID>
6 <ID_PARENT>1234</ID_PARENT>
7 <NAME>Узел 12345</NAME>
8 <FULL_NAME>Узел 12345, родитель 1234</FULL_NAME>
9 </DATA>
10 </REQUEST>'), xmltype(
11 '<?xml version="1.0" encoding="Windows-1251"?>
12 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
13 xmlns:sdt="http://localhost/schemas/data" version="1.0">
14 <xsl:output method="html"/>
15 <xsl:template match="/">
16 <html>
17 <head>
18 <title>Элемент дерева</title>
19 </head>
20 <body>
21 ИД: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:ID"/></b>< br></br>
22 ИД родителя: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:ID_PARENT"/></b>< br/>
23 Имя: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:NAME"/></b>< br> </br>
24 Полное имя: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:FULL_NAME"/></b>
25 </body>
26 </html>
27 </xsl:template>
28 </xsl:stylesheet>')).getclobval()
29 from dual;


XMLTRANSFORM(XMLTYPE('<?XMLVER
--------------------------------------------------------------------------------
<html><head><title>Элемент дерева</title></head><body>
ИД: <b>12345</b>< br/>
ИД родителя: <b>1234</b>< br/>
Имя: <b>Узел 12345</b>< br/>
Полное имя: <b>Узел 12345, родитель 1234</b></body></html>

SQL>

И хотя в 10.2 тоже неправильно формируется тэг br, вместо <br /> мы видим <br/>, браузеры правильно отображают этот тэг.
А сочетание элемент <br /></br> интерпретируется браузерами, как два тега <br />.
Для того чтобы в Oracle DB 11g правильно выводились тэги <br />, их необходимо экранировать с помощью инстркции xsl:text.
Трансформация будет выглядеть следующим образом.


<?xml version="1.0" encoding="Windows-1251"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sdt="http://localhost/schemas/data" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<head>
<title>Элемент дерева</title>
</head>
<body>
ИД: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:ID"/></b><xsl:text disable-output-escaping="yes"><![CDATA[< br>]]></xsl:text>
ИД родителя: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:ID_PARENT"/></b><xsl:text disable-output-escaping="yes"><![CDATA[< br>]]></xsl:text>
Имя: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:NAME"/></b><xsl:text disable-output-escaping="yes"><![CDATA[< br>]]></xsl:text>
Полное имя: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:FULL_NAME"/></b>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Смотрим результат:


SQL> set long 32000
SQL> select * from v$version where rownum=1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production

SQL>
SQL> select xmltransform(xmltype(
2 '<?xml version="1.0" encoding="Windows-1251"?>
3 <REQUEST xmlns="http://localhost/schemas/data" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4 <DATA>
5 <ID>12345</ID>
6 <ID_PARENT>1234</ID_PARENT>
7 <NAME>Узел 12345</NAME>
8 <FULL_NAME>Узел 12345, родитель 1234</FULL_NAME>
9 </DATA>
10 </REQUEST>'), xmltype(
11 '<?xml version="1.0" encoding="Windows-1251"?>
12 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sdt="http://localhost/schemas/data" version="1.0">
13 <xsl:output method="html"/>
14 <xsl:template match="/">
15 <html>
16 <head>
17 <title>Элемент дерева</title>
18 </head>
19 <body>
20 ИД: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:ID"/></b><xsl:text disable-output-escaping="yes"><![CDATA[< br>]]></xsl:text>
21 ИД родителя: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:ID_PARENT"/></b><xsl:text disable-output-escaping="yes"><![CDATA[< br>]]></xsl:text>
22 Имя: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:NAME"/></b><xsl:text disable-output-escaping="yes"><![CDATA[< br>]]></xsl:text>
23 Полное имя: <b><xsl:value-of select="/sdt:REQUEST/sdt:DATA/sdt:FULL_NAME"/></b>
24 </body>
25 </html>
26 </xsl:template>
27 </xsl:stylesheet>')).getclobval()
28 from dual;

XMLTRANSFORM(XMLTYPE('<?XMLVER
--------------------------------------------------------------------------------
<html><head><title>Элемент дерева</title></head><body>
ИД: <b>12345</b>< br>
ИД родителя: <b>1234</b>< br>
Имя: <b>Узел 12345</b>< br>
Полное имя: <b>Узел 12345, родитель 1234</b></body></html>

SQL>

Теперь все правильно.


Читать полностью

, ,

Ошибки в при работе с адаптерами при установке J2EE + BPEL

вторник, 16 февраля 2010 г. 0 коммент.

При установке BPEL 10.3.1.1.0 на чистый J2EE, не устанавливаются адаптеры для работы с базой данных, очередями AQ и JMS.

При попытке использовать неустановленные адаптеры, возникают ошибки:

для jms - Missing class: oracle.tip.adapter.jms.outbound.JmsProduceInteractionSpec
для БД - Missing class: oracle.tip.adapter.db.DBStoredProcedureInteractionSpec

Решение можно найти на My Oracle Support:


  • Article: Adapter Modules Missing On SOA Installation [ID 754146.1]

  • Problem: Error Running BPEL Process Using Adapters - Adapters Missing On Install [ID 433524.1]

  • Bug 5935034: BPEL ADAPATER ARE NOT THERE / CANNOT BE PATCHED AFTER CLEAN INSTALL J2EE+BPEL

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


  1. Проверить, что файл $ORACLE_HOME/j2ee/<bpel container>/config/oc4j-connectors.xml содержит описание адаптеров. <bpel container> – OC4J контейнер, где запускается BPEL, как приложение.

  2. Задеплоить адаптеры используя AS Control. <bpel_container>/Applications/выпадающий список Standalone Resource Adapters. Нажимаем деплой и выбираем необходимые файлы адаптеров из директории $ORACLE_HOME/bpel/system/services/lib.

Соответствие имени файла адаптера и имени адаптера:


Имя файла Имя адаптера
AqAdapter.rar AqAdapter
DBAdapter.rar DbAdapter
fileAdapter.rar FileAdapter
ftpAdapter.rar FtpAdapter
JmsAdapter.rar JmsAdapter
MQSeriesAdapter.rar MQSeriesAdapter

Читать полностью

,

Зависший job (hanging job)

вторник, 15 декабря 2009 г. 0 коммент.

В одной из баз попросили разобраться почему не работает job. По всем признакам он был валидным: флажок broken имел значение “N”, количество неудачных попыток (failures) было равно 0. Смущало только одно значение, следующее дата и время выполнения (next_date, next_time), оно было меньше текущей даты на 10 дней, хотя job должен был выполняться через каждые 5 минут. Вывод был один, джоб не завершил предыдущее задание, и поэтому не может дальше продолжить свою работу.

Чтобы найти работающие джобы нужно обратиться к вьюшке dba_jobs_running или v$lock.

SQL>
SQL> select v$lock.sid as sid,
2 v$lock.type as lock_type,
3 v$lock.id1,
4 v$lock.id2 as job
5 from v$lock
6 where v$lock.type = 'JQ';

SID LOCK_TYPE ID1 JOB
---------- --------- ---------- ----------
171 JQ 0 405

SQL>
SQL> select dba_jobs_running.sid,
2 dba_jobs_running.job,
3 dba_jobs_running.failures,
4 dba_jobs_running.last_date,
5 dba_jobs_running.last_sec
6 from dba_jobs_running;

SID JOB FAILURES LAST_DATE LAST_SEC
---------- ---------- ---------- ----------- --------------------------------
171 405 0 01.12.2009 17:11:53

SQL>
Да это мой зависший job c номером 405. Посмотрим, что делает сессия с номером 171.
SQL>
SQL>
SQL> select v$session_wait.event
from v$session_wait
where v$session_wait.sid = 171;

EVENT
---------------------------
SQL*Net message from dblink

SQL>
Сессия ожидает ответа по DBLink. Сессия “не убиваемая”, пришлось убивать процесс с помощью orakill. Читать полностью