Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 XMLForest  [new]
ЕвгенийЧ
Member

Откуда:
Сообщений: 24
Всем привет !
Может мне кто нибудь подскажет, как мне показать элементы с нулевым значением ? Пожалуйста.

1.)SQL> create table test1 (name varchar2(10),val number,dat date);
2.)insert into test1 (name,val,dat) values ('pole1',1,sysdate);
3.)insert into test1 (name) values('pole2');
4.)commit;

5.)SQL> select * from test1;

NAME VAL DAT
---------- ---------- --------
pole1 1 11.05.06
pole2
6.)SQL> select XMLForest(name,val,dat) from test1

XMLFOREST(NAME,VAL,DAT)
-----------------------------------------------
<NAME>pole1</NAME>
<VAL>1</VAL>
<DAT>11.05.06</DAT>

<NAME>pole2</NAME>
------------------------------
Хотелось бы видеть

<NAME>pole1</NAME>
<VAL>1</VAL>
<DAT>11.05.06</DAT>

<NAME>pole2</NAME>
<VAL/>
<DAT/>
11 май 06, 09:49    [2650766]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
PetrovL
Member

Откуда:
Сообщений: 170
select XMLConcat(XMLElement("name",test1.name),XMLElement("val",test1.val),XMLElement("dat",test1.dat)) from test1
11 май 06, 10:33    [2651054]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
Andrew IF
Member

Откуда: Москва
Сообщений: 741
У меня придумалась только вот такая штука:
SQL> select xmlagg(xmlconcat(
  2  xmltype.createxml(nvl2(name,'<name>'||name||'</name>','<name/>')),
  3  xmltype.createxml(nvl2(val,'<val>'||val||'</val>','<val/>')),
  4  xmltype.createxml(nvl2(dat,'<dat>'||dat||'</dat>','<dat/>'))
  5  )).getstringval() xml
  6   from test1;

XML                                                                             
--------------------------------------------------------------------------------
<name>pole1</name>
<val>1</val>
<dat>09-MAY-06</dat>
<name>pole2</name>
<val/>
<dat/>
11 май 06, 10:46    [2651127]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
AlexVer
Member

Откуда: Москва
Сообщений: 80
Можно
select XMLForest(nvl(name,' ') as name,nvl(val,' ') as val,nvl(TO_CHAR(dat),' ') as dat) from test1
11 май 06, 11:06    [2651307]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
Andrew IF
Member

Откуда: Москва
Сообщений: 741
SQL> select XMLForest(nvl(name,' ') as name,nvl(val,' ') as val,nvl(TO_CHAR(dat),' ') as dat) from test1;
ERROR:
ORA-01722: invalid number 



no rows selected

SQL> select XMLConcat(XMLElement("name",test1.name),XMLElement("val",test1.val),XMLElement("dat",test1.dat)).getstringval() XML from test1;

XML
--------------------------------------------------------------------------------
<name>pole1</name><val>1</val><dat>2006-05-09</dat>                             
<name>pole2</name><val></val><dat></dat>
 
11 май 06, 11:12    [2651347]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
AlexVer
Member

Откуда: Москва
Сообщений: 80
Вариант Andrew IF безусловно более правильный ;-)
чем
select XMLForest(nvl(name,' ') as name,nvl(TO_CHAR(val),' ') as val,nvl(TO_CHAR(dat),' ') as dat) from test1;
11 май 06, 11:50    [2651563]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
ЕвгенийЧ
Member

Откуда:
Сообщений: 24
SQL*Plus: Release 9.2.0.1.0 - Production on ×òâ Ìàé 11 09:27:23 2006

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
With the Partitioning option
JServer Release 9.2.0.6.0 - Production

SQL> select XMLConcat(XMLElement("TotalSpecificationSheetQuantity",test1.name),XML
1.val),XMLElement("dat",test1.dat)).getstringval() XML from test1;

XML
--------------------------------------------------------------------------------
<TotalSpecificationSheetQuantity>pole1</TotalSpecificationSheetQuantity><val>1</
val><dat>11.05.06</dat>

<TotalSpecificationSheetQuantity>pole2</TotalSpecificationSheetQuantity><val></v
al><dat></dat>
------------------------------

Всё проходит на ура, а если я вставляю этот кусок в процедуру (Oracle Enterprise Manager или SQL Navigator) выдаёт ошибку:
Line # = 38 Column # = 15 Error Text = PLS-00114: идентификатор 'TotalSpecificationSheetQuantitUTF-8"?><GTDouts>' слишком велик
---------------
TotalSpecificationSheetQuantity (31 символ)


