Каталог статей
Меню сайта


Форма входа


Категории раздела
Oracle DB [72]
Materials concerning Oracle database
Howto [24]
Все про Oracle [65]
Разработка на SQL и PL/SQL для Oracle, анализ работы базы
Построение Web-интерфейса: все что касается JSF, ADF и AJAX [9]
Разное [19]
Solaris [46]
Что касается администрирования Solaris
Linux [29]
Заметки по настройке Linux
AIX [1]
AIX, настройка Oracle на AIX
Java [15]
Cryptography [10]
Windows [1]
Java [35]
PostgreSQL [2]


Поиск


Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz


  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0


    Приветствую Вас, Гость · RSS 20.05.2024, 01:24
    Главная » Статьи » Все про Oracle

    XSLT преобразование в PLSQL

    А) Если делать все внутри PLSQL, то есть если есть
        l_xsl := XMLType(xsl);
        l_xml := XMLType(xml);

    для преобразования внутри PLSQL можно использовать
    1.  select xmltransform(l_xml, l_xsl).GetClobVal() into l_result from dual;
    или
    2.  l_result := l_xml.transform(l_xsl).GetClobVal();

    на небольших размерах xml и xsl 2-й вариант работает раз в 10 быстрее.

    Б) XMLType можно хранить в таблице:

    CREATE TABLE mytable1_tmp
    (xsl_column XMLType,
    xml_column XMLType);

    и делать преобразование:
    select xmltransform(xml_column, xsl_column) from mytable1_tmp



    В) Если работать через CLOB, на стороне базы он будет в кодировке базы, а
    на стороне клиента - в кодировке клиента (NLS_LANG). Чтобы использовать другую произвольную
    кодировку, чтобы, например, потом записать в файл, результат должен быть RAW или BLOB.

    XMLType можно перекодировать так:

    SELECT XMLSERIALIZE(CONTENT t.xml_column AS BLOB ENCODING 'KOI8-R')
    FROM mytable1_tmp t;
    или
    l_blob := l_xml.GetBlobVal(NLS_CHARSET_ID('CL8KOI8R') );


    перекодировать CLOB можно, например, так:

     procedure recode(p_in IN CLOB,
                       x_out IN OUT NOCOPY BLOB,
                       p_charset IN varchar2)
      is
        l_buff varchar2(32000);
        l_buffer_size PLS_INTEGER := 1024;
        l_offset PLS_INTEGER := 1;
        l_amount PLS_INTEGER := 0;
      begin
        l_amount := least(l_buffer_size, length(p_in) - l_offset + 1);
        loop
          l_amount := least(l_buffer_size, length(p_in) - l_offset + 1);
          exit when (l_amount = 0);
          dbms_lob.read(p_in,
                        l_amount,
                        l_offset,
                        l_buff);
          exit when (l_amount = 0);
          l_offset := l_offset + l_amount;
          dbms_lob.append(x_out, utl_i18n.string_to_raw(l_buff, p_charset)  );
        end loop;
      exception
        when no_data_found then null; -- dbms_lob.read raises the exception when reading past EOF
      end;

    Г) Пример с xslt:

    declare
      l_xsl varchar2(2000) := '
    <xsl:stylesheet version="2.0"
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
       xmlns:fn="http://www.w3.org/2005/xpath-functions"
       xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output method="html" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/table">
      <html>
      <body>
      <xsl:apply-templates select="title"/>
      <xsl:apply-templates select="rowset"/>
      </body>
      </html>
    </xsl:template>
    <xsl:template match="title">
      <h1><xsl:value-of select="."></xsl:value-of></h1>
    </xsl:template>
    <xsl:template match="rowset">
      <table border="2" cellpadding="2" cellspacing="2" >
        <xsl:apply-templates select="row"/>
      </table>
    </xsl:template>
    <xsl:template match="row">
      <tr>
        <xsl:apply-templates select="field"/>
      </tr>
    </xsl:template>
    <xsl:template match="field">
      <td>
        <xsl:value-of select="."></xsl:value-of>
      </td>
    </xsl:template>
    </xsl:stylesheet>'; 
      l_xml varchar2(2000) := '
    <table>
    <title>The table</title>
    <rowset>
      <row>
      <field>value1</field>
      <field>value2</field>
      </row>
      <row>
      <field>значение 1</field>
      <field>значение 2</field>
      </row>
    </rowset>
    </table>';
      l_result         CLOB;
      l_xmlt           XMLType;
      l_xslt           XMLType;
    begin
      l_xslt := XMLType(l_xsl);
      l_xmlt := XMLType(l_xml);
      select xmltransform(l_xmlt, l_xslt).GetClobVal() into l_result from dual;
      dbms_output.put_line(l_result);
      l_result := l_xmlt.transform(l_xslt).GetClobVal();
      dbms_output.put_line(l_result);
    end;
    Категория: Все про Oracle | Добавил: basil (08.06.2011)
    Просмотров: 4076 | Рейтинг: 0.0/0
    Всего комментариев: 0
    Имя *:
    Email *:
    Код *:
    Бесплатный конструктор сайтов - uCoz