मेरे पास बहुत सारे कॉलम वाली एक टेबल है (उदाहरण: कॉलम 1, कॉलम 2, कॉलम 3, कॉलम 4, ...)

मैं XMLElement और XMLForest फ़ंक्शन का उपयोग प्रत्येक कॉलम के साथ एक टैग होने के साथ एक एक्सएमएल उत्पन्न करने के लिए करना चाहता हूं।

मैं केवल XMLForest में प्रत्येक कॉलम को मैन्युअल रूप से जोड़कर ऐसा करने में सक्षम हूं: उदाहरण:

SELECT
XMLElement("ParentTag", 
    XMLForest(TABLE.Column1, 
              TABLE.Column2,
              TABLE.Column2,
              ...)
)
FROM ...

परिणाम :

<ParentTag> <Column1>Value1</Column1> <Column2>Value2</Column2> ...</ParentTag>

हालाँकि मैं प्रत्येक कॉलम को टाइप करने से बचना चाहूंगा क्योंकि भविष्य में उनकी संख्या बढ़ सकती है।

मैं ऐसा कुछ कैसे कर सकता हूँ? :

SELECT
XMLElement("ParentTag", 
    XMLForest(TABLE.*)
)
FROM ...
0
Cedric 3 अक्टूबर 2017, 11:11

2 जवाब

सबसे बढ़िया उत्तर

अपनी आवश्यकता पूरी करने के लिए आप PLSQL प्रक्रिया का उपयोग कर सकते हैं। यहां PLSQL प्रक्रिया में, यह एक Tablename स्वीकार करेगा और फिर XMLForest उत्पन्न करेगा और परिणाम दिखाएगा। निचे देखो:

-- Creating a type of XMLTYPE
CREATE OR REPLACE TYPE Outpt IS TABLE OF XMLTYPE;
/

--Procedure with In parameter as Tablename and out parameter as resultset
CREATE OR REPLACE PROCEDURE XM_FOREST (tabnm VARCHAR2, v_out IN OUT Outpt)
AS
   var     VARCHAR2 (4000);
   v_sql   VARCHAR2 (4000);
BEGIN
   FOR i IN (SELECT cname
               FROM col
              WHERE tname = tabnm)
   LOOP
      var := var || ',' || i.cname;
   END LOOP;

   var := LTRIM (var, ',');

   v_sql :=
         'select XMLElement("ParentTag",XMLForest('
      || var
      || '  ) ) from  '
      || tabnm;

   EXECUTE IMMEDIATE v_sql BULK COLLECT INTO v_out;
END;

--------------

--Execution
DECLARE
   var_out   Outpt := Outpt ();
   LCLOB     CLOB;
BEGIN
   var_out.EXTEND;
   XM_FOREST (tabnm => 'EMPLOYEE', v_out => var_out);

   FOR i IN 1 .. var_out.COUNT
   LOOP
      LCLOB := var_out (i).getCLOBVAL ();
      DBMS_OUTPUT.put_line (LCLOB);
   END LOOP;
END;
------
--Result

 SQL> /
    <ParentTag><EMPLOYEE_ID>1</EMPLOYEE_ID><FIRST_NAME>XXX</FIRST_NAME></ParentTag>
    <ParentTag><EMPLOYEE_ID>2</EMPLOYEE_ID><FIRST_NAME>YYY</FIRST_NAME></ParentTag>

 PL/SQL procedure successfully completed.
1
XING 3 अक्टूबर 2017, 12:21

मैं ऐसा कुछ कैसे कर सकता हूँ? :

SELECT
XMLElement("ParentTag", 
    XMLForest(TABLE.*)
)
FROM ...

आप नहीं कर सकते, आपको सभी नाम अलग-अलग टाइप करने होंगे।

आप डायनेमिक SQL का उपयोग करके क्वेरी जेनरेट कर सकते हैं

एसक्यूएल फिडल

Oracle 11g R2 स्कीमा सेटअप:

CREATE TABLE table_name (
  id NUMBER,
  a  NUMBER,
  b  NUMBER,
  c  NUMBER,
  d  NUMBER
);

क्वेरी 1:

SELECT '
SELECT XMLElement(
         "ParentTag", 
         XMLForest( '
         || LISTAGG( '"' || column_name || '"', ',' )
              WITHIN GROUP ( ORDER BY Column_id )
         ||' ) ) FROM ...' AS query
FROM   user_tab_columns
WHERE  table_name = 'TABLE_NAME'

परिणाम:

|                                                 QUERY |
|-------------------------------------------------------|
| SELECT XMLElement(                                    |
|          "ParentTag",                                 |
|          XMLForest( "ID","A","B","C","D" ) ) FROM ... |
1
MT0 3 अक्टूबर 2017, 11:26