Что делать ?
11 май 06, 14:00    [2652397]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
AlexVer
Member

Откуда: Москва
Сообщений: 80
В 10gr2

SQL*Plus: Release 10.2.0.1.0 - Production on Чт Май 11 14:19:24 2006

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Присоединен к:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> SELECT XMLCONCAT(XMLELEMENT("TotalSpecificationSheetQuantity", 'hthjtjh6'),
2 XMLELEMENT("val", 1),
3 XMLELEMENT("dat", 'dvdd')) .GETSTRINGVAL() XML
4 FROM DUAL;

XML
--------------------------------------------------------------------------------
<TotalSpecificationSheetQuantity>hthjtjh6</TotalSpecificationSheetQuantity><val>
1</val><dat>dvdd</dat>
11 май 06, 14:20    [2652522]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
PetrovL
Member

Откуда:
Сообщений: 170
ЕвгенийЧ
TotalSpecificationSheetQuantity (31 символ)
Что делать ?


А сам как думаешь что делать? Уменьшать длину хотя бы до 30 символов
11 май 06, 14:21    [2652525]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
ЕвгенийЧ
Member

Откуда:
Сообщений: 24
А сам как думаешь что делать? Уменьшать длину хотя бы до 30 символов
---------------------
Да я бы с удовольствием, только мне нужно на выходе получить XML, который уже утверждён во всех инстанциях. Сократить название элемента нельзя, может есть какой нибудь другой выход ? :)
11 май 06, 14:27    [2652571]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
AlexVer
Member

Откуда: Москва
Сообщений: 80
На 9.2.0.6

SQL*Plus: Release 10.2.0.1.0 - Production on Чт Май 11 14:42:09 2006

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Присоединен к:
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.6.0 - Production

SQL> SELECT XMLCONCAT(XMLELEMENT("TotalSpecificationSheetQuantity", 'hthjtjh6'),
2 XMLELEMENT("val", 1),
3 XMLELEMENT("dat", 'dvdd')) .GETSTRINGVAL() XML
4 FROM DUAL;

XML
--------------------------------------------------------------------------------
<TotalSpecificationSheetQuantity>hthjtjh6</TotalSpecificationSheetQuantity><val>
1</val><dat>dvdd</dat>


SQL>
11 май 06, 14:42    [2652680]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
PetrovL
Member

Откуда:
Сообщений: 170
на 10.1 все работает с длинным наименованием элемента
11 май 06, 14:59    [2652841]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
ЕвгенийЧ
Member

Откуда:
Сообщений: 24
Я правильно понял что Oracle9i не может работать с именами >30 символов, а в Oracle Database 10g это ограничение сняли ?
11 май 06, 15:27    [2653064]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
PetrovL
Member

Откуда:
Сообщений: 170
ЕвгенийЧ
Я правильно понял что Oracle9i не может работать с именами >30 символов, а в Oracle Database 10g это ограничение сняли ?


Думаю, что это касается только имен xml-элементов
для переменных и атрибутов все по-прежнему
11 май 06, 15:38    [2653144]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
ЕвгенийЧ
Member

Откуда:
Сообщений: 24
Я извиняюсь за назойливость, в Oracle Database 10g имена xml-элементов можно задать > 30 символов ?
Стоит или не стоит поднять версию Oracle c 9 до 10?
11 май 06, 16:09    [2653329]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
Andrew IF
Member

Откуда: Москва
Сообщений: 741
ЕвгенийЧ
Я извиняюсь за назойливость, в Oracle Database 10g имена xml-элементов можно задать > 30 символов ?


Как я понял у Вас проблема внутри процедуры.

SQL> select * from v$version;

BANNER                                                                          
----------------------------------------------------------------                
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod                
PL/SQL Release 10.2.0.2.0 - Production                                          
CORE	10.2.0.2.0	Production                                                      
TNS for Linux: Version 10.2.0.2.0 - Production                                  
NLSRTL Version 10.2.0.2.0 - Production                                          

SQL> create or replace function getxml return xmltype is
  2  xml xmltype;
  3  begin
  4  xml:=xmltype('<T1234567890123456789012345678901234567890>:)</T1234567890123456789012345678901234567890>');
  5  return xml;
  6  end;
  7  /

Function created.

SQL> select getxml().getclobval() from dual;

