2016-05-26 41 views
0

XMLを生成しています。私は何らかの種類のシーケンスを作成する必要があります。 rownumやrow_number()のようなもの。XMLデータを生成する際の行数をカウントする

select XMLROOT (xmlagg(
         xmlelement(
         "table_description", 
          xmlelement(
          "table_name", 
          max(table_name) 
         ), 
          xmlelement(
          "table_sequence" 
         ), 
          xmlelement(
          "table_columns", 
          xmlagg(
           xmlforest(
           column_name as "column_name", 
           '' as "column_sequence" 
          ) 
          ) 
         ) 
        ) 
       ), VERSION '1.0', STANDALONE YES) 
    from all_tab_columns 
    where owner='SYS' 
    and table_name in ('ALL_APPLY_ENQUEUE','ALL_APPLY_EXECUTE','ALL_APPLY_KEY_COLUMNS') 
    group by table_name; 

だから、このクエリでは、たとえば私は1つずつ増加しますが、次の時にリセットされますCOLUMN_NAMEの反復ごとに1ずつ増加する各table_nameの要素の一つの配列、1つのシーケンスを追加したいと思いますグループ化。

擬似コード

<table_description> 
    <table_sequence>1</table_sequence> 
    <table_name>xyz</table_name> 
    <table_columns> 
    <column_sequence>1</column_sequence> 
    <column_name>Column One</column_name> 
    <column_sequence>2</column_sequence> 
    <column_name>Column two</column_name> 
    </table_columns> 
<table_description> 
    <table_sequence>2</table_sequence> 
    <table_name>abs</table_name> 
    <table_columns> 
    <column_sequence>1</column_sequence> 
    <column_name>Column One</column_name> 
    <column_sequence>2</column_sequence> 
    <column_name>Column two</column_name> 
    </table_columns> 
<table_description> 
+0

あなたの出力は、右を見ていません。列シーケンスが列の下のノードであるべきか?または、シーケンスの値が表ノードと列ノードの属性であるべきであるかどうかを、より明確に示します。また、どのOracleのバージョンを使用していますか? –

+0

@AlexPoole申し訳ありませんが、私は十分にはっきりしていないと思います。私は、出力が上の入力が与えるものと同じではないことを完全に認識しています。私は出力がどのように表示されるべきかの擬似的な例を与えたかっただけです。私は本当に欲しいものをより適切にフォーマットします。私はOracle 10XEを使用しています。 – Paran0a

+0

シーケンスは、適切なノードを持つ兄弟でなければなりません。 column_nameとcolumn_sequenceは兄弟でなければなりません。 table_nameとtable_Sequenceと同じです。 – Paran0a

答えて

1

あなたのfrom all_tab_columnsdense_rank()を経由してシーケンス番号を生成し、インライン・ビューに変更することができます。

from (
    select atc.*, 
    dense_rank() over (order by table_name) as table_sequence, 
    dense_rank() over (partition by table_name order by column_name) as column_sequence 
    from all_tab_columns atc 
    where owner='SYS' 
    and table_name in ('ALL_APPLY_ENQUEUE','ALL_APPLY_EXECUTE','ALL_APPLY_KEY_COLUMNS') 
) 

そして、あなたは、あなたのXMLでそれらの生成された列を使用することができます。

select XMLROOT (xmlagg(
        xmlelement(
        "table_description", 
         xmlelement(
         "table_name", 
         table_name 
        ), 
         xmlelement(
         "table_sequence", 
         table_sequence 
        ), 
         xmlelement(
         "table_columns", 
         xmlagg(
          xmlforest(
          column_name as "column_name", 
          column_sequence as "column_sequence" 
         ) 
         ) 
        ) 
       ) 
      ), VERSION '1.0', STANDALONE YES) 
from (
    select atc.*, 
    dense_rank() over (order by table_name) as table_sequence, 
    dense_rank() over (partition by table_name order by column_name) as column_sequence 
    from all_tab_columns atc 
    where owner='SYS' 
    and table_name in ('ALL_APPLY_ENQUEUE','ALL_APPLY_EXECUTE','ALL_APPLY_KEY_COLUMNS') 
) 
where owner='SYS' 
and table_name in ('ALL_APPLY_ENQUEUE','ALL_APPLY_EXECUTE','ALL_APPLY_KEY_COLUMNS') 
group by table_name, table_sequence; 

<?xml version="1.0" standalone="yes"?> 
<table_description> 
    <table_name>ALL_APPLY_ENQUEUE</table_name> 
    <table_sequence>1</table_sequence> 
    <table_columns> 
    <column_name>DESTINATION_QUEUE_NAME</column_name> 
    <column_sequence>1</column_sequence> 
    <column_name>RULE_OWNER</column_name> 
    <column_sequence>3</column_sequence> 
    <column_name>RULE_NAME</column_name> 
    <column_sequence>2</column_sequence> 
    </table_columns> 
</table_description> 
<table_description> 
    <table_name>ALL_APPLY_EXECUTE</table_name> 
    <table_sequence>2</table_sequence> 
    <table_columns> 
    <column_name>EXECUTE_EVENT</column_name> 
    <column_sequence>1</column_sequence> 
    <column_name>RULE_OWNER</column_name> 
    <column_sequence>3</column_sequence> 
    <column_name>RULE_NAME</column_name> 
    <column_sequence>2</column_sequence> 
    </table_columns> 
</table_description> 
<table_description> 
    <table_name>ALL_APPLY_KEY_COLUMNS</table_name> 
    <table_sequence>3</table_sequence> 
    <table_columns> 
    <column_name>APPLY_DATABASE_LINK</column_name> 
    <column_sequence>1</column_sequence> 
    <column_name>OBJECT_OWNER</column_name> 
    <column_sequence>4</column_sequence> 
    <column_name>OBJECT_NAME</column_name> 
    <column_sequence>3</column_sequence> 
    <column_name>COLUMN_NAME</column_name> 
    <column_sequence>2</column_sequence> 
    </table_columns> 
</table_description> 

生成されたXMLは、各列とそのシーケンス番号の間にリンクが存在しないため、まだ正しくありません。

select XMLROOT (xmlagg(
        xmlelement(
        "table_description", 
         xmlelement(
         "table_name", 
         table_name 
        ), 
         xmlelement(
         "table_sequence", 
         table_sequence 
        ), 
         xmlelement(
         "table_columns", 
         xmlagg(
          xmlelement(
          "column_description", 
          xmlforest(
           column_name as "column_name", 
           column_sequence as "column_sequence" 
          ) 
         ) 
         ) 
        ) 
       ) 
      ), VERSION '1.0', STANDALONE YES) 
from (
    select atc.*, 
    dense_rank() over (order by table_name) as table_sequence, 
    dense_rank() over (partition by table_name order by column_name) as column_sequence 
    from all_tab_columns atc 
    where owner='SYS' 
    and table_name in ('ALL_APPLY_ENQUEUE','ALL_APPLY_EXECUTE','ALL_APPLY_KEY_COLUMNS') 
) 
where owner='SYS' 
and table_name in ('ALL_APPLY_ENQUEUE','ALL_APPLY_EXECUTE','ALL_APPLY_KEY_COLUMNS') 
group by table_name, table_sequence; 

を取得する:たぶん、あなたはより多くのような何かをしたい

<?xml version="1.0" standalone="yes"?> 
<table_description> 
    <table_name>ALL_APPLY_ENQUEUE</table_name> 
    <table_sequence>1</table_sequence> 
    <table_columns> 
    <column_description> 
     <column_name>DESTINATION_QUEUE_NAME</column_name> 
     <column_sequence>1</column_sequence> 
    </column_description> 
    <column_description> 
     <column_name>RULE_OWNER</column_name> 
     <column_sequence>3</column_sequence> 
    </column_description> 
    <column_description> 
     <column_name>RULE_NAME</column_name> 
     <column_sequence>2</column_sequence> 
    </column_description> 
    </table_columns> 
</table_description> 
<table_description> 
    <table_name>ALL_APPLY_EXECUTE</table_name> 
    <table_sequence>2</table_sequence> 
    <table_columns> 
    <column_description> 
     <column_name>EXECUTE_EVENT</column_name> 
     <column_sequence>1</column_sequence> 
    </column_description> 
    <column_description> 
     <column_name>RULE_OWNER</column_name> 
     <column_sequence>3</column_sequence> 
    </column_description> 
    <column_description> 
     <column_name>RULE_NAME</column_name> 
     <column_sequence>2</column_sequence> 
    </column_description> 
    </table_columns> 
</table_description> 
<table_description> 
    <table_name>ALL_APPLY_KEY_COLUMNS</table_name> 
    <table_sequence>3</table_sequence> 
    <table_columns> 
    <column_description> 
     <column_name>APPLY_DATABASE_LINK</column_name> 
     <column_sequence>1</column_sequence> 
    </column_description> 
    <column_description> 
     <column_name>OBJECT_OWNER</column_name> 
     <column_sequence>4</column_sequence> 
    </column_description> 
    <column_description> 
     <column_name>OBJECT_NAME</column_name> 
     <column_sequence>3</column_sequence> 
    </column_description> 
    <column_description> 
     <column_name>COLUMN_NAME</column_name> 
     <column_sequence>2</column_sequence> 
    </column_description> 
    </table_columns> 
</table_description> 
+0

現在のところ、列が親ノードにあるかどうかは問題ではありません。これは単なる例ですが、それは有効な懸案事項です。助けてくれてありがとう! – Paran0a

関連する問題