XML에서 Oracle DB 테이블 : 문제가 발생합니다
문제
editPlus (Windows)를 사용하여 생성 된 샘플 XML 파일이 있습니다.
< ?xml version="1.0" encoding="UTF-8" ?> < badges > < row UserId="3714" Name="Teacher" Date="2008-09-15T08:55:03.923"/> < row UserId="994" Name="Teacher" Date="2008-09-15T08:55:03.957"/> < / badges>
여기서 내 목표는이 정보를 Oracle DB 테이블로 가져 오는 것입니다. 여기에서 제안한대로 https://stackoverflow.com/questions/998055?sort=newest#sort-top, SQL 명령을 실행하려고했습니다. 그러나 성공할 수 없었습니다.
========================== SQL 쿼리 1 ========================= ======
SQL> SELECT XMLTYPE(bfilename('D', 'tmp.xml'), nls_charset_id('UTF8')) xml_data FROM dual;
XML_DATA
------------------------------------------------------------
<?xml version="1.0" encoding="WINDOWS-1252"?>
<badges>
<row UserId="3714" Name
출력에서 XML 파일의 절반이 잘린 것을 볼 수 있습니다. 인코딩 유형 출력은 Windows-1252로 간주됩니다. 누군가 왜 그렇게 일어나고 있는지 설명 할 수 있습니까?
==========================================================================
================================ SQL 쿼리 2 ================= ===============
SQL> SELECT UserId, Name, to_timestamp(dt, 'YYYY-MM-DD"T"HH24:MI:SS.FF3') dt
2 FROM (SELECT XMLTYPE(bfilename('D', 'tmp.xml'), 3 nls_charset_id('WINDOWS-1252')) xml_data 4 FROM dual), 5 XMLTable('for $i in /badges/row 6 return $i' 7 passing xml_data 8 columns UserId NUMBER path '@UserId', 9 Name VARCHAR2(50) path '@Name', 10 dt VARCHAR2(25) path '@Date');XMLTable('for $i in /badges/row * ERROR at line 5: ORA-00933: SQL command not properly ended
=================================================== ==================== 동일한 쿼리가 여기에서 작동했습니다 https://stackoverflow.com/questions/998055?sort=newest#sort-top. 그러나 나에게는 그렇지 않습니다. 내 컴퓨터에 Oracle 10G가 설치되어 있습니다. 누군가가 쿼리를 작동시키기 위해 수정을 제안 할 수 있습니까?
감사.
해결책
첫 번째 포인트를 고려하면 출력은 전시에만 잘립니다. SQL*Plus에 얼마나 많은 바이트가 표시되는지 변경할 수 있습니다. SET LONG
:
SQL> SELECT XMLTYPE(bfilename('D', 'test.xml'),
2 nls_charset_id('WINDOWS-1252')) xml_data FROM dual;
XML_DATA
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<badges>
<row UserId="3714" Name=
SQL> SET LONG 4000
SQL> /
XML_DATA
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<badges>
<row UserId="3714" Name="Teacher" Date="2008-09-15T08:55:03.923"/>
<row UserId="994" Name="Teacher" Date="2008-09-15T08:55:03.957"/>
</badges>
알다시피, 문자 세트는 NLS 세션 매개 변수별로 수정됩니다 (예 : 파일은 클라이언트의 문자 세트로 변환됩니다).
두 번째 요점의 경우 :
- 어떤 버전의 SQL*Plus을 사용하고 있습니까? 데이터베이스보다 오래되었고 synthax를 인식하지 못할 수도 있습니다.
- SQL*Plus로 입력 한대로 정확한 쿼리를 게시 할 수 있습니까 (SO의 코드 기능을 사용하십시오).
Oracle 10.2.0.3으로 재현 할 수 없기 때문에 :
SQL> SELECT UserId, NAME, to_timestamp(dt, 'YYYY-MM-DD"T"HH24:MI:SS.FF3') dt
2 FROM (SELECT XMLTYPE(bfilename('D', 'test.xml'),
3 nls_charset_id('WINDOWS-1252')) xml_data FROM dual),
4 XMLTable('for $i in /badges/row
5 return $i'
6 passing xml_data columns UserId NUMBER path '@UserId',
7 NAME VARCHAR2(50) path '@Name',
8 dt VARCHAR2(25) path '@Date');
USERID NAME DT
---------- --------- ----------------------------
3714 Teacher 15/09/08 08:55:03,923000000
994 Teacher 15/09/08 08:55:03,957000000
업데이트: 이 xmltable synthax는 10gr2 (10.2.*)의 새로운 기능이어야합니다 (확인 필요).
그러나 XML 데이터에 액세스하는 다른 방법을 사용할 수 있습니다 ( 또 다른):
SQL> SELECT extractvalue(column_value, '/row/@UserId') "userID",
2 extractvalue(column_value, '/row/@Name') "Name",
3 extractvalue(column_value, '/row/@Date') "Date"
4 FROM TABLE(XMLSequence(XMLTYPE(bfilename('D', 'tmp.xml'),
5 nls_charset_id('WINDOWS-1252')).extract('/badges/row'))) t;
userID Name Date
------- --------- ------------------------
3718 Teacher 2008-09-15T08:55:03.923
994 Teacher 2008-09-15T08:55:03.957
다른 팁
나는 똑같은 문제가 있었는데 왜 그런지 궁금했습니다.
encoding="UTF-8"
바뀌었다
encoding="WINDOWS-1250"
내 경우 (로딩 후).
그런 다음 Oracle이 여기에서하는 일을 깨달았습니다. UTF-8 인코딩 된 XML을 데이터베이스의 기본 문자 세트로 변환하여 저장할 수 있습니다. 그렇기 때문에 '인코딩'의 값이 변경됩니다. Databse의 기본 문자 세트가 UTF-8 인 경우 'encodig'가 변경되지 않습니다.
XML 인 경우 실제로 UTF-8 인코딩 된 문자가있는 다음 데이터베이스에로드하려고합니다. nls_charset_id('WINDOWS-1252')
오류가 발생합니다.
짧게 말하면 : 걱정해서는 안됩니다. encoding="UTF-8"
변경 encoding="WINDOWS-1252"
, 그냥 무시하십시오 - 데이터베이스가 작업을 수행하고 있습니다.
도와 주셔서 감사합니다. '긴 4000 설정'은 잘림 문제를 수정했습니다.
그러나 나는 여전히 두 번째 쿼리를 실행하기 위해 고군분투하고 있습니다. 내 SQLPLUS 버전은 "SQL*Plus : 릴리스 10.1.0.2.0"입니다. 그 버전이 문제라고 생각하십니까?
다음은 내가 시도한 코드입니다.
SQL> select xmltype(bfilename('D','tmp.xml'),nls_charset_id('WINDOWS-1252')) xml_data from dual;
XML_DATA
-----------------------------------------------
<?xml version="1.0" encoding="WINDOWS-1252"?>
<badges>
<row UserId="3714" Name
SQL> set LONG 4000
SQL> /
XML_DATA
--------------------------------------------------
<?xml version="1.0" encoding="WINDOWS-1252"?>
<badges>
<row UserId="3714" Name="Teacher" Date="2008-09-15T08:55:03.923"/>
<row UserId="994" Name="Teacher" Date="2008-09-15T08:55:03.957"/>
</badges>
SQL> SELECT UserId, NAME, to_timestamp(dt, 'YYYY-MM-DD"T"HH24:MI:SS.FF3') dt
2 FROM (SELECT XMLTYPE(bfilename('D', 'tmp.xml'),
3 nls_charset_id('WINDOWS-1252')) xml_data FROM dual),
4 XMLTable('for $i in /badges/row
5 return $i'
6 passing xml_data columns UserId NUMBER path '@UserId',
7 NAME VARCHAR2(50) path '@Name',
8 dt VARCHAR2(25) path '@Date');
XMLTable('for $i in /badges/row
*
ERROR at line 4:
ORA-00933: SQL command not properly ended