質問

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 query 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 query 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-トップ。しかし、私にとってはそうではありません。 Oracle 10gをマシンにインストールしています。 誰かがクエリを機能させるための修正を提案できますか。

ありがとう。

役に立ちましたか?

解決

最初の点を考慮して、出力はディスプレイ上でのみ切り捨てられます。 SET LONG

を使用して、SQL * Plusに表示されるバイト数を変更できます。
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セッションパラメータごとに変更されます(つまり、ファイルはクライアントの文字セットに変換されます)。

2番目のポイント:

  • 使用しているSQL * Plusのバージョンデータベースよりも古く、シンタックスを認識していない可能性があります
  • SQL * Plusで入力したとおりに正確なクエリを投稿できますか(SOのCODE機能を使用してください)

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シンタックスは、10gR2(10.2。*)の新機能である必要があります(確認が必要です)

ただし、XMLデータにアクセスする別の方法を使用できます(別のSO ):

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をデータベースのデフォルトの文字セットに変換し、保存できるようにします。それが「エンコード」の値を変更する理由です。データベースのデフォルトの文字セットがutf-8の場合、「encodig」は変更されません。

xmlに実際にutf-8でエンコードされた文字がある場合、 nls_charset_id( 'WINDOWS-1252')を使用してデータベースにロードしようとするとエラーがスローされます。

簡単に言うと、 encoding =&quot; UTF-8&quot; encoding =&quot; WINDOWS-1252&quot; に変更されることを心配しないでください。 -データベースが仕事をしています。

助けてくれてありがとう。 'set Long 4000'は切り捨ての問題を修正しました。

しかし、2番目のクエリを実行するにはまだ苦労しています。私のsqlplusバージョンは&quot; SQL * Plus:Release 10.1.0.2.0&quot;です。そのバージョンが問題だと思いますか?

これは私が試したコードです。

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