Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 convert для xmltype or clob in 9i  [new]
AlexVin
Member

Откуда: E-burg
Сообщений: 1055
перевести в pl/sql содержимое clob-а размером больше 32767 можно только convert-ом по кускам?
или для xmltype нет ли какого способа перекодироваться?

ну неправильно как-то писать для каждого значения в select-е

   c_xml_charset constant varchar2(4)  := 'UTF8';
   l_xmlclob    clob;                  
begin
select sys_XMLgen(xmlconcat(xmlforest(
 convert('аыоу', c_xml_charset) TOP,
 convert(...

  ).GetClobVal() into l_xmlclob
    from ...
21 ноя 07, 08:47    [4942708]     Ответить | Цитировать Сообщить модератору
 Re: convert для xmltype or clob in 9i  [new]
AlexVin
Member

Откуда: E-burg
Сообщений: 1055
oracle 9.2.0.7
долой каноническое написание pl/sql кода!
SQL> set serveroutput on
SQL> declare 
  2     l_clob clob;
  3     c_xml_charset constant varchar2(4)  := 'UTF8';
  4  BEGIN
  5     l_clob := l_clob||rpad('ы', 32767, 'ы')||rpad('ы', 32767, 'ы')||'йй';
  6     dbms_output.put_line('before = '||length(l_clob));
  7     l_clob := convert(l_clob, c_xml_charset);
  8     dbms_output.put_line('after = '||length(l_clob));
  9  end;
 10  /
before = 65536
after = 131072

PL/SQL procedure successfully completed.

SQL> declare 
  2     l_clob clob;
  3     c_xml_charset constant varchar2(4)  := 'UTF8';
  4  BEGIN
  5     l_clob := l_clob||rpad('ы', 32767, 'ы')||rpad('ы', 32767, 'ы')||'йй';
  6     dbms_output.put_line('before = '||length(l_clob));
  7     l_clob := convert(src => l_clob, destcset => c_xml_charset);
  8     dbms_output.put_line('after = '||length(l_clob));
  9  end;
 10  /
before = 65536
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 7


SQL> 
23 ноя 07, 06:45    [4953289]     Ответить | Цитировать Сообщить модератору
 Re: convert для xmltype or clob in 9i  [new]
AlexVin
Member

Откуда: E-burg
Сообщений: 1055
не ругается, но содержимое цлоба после такой перекодировки - бред...
SQL> declare 
  2         l_clob clob;
  3         l_vc   varchar2(20);
  4         c_xml_charset constant varchar2(4)  := 'UTF8';
  5  --       c_xml_charset constant varchar2(400)  := 'CL8MSWIN1251';
  6  BEGIN
  7         l_vc   := 'ый';
  8         l_clob := l_vc;
  9         dbms_output.put_line(l_clob);
 10         dbms_output.put_line('before = '||length(l_clob));
 11         l_clob := convert(l_clob, c_xml_charset);
 12         dbms_output.put_line('after = '||length(l_clob));
 13         dbms_output.put_line(l_clob);
 14         dbms_output.put_line(ascii(l_clob));
 15         dbms_output.put_line(l_vc);
 16         l_vc := convert(l_vc, c_xml_charset);
 17         dbms_output.put_line(l_vc);
 18         dbms_output.put_line(ascii(l_vc));
 19  end;
 20  /
ый
before = 2
after = 4
K9
4
ый
б?аЙ
209

PL/SQL procedure successfully completed.

SQL> 
23 ноя 07, 08:47    [4953408]     Ответить | Цитировать Сообщить модератору
 Re: convert для xmltype or clob in 9i  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
А что ты хочешь? У тебя вторая перекодировка происходит (server->client)
Смотри содержимое через DUMP
23 ноя 07, 08:52    [4953414]     Ответить | Цитировать Сообщить модератору
 Re: convert для xmltype or clob in 9i  [new]
Elic
Member

Откуда:
Сообщений: 29988
AlexVin
долой каноническое написание pl/sql кода!
Включай мозги
C:\ora92\rdbms\admin>grep -i "function convert" stdspec.sql
function CONVERT(src VARCHAR2 character set any_cs,
function CONVERT(src VARCHAR2 character set any_cs,
function CONVERT(SRCSTR CLOB CHARACTER SET ANY_CS,
function CONVERT(SRCSTR CLOB CHARACTER SET ANY_CS,
23 ноя 07, 08:55    [4953420]     Ответить | Цитировать Сообщить модератору
 Re: convert для xmltype or clob in 9i  [new]
AlexVin
Member

Откуда: E-burg
Сообщений: 1055
declare 
       l_clob clob;
       l_vc   varchar2(20);
       l_cl   varchar2(20);
       c_xml_charset constant varchar2(4)  := 'UTF8';
     amt number := 20;
     off number := 1;
BEGIN
       l_vc   := 'ый';
       l_clob := l_vc;
       l_clob := convert(l_clob, c_xml_charset);
       l_vc := convert(l_vc, c_xml_charset);
       DBMS_LOB.READ(l_clob, amt, off, l_cl);
       if l_vc = l_cl then 
        dbms_output.put_line('Y');
       else 
        dbms_output.put_line('N');
       end if;
end;
в чем туплю? почему они разные?
23 ноя 07, 09:19    [4953472]     Ответить | Цитировать Сообщить модератору
 Re: convert для xmltype or clob in 9i  [new]
AlexVin
Member

Откуда: E-burg
Сообщений: 1055
Вячеслав Любомудров
А что ты хочешь? У тебя вторая перекодировка происходит (server->client)
Смотри содержимое через DUMP


я пишу utl_file, у сессии на серваке nls_lang utf8, а итог тот же самый (
convert(clob) -> substr(clob) -> file
и
substr(clob) -> convert(varchar2) -> file
совершенно разные вещи...


Elic
AlexVin
долой каноническое написание pl/sql кода!
Включай мозги

это шутка была про собственую невнимательность из-за pl/sql-developer-а
однако избавление от такого заблуждения мне еще в целом не помогло (
23 ноя 07, 09:46    [4953580]     Ответить | Цитировать Сообщить модератору
 Re: convert для xmltype or clob in 9i  [new]
AlexVin
Member

Откуда: E-burg
Сообщений: 1055
не дайте помереть тупым
ну никакой это не utf8 в случае convert-а цлоба
declare 
  l_clob clob := chr(235)||chr(217); --'ый';
  g_output utl_file.file_type;
BEGIN
   g_output := utl_file.fopen('/oracle/tmp', 'a_tmp.html', 'w', 32000); 
   utl_file.put_line(g_output, convert(chr(235)||chr(217), 'UTF8')); 
   utl_file.put_line(g_output, convert(l_clob, 'UTF8')); 
   utl_file.fclose(g_output);
end;
27 ноя 07, 10:24    [4966956]     Ответить | Цитировать Сообщить модератору
 Re: convert для xmltype or clob in 9i  [new]
Elic
Member

Откуда:
Сообщений: 29988
STFF при работе с CLOB не корректно работает convert
Тут вроде как намёк: RTFM Choosing an Oracle Database Character Set (FAQ)
27 ноя 07, 10:56    [4967169]     Ответить | Цитировать Сообщить модератору
 Re: convert для xmltype or clob in 9i  [new]
AlexVin
Member

Откуда: E-burg
Сообщений: 1055
спасибо!


"...а не спеши ты нас хоронить..."
27 ноя 07, 11:48    [4967588]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить