2009-08-05 10 views
2

に遭遇。ここのxml:私はサンプルXMLファイルは、(Windowsの場合)Editplusを使用して作成した問題

 
    < ?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がインストールされています。 誰かがクエリを動作させるための修正を提案できますか?

ありがとうございました。

答えて

1

最初の点を考慮すると、出力は表示時にのみ切り捨てられます。あなたは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セッション・パラメータ(すなわちごとに変更されます:ファイルが文字セットに変換されますあなたのクライアントの)。第二の点については

  • 使用しているSQL * Plusでのバージョンは何?私は再現できないので、それは(SOのCODE機能を使用してください)あなたはSQL * Plusで、それを入力として、あなたは正確なクエリを投稿することができ

データベースよりも古いと

  • synthaxを認識しない場合があります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 
    

    更新:(。* 10.2)あなたはしかし、別の方法を使用することができます

    このXMLTableのsynthaxは10gリリース2の新機能である必要があります(ニーズの確認) XMLデータへのアクセス(another 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 
    
  • 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 
    
    +0

    @Shafi:私の答えでXMLデータにアクセスする別の方法を追加しました。このメソッドはOracle 10gR1で動作するはずです –

    1

    私は正確に同じ問題を抱えていた、私はなぜ思っていた:

    encoding="UTF-8" 
    

    は(ロード後)私の場合には

    encoding="WINDOWS-1250" 
    

    に変更。

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

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

    encoding="UTF-8"encoding="WINDOWS-1252"に変更される心配はありません。データベースはその仕事をしています。

    関連する問題