GETXML().GETCLOBVAL()                                                           
--------------------------------------------------------------------------------
<T1234567890123456789012345678901234567890>:)</T12345678901234567890123456789012
11 май 06, 16:25    [2653433]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
ЕвгенийЧ
Member

Откуда:
Сообщений: 24
TNS for HPUX: Version 9.2.0.6.0 - Production
NLSRTL Version 9.2.0.6.0 - Production

SQL> create or replace function getxml return xmltype is
2 xml xmltype;
3 begin
4 xml:=xmltype('<T1234567890123456789012345678901234567890>:)</T123456789012345678901234567890123
4567890>');
5 return xml;
6 end;
7 /

Function created.

SQL> select getxml().getclobval() from dual;

GETXML().GETCLOBVAL()
--------------------------------------------------------------------------------
<T1234567890123456789012345678901234567890>:)</T12345678901234567890123456789012
--------
--------

Исходник процедуры.
--
is
ctx dbms_xmlquery.ctxHandle;
xml XMLtype;
c clob;
c1 clob;
c2 CLOB;
c3 XMLtype;
v_str varchar2(20000);
begin
dbms_lob.createtemporary(c, true, dbms_lob.call);
v_str := '<GTDouts>';
dbms_lob.writeappend(c,length(v_str),v_str);

SELECT XMLForest(empno as "empno123456789123456789123456789") into c3 FROM emp where rownum=1;
c2 := c3.getClobVal();

dbms_lob.writeappend(c,length(c2),c2);

v_str := 'select * from emp';
ctx := dbms_xmlquery.newContext(v_str);
--открываем тэг <GTDout>
dbms_xmlquery.setRowsetTag(ctx, 'GTDout');
xml := XMLType(dbms_xmlquery.getXML(ctx));
c1 := xml.extract('/GTDout').getClobVal();
dbms_xmlquery.closeContext(ctx);
dbms_lob.writeAppend(c, dbms_lob.getLength(c1), c1);
--Главный закрывающий тэг </GTDouts>
v_str := '</GTDouts>';
dbms_lob.writeappend(c, length(v_str), v_str);
-- Записываем в CLOB таблицы
delete test_lob;
insert into test_lob(cdata) values (c);
--ZAGR_XML_UT(); --ОТПРАВЛЯЕМ ПО ПОЧТЕ
end;
----------------
А это ошибка которая появляется при компиляции

Line # = 21 Column # = 27 Error Text = PLS-00114: идентификатор 'empno1234567891234567891234567' слишком велик
----------------
Это тестовый вариант, сократить алиас до 30 символов нельзя. Что делать ?
12 май 06, 08:13    [2655517]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
Andrew IF
Member

Откуда: Москва
Сообщений: 741
Инфа с металинка:
Bug 3461263 - False PLS-114 calling XMLElement() from PLSQL with 30 characters
Fixed in Product Version 10.2.0.0.0
Есть Patch 3461263 для 9.2.0.6

В 10.2.0.2:
SQL> select * from v$version;

BANNER                                                                          
----------------------------------------------------------------                
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod                
PL/SQL Release 10.2.0.2.0 - Production                                          
CORE	10.2.0.2.0	Production                                                      
TNS for Linux: Version 10.2.0.2.0 - Production                                  
NLSRTL Version 10.2.0.2.0 - Production                                          


SQL> create or replace procedure testxml as
  2  ctx dbms_xmlquery.ctxHandle;
  3  xml XMLtype;
  4  c clob;
  5  c1 clob;
  6  c2 CLOB;
  7  c3 XMLtype;
  8  v_str varchar2(20000);
  9  begin
 10  dbms_lob.createtemporary(c, true, dbms_lob.call);
 11  v_str := '<GTDouts>';
 12  dbms_lob.writeappend(c,length(v_str),v_str);
 13  SELECT XMLForest(empno as "empno123456789123456789123456789") into c3 FROM scott.emp where rownum=1;
 14  c2 := c3.getClobVal();
 15  dbms_lob.writeappend(c,length(c2),c2);
 16  v_str := 'select * from scott.emp';
 17  ctx := dbms_xmlquery.newContext(v_str);
 18  --ioe?uaaai oya <GTDout>
 19  dbms_xmlquery.setRowsetTag(ctx, 'GTDout');
 20  xml := XMLType(dbms_xmlquery.getXML(ctx));
 21  c1 := xml.extract('/GTDout').getClobVal();
 22  dbms_xmlquery.closeContext(ctx);
 23  dbms_lob.writeAppend(c, dbms_lob.getLength(c1), c1);
 24  --Aeaaiue cae?uaa?uee oya </GTDouts>
 25  v_str := '</GTDouts>';
 26  dbms_lob.writeappend(c, length(v_str), v_str);
 27  -- Caienuaaai a CLOB oaaeeou
 28  delete test_lob;
 29  insert into test_lob(cdata) values (c);
 30  --ZAGR_XML_UT(); --IOI?AAE?AI II II?OA
 31  end;
 32  /

