Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ओरेकल टेबल से एक्सएमएल जेनरेट करें

XML के रूप में तालिका की सामग्री प्राप्त करने के लिए Oracle में एक अंतर्निहित कार्य है:

create table t42(id number, str varchar2(10));
insert into t42 values (1, 'AA');
insert into t42 values (2, 'BB');

select dbms_xmlgen.getxmltype('select * from t42')
from dual;

DBMS_XMLGEN.GETXMLTYPE('SELECT*FROMT42')
----------------------------------------
<ROWSET>
 <ROW>
  <ID>1</ID>
  <STR>AA</STR>
 </ROW>
 <ROW>
  <ID>2</ID>
  <STR>BB</STR>
 </ROW>
</ROWSET>

आप उसके आसपास अपने खुद के टैग जोड़ सकते हैं; एक प्रश्न के रूप में किया जा सकता है लेकिन चूंकि आप एक संग्रहित प्रक्रिया चाहते हैं:

create or replace function table_to_xml(table_name in varchar2) return xmltype as
  xml xmltype;
begin
  select xmlelement("XML",
      xmlelement(evalname(table_name),
        dbms_xmlgen.getxmltype('select * from "' || table_name || '"')))
  into xml
  from dual;

  return xml;
end table_to_xml;
/

select table_to_xml('T42') from dual;

TABLE_TO_XML('T42')
----------------------------------------
<XML><T42><ROWSET>
  <ROW>
    <ID>1</ID>
    <STR>AA</STR>
  </ROW>
  <ROW>
    <ID>2</ID>
    <STR>BB</STR>
  </ROW>
</ROWSET>
</T42></XML>

तो इसमें वह संरचना है जो आप चाहते हैं (ठीक है, मुझे लगता है, लेकिन नीचे देखें), लेकिन इसमें ROWSET है और ROW RECORDS . के बजाय और RECORD . वह हो सकता है कोई बात नहीं, यह निर्भर करता है कि आप अभी भी इस इंटरफ़ेस के लिए प्रारूप विकसित कर रहे हैं या नहीं। अगर इससे कोई फर्क पड़ता है तो आप उन नोड्स का नाम बदलने के लिए एक और कदम लागू कर सकते हैं , या - अधिक उपयोगी रूप से - dbms_xmlgen . का उपयोग करें प्रक्रियाएं setrowsettag और setrowtag , जो आपकी प्रक्रिया में सरल है (और नीचे दिखाया गया है)।

मैं मान रहा हूँ कि आपने <TABLENAME></TABLENAME> . के रूप में क्या दिखाया है एक गलती थी, और आप उस टैग के भीतर रिकॉर्ड चाहते हैं। यदि नहीं, और आप वास्तव में चाहते हैं कि किसी कारण से, फ़ंक्शन में क्वेरी को इसमें बदलें:

  select xmlelement("XML",
      xmlconcat(xmlelement(evalname(table_name), null),
      dbms_xmlgen.getxmltype('select * from "' || table_name || '"')))
  into xml
  from dual;

फिर आप इसे किसी फ़ाइल में वैसे भी लिख सकते हैं जैसे आप सामान्य रूप से करते हैं; यदि आप SQL*Plus आदि से कॉल कर रहे हैं। आप चयन कर सकते हैं और स्पूल कर सकते हैं, या यदि आप इसे बिल्कुल भी वापस नहीं करना चाहते हैं तो आप UTL_FILE जोड़ सकते हैं प्रक्रिया के भीतर से फ़ाइल लिखने का निर्देश, लेकिन यह डीबी सर्वर पर एक निर्देशिका वस्तु के लिए होना चाहिए, जो सुविधाजनक नहीं हो सकता है।

ज्यादातर मेरे अपने फायदे के लिए क्योंकि मैं XML के साथ बहुत कुछ नहीं करता:

create or replace procedure table_to_xml_file(table_name in varchar2) as
  ctx dbms_xmlgen.ctxhandle;
  clb clob;
  file utl_file.file_type;
  buffer varchar2(32767);
  position pls_integer := 1;
  chars pls_integer := 32767;
begin
  ctx := dbms_xmlgen.newcontext('select * from "' || table_name || '"');
  dbms_xmlgen.setrowsettag(ctx, 'RECORDS');
  dbms_xmlgen.setrowtag(ctx, 'RECORD');

  select xmlserialize(document
        xmlelement("XML",
          xmlelement(evalname(table_name),
            dbms_xmlgen.getxmltype(ctx)))
      indent size = 2)
  into clb
  from dual;

  dbms_xmlgen.closecontext(ctx);

  file := utl_file.fopen('<directory>', table_name || '.xml', 'w', 32767);
  while position < dbms_lob.getlength(clb) loop
    dbms_lob.read(clb, chars, position, buffer);
    utl_file.put(file, buffer);
    utl_file.fflush(file);
    position := position + chars;
  end loop;
  utl_file.fclose(file);
end table_to_xml_file;
/

जब exec table_to_xml_file('T42') . के साथ चलाया जाता है , यह T42.xml . नामक फ़ाइल उत्पन्न करता है सर्वर निर्देशिका में <directory> . द्वारा इंगित किया गया है निर्देशिका वस्तु, जिसमें शामिल हैं:

<XML>
  <T42>
    <RECORDS>
      <RECORD>
        <ID>1</ID>
        <STR>AA</STR>
      </RECORD>
      <RECORD>
        <ID>2</ID>
        <STR>BB</STR>
      </RECORD>
    </RECORDS>
  </T42>
</XML>

संयोग से, मैंने dbms_xmlgen.getxmltype के अंदर चयन में तालिका नाम के चारों ओर डबल-कोट्स डाल दिए हैं बुलाना। यह तालिका नाम के लिए 'केस डेटाबेस में समान होना चाहिए' आवश्यकता को पूरा करने के लिए है; इसे सही मामले में प्रक्रिया में पारित करना होगा या यह त्रुटि होगी। प्रक्रिया के भीतर मामले को किसी भी तरह से ठीक करने की कोशिश करने से यह आसान है, जो अजीब या असंभव होगा यदि आपके पास मामले के अलावा एक ही नाम के साथ दो टेबल हों। कॉलम नाम वैसे भी सही स्थिति में होंगे।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. लिफाफा प्राप्त करें। यानी ओवरलैपिंग टाइम स्पैन

  2. एक संख्या चर घोषित कैसे करें जहां मैं अपने लूप में तालिका की संख्या को सहेज सकता हूं

  3. एसक्यूएल:प्राथमिक कुंजी और विदेशी कुंजी रेफरिंग के साथ टेबल बनाना (

  4. लॉकमोड टाइप जेपीए के बीच अंतर

  5. cx_oracle में कर्सर चर से संग्रहीत कार्यविधि लौटाएं