2

Editplus(Windows の場合) を使用して作成されたサンプル xml ファイルがあります。

  < ?xml バージョン="1.0" エンコーディング="UTF-8" ?>
  <バッジ>
    < row UserId="3714" Name="Teacher" Date="2008-09-15T08:55:03.923"/>
    < row UserId="994" Name="Teacher" Date="2008-09-15T08:55:03.957"/>
  < / バッジ>

ここでの私の目標は、この情報を 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 デュアル)、 5 XMLTable(' for $i in /badges/row 6 リターン $i' 7 xml_data を渡す 8 列 UserId NUMBER path '@UserId', 9 Name VARCHAR2(50) パス '@Name', 10 dt VARCHAR2(25) パス '@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 がインストールされています。誰かがクエリを機能させるための修正を提案できますか。

ありがとう。

4

3 に答える 3

1

最初のポイントを考慮すると、出力は表示上で切り捨てられるだけです。次のコマンドを使用して、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 セッション パラメータごとに変更されます (つまり、ファイルはクライアントの文字セットに変換されます)。

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
于 2009-08-05T09:47:20.620 に答える
1

私はまったく同じ問題を抱えていましたが、なぜだろうと思っていました:

encoding="UTF-8"

に変更

encoding="WINDOWS-1250"

私の場合(ロード後)。

次に、Oracle がここで何をしているのかを理解しました。utf-8 でエンコードされた xml をデータベースのデフォルトの文字セットに変換して、格納できるようにします。そのため、「encoding」の値を変更します。データベースのデフォルトの文字セットが utf-8 の場合、「encodig」は変更されません。

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

簡単に言うと、encoding="UTF-8"への変更について心配する必要はありませんencoding="WINDOWS-1252"。無視してください。データベースはその仕事をしています。

于 2011-06-27T14:52:05.367 に答える
0

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

しかし、私はまだ 2 番目のクエリを実行するのに苦労しています。私のsqlplusのバージョンは「SQL*Plus: Release 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
于 2009-08-05T10:56:21.073 に答える