sql >> データベース >  >> RDS >> Oracle

xmlからoracleDBテーブルへ:問題が発生しています

    最初のポイントを考慮すると、出力は表示時に切り捨てられるだけです。 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
    


    1. Oracleの奇妙な動作-再帰CTEのクロス結合はコンマで機能しますが、クロス結合句では機能しません

    2. mysqlで個別の2列の組み合わせを選択する

    3. SQLサーバースキーマとデフォルトスキーマ

    4. Oracle PL \SQLNull入力パラメータWHERE条件