Procedure created.

SQL> begin
  2  testxml;
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> select * from test_lob;

CDATA                                                                           
--------------------------------------------------------------------------------
<GTDouts><empno123456789123456789123456789>7369</empno12345678912345678912345678
12 май 06, 10:18    [2655897]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
ЕвгенийЧ
Member

Откуда:
Сообщений: 24
Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
PL/SQL Release 9.2.0.6.0 - Production
CORE 9.2.0.6.0 Production
TNS for HPUX: Version 9.2.0.6.0 - Production
NLSRTL Version 9.2.0.6.0 - Production

SQL> r
1 create or replace procedure testxml as
2 ctx dbms_xmlquery.ctxHandle;
3 xml XMLtype;
4 c clob;
5 c1 clob;
6 c2 CLOB;
7 c3 XMLtype;
8 v_str varchar2(20000);
9 begin
10 dbms_lob.createtemporary(c, true, dbms_lob.call);
11 v_str := '<GTDouts>';
12 dbms_lob.writeappend(c,length(v_str),v_str);
13 SELECT XMLForest(empno as "empno123456789123456789123456789") into c3 FROM emp where rownum=1
14 c2 := c3.getClobVal();
15 dbms_lob.writeappend(c,length(c2),c2);
16 v_str := 'select * from scott.emp';
17 ctx := dbms_xmlquery.newContext(v_str);
18 --ioe?uaaai oya <GTDout>
19 dbms_xmlquery.setRowsetTag(ctx, 'GTDout');
20 xml := XMLType(dbms_xmlquery.getXML(ctx));
21 c1 := xml.extract('/GTDout').getClobVal();
22 dbms_xmlquery.closeContext(ctx);
23 dbms_lob.writeAppend(c, dbms_lob.getLength(c1), c1);
24 --Aeaaiue cae?uaa?uee oya </GTDouts>
25 v_str := '</GTDouts>';
26 dbms_lob.writeappend(c, length(v_str), v_str);
27 -- Caienuaaai a CLOB oaaeeou
28 delete test_lob;
29 insert into test_lob(cdata) values (c);
30 --ZAGR_XML_UT(); --IOI?AAE?AI II II?OA
31* end;

Предупреждение: Процедура создана с ошибками компиляции.

-----
Line # = 13 Column # = 29 Error Text = PLS-00114: идентификатор 'empno123456789123456789123456789' слишком велик
12 май 06, 12:47    [2656772]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
Andrew IF
Member

Откуда: Москва
Сообщений: 741
Я что-то не догоняю, что Вы хотели показать этим постом. У вас 9.2.0.6, в котором Bug 3461263, пофиксеный в 10.2, что я и продемонстрировал. Для 9.2.0.6 есть Patch 3461263.
12 май 06, 12:55    [2656827]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
ЕвгенийЧ
Member

Откуда:
Сообщений: 24
Andrew IF
Как я понял у Вас проблема внутри процедуры.
------------------------
Я извиняюсь за глупые вопросы, я только учусь.

Хотел показать что с процедурой всё в порядке. Это особенности Oracle9i.
Пришёл к выводу что мне не светит работать с именами элементов более 30 символов, так ?
Единственный способ переходить на Oracle Database 10g.
12 май 06, 13:14    [2656933]     Ответить | Цитировать Сообщить модератору
 Re: XMLForest  [new]
Andrew IF
Member

Откуда: Москва
Сообщений: 741
ЕвгенийЧ

Пришёл к выводу что мне не светит работать с именами элементов более 30 символов, так ?
Единственный способ переходить на Oracle Database 10g.


This issue is fixed in
9.2.0.8 (Server Patch Set)
10.1.0.5 (Server Patch Set)
10.2.0.1 (Base Release)


Выбирайте релиз на своё усмотрение.

Мне негде проверять, но может есть и другие способы. Например, использование динамического SQL. Или может с Java что-то получится...
12 май 06, 13:34    [2657068]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить