سؤال

لدي عينة ملف xml التي تم إنشاؤها باستخدام 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 المثبتة على الجهاز الخاص بي.هل يمكن لشخص اقتراح التصحيحات لجعل الاستفسارات العمل.

شكرا

هل كانت مفيدة؟

المحلول

النظر في النقطة الأولى, الإخراج الخاص بك هو فقط اقتطاع على الشاشة.يمكنك تغيير عدد وحدات البايت التي يتم عرضها في 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 الدورة المعلمات (i-e:الملف سوف تترجم إلى مجموعة أحرف من العميل الخاص بك).

بالنسبة للنقطة الثانية:

  • أي إصدار من SQL*Plus الذي تستخدمه ؟ أنه قد يكون أقدم من قاعدة البيانات و عدم الاعتراف synthax
  • يمكن أن قمت بنشر نفس الاستعلام كما كتبته في SQL*Plus (يرجى استخدام ميزة الرمز من ذلك)

لأنني لا يمكن أن تتكاثر مع أوراكل 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"

في حالتي (بعد التحميل).

ثم أدركت ما أوراكل لا هنا:فإنه يحول utf-8 ترميز xml إلى مجموعة الأحرف الافتراضية من قاعدة البيانات الخاصة بك, من أجل أن يكون قادرا على تخزينها.هذا هو السبب في أنه تغير قيمة 'encoding'.إن مجموعة الأحرف الافتراضية من زرع قاعدة البيانات هو 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