문제

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top