, , , ,

xsd datetime в Oracle DB

понедельник, 5 апреля 2010 г. 0 коммент.

Для преобразования даты и времени из DB Oracle в дату и время XSD можно воспользоваться следующим шаблоном 'yyyy-mm-dd"T"hh24:mi:ss.ff6tzr'.
Почитать о дате и времени в xsd можно тут. О форматах шаблона преобразования в Oracle DB тут.

Посмотрим на примерах, преобразуем дату и время в datetime xsd.


select xmlelement(depts, xmlagg(
xmlelement(dept,
xmlforest(deptno,
dname,
loc,
to_char(systimestamp+numtodsinterval(rownum,'minute'),
'yyyy-mm-dd"T"hh24:mi:ss.ff6tzr') as ts
)
)
)).getclobval()
from dept;

Результат:

<DEPTS>
<DEPT>
<DEPTNO>10</DEPTNO>
<DNAME>ACCOUNTING</DNAME>
<LOC>NEW YORK</LOC>
<TS>2010-03-29T18:59:48.898873+04:00</TS>
</DEPT>
<DEPT>
<DEPTNO>20</DEPTNO>
<DNAME>RESEARCH</DNAME>
<LOC>DALLAS</LOC>
<TS>2010-03-29T19:00:48.898873+04:00</TS>
</DEPT>
<DEPT>
<DEPTNO>30</DEPTNO>
<DNAME>SALES</DNAME>
<LOC>CHICAGO</LOC>
<TS>2010-03-29T19:01:48.898873+04:00</TS>
</DEPT>
<DEPT>
<DEPTNO>40</DEPTNO>
<DNAME>OPERATIONS</DNAME>
<LOC>BOSTON</LOC>
<TS>2010-03-29T19:02:48.898873+04:00</TS>
</DEPT>
</DEPTS>

А теперь datetime xsd преобразуем в timestamp Oracle DB.

SQL> COLUMN DEPTNO FORMAT A8
SQL> COLUMN DNAME FORMAT A12
SQL> COLUMN LOC FORMAT A12
SQL>
SQL> select extractvalue(value(row_dept), '/DEPT/DEPTNO') as deptno,
2 extractvalue(value(row_dept), '/DEPT/DNAME') as dname,
3 extractvalue(value(row_dept), '/DEPT/LOC') as loc,
4 to_timestamp_tz(extractvalue(value(row_dept), '/DEPT/TS'),
5 'yyyy-mm-dd"T"hh24:mi:ss.ff6tzh:tzm') as ts
6 from (
7 select xmltype(
8 '<DEPTS>
9 <DEPT>
10 <DEPTNO>10</DEPTNO>
11 <DNAME>ACCOUNTING</DNAME>
12 <LOC>NEW YORK</LOC>
13 <TS>2010-03-29T18:59:48.898873+04:00</TS>
14 </DEPT>
15 <DEPT>
16 <DEPTNO>20</DEPTNO>
17 <DNAME>RESEARCH</DNAME>
18 <LOC>DALLAS</LOC>
19 <TS>2010-03-29T19:00:48.898873+04:00</TS>
20 </DEPT>
21 <DEPT>
22 <DEPTNO>30</DEPTNO>
23 <DNAME>SALES</DNAME>
24 <LOC>CHICAGO</LOC>
25 <TS>2010-03-29T19:01:48.898873+04:00</TS>
26 </DEPT>
27 <DEPT>
28 <DEPTNO>40</DEPTNO>
29 <DNAME>OPERATIONS</DNAME>
30 <LOC>BOSTON</LOC>
31 <TS>2010-03-29T19:02:48.898873+04:00</TS>
32 </DEPT>
33 </DEPTS>') as xml_data
34 from dual
35 ) xml_table,
36 table(xmlsequence(extract(xml_table.xml_data, '/DEPTS/DEPT'))) row_dept;

DEPTNO DNAME LOC TS
-------- ------------ ------------ -------------------------------------------------
10 ACCOUNTING NEW YORK 29.03.10 18:59:48,898873000 +04:00
20 RESEARCH DALLAS 29.03.10 19:00:48,898873000 +04:00
30 SALES CHICAGO 29.03.10 19:01:48,898873000 +04:00
40 OPERATIONS BOSTON 29.03.10 19:02:48,898873000 +04:00


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

, , , ,

Неправильно формированный тэг 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

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