0

変なお願いかもしれませんが。上司は、オラクル クエリからのデータをテーブルに表示するページの管理者バージョンを作成するように私に求めています。

管理ページは、データを表示する代わりに (クエリは 1 行を返します)、テーブル名と列名を返す必要があります。

例: 代わりに:

Name      Initial
==================
Bob       A

私が欲しい:

Name                 Initial
============================
Users.FirstName      Users.MiddleInitial

コードでこれを実行できることはわかっていますが、必要なデータを返すようにクエリを変更するだけで、レポート生成コードをほとんどそのままにしておくことができます。

私はストアドプロシージャでそれをしたくありません。

したがって、次のようなものを使用してレポートのデータを吐き出すと:

blah blah = MyDataRow("FirstName")

そのままにしておくことができますが、「BOB」を表示する代わりに「Users.FirstName」を表示します

そして、すべての列をリストする代わりに、可能であればselect *を使用してクエリを実行したい

したがって、 * でクエリを実行している各列について、(列の値ではなく) tablename.ColumnName または tablename|columnName を取得したい

あなたがフォローしていることを願っています-私は自分自身を混乱させています...

擬似:

select tablename + '.' + Columnname as WhateverTheColumnNameIs 
from Table1 
  left join Table2 on whatever...
  Join Table_Names on blah blah

ふう-これをすべて書いた後、コード側でそれを行うだけだと思います。

しかし、あなたがそれに挑戦しているなら、おそらく楽しい挑戦です

4

2 に答える 2

1

Oracle は、そのテーブルに対するクエリの結果としてテーブルの列名を取得するための確実な方法 (疑似列はありません) を提供していません。ただし、次の 2 つのアプローチを検討することもできます。

  1. 関数xmltypeでカーソル式 (クエリ) を渡すことによって形成されたから列名を抽出します。xmltable()

    -- your table
    with t1(first_name, middle_name) as(
      select 1,2 from dual
    ), -- your query
    t2 as(
       select * --  col1 as "t1.col1"
                --, col2 as "t1.col2"
                --, col3 as "t1.col3" 
        from hr.t1
      )
    select *
      from ( select q.object_value.getrootelement() as col_name
                  , rownum as rn
              from xmltable('//*'
                             passing xmltype(cursor(select * from t2 where rownum = 1))
            ) q
     where q.object_value.getrootelement() not in ('ROWSET', 'ROW')
    )
    pivot(
      max(col_name) for rn in (1 as "name", 2 as "initial")
    )
    

    結果:

    name            initial       
    --------------- ---------------
    FIRST_NAME      MIDDLE_NAME 
    

    注: 列名にテーブル名のプレフィックスを付けるには、クエリの選択リストに列名を明示的にリストし、エイリアスを手動で指定する必要があります。

  2. PL/SQL アプローチ。Oracle 11g 以降では、特に dbms_sql()パッケージとdescribe_columns()プロシージャを使用して、カーソル (選択) 内の列の名前を取得できます。

于 2013-09-27T20:00:41.830 に答える
0

システム ビュー USER_TAB_COLS または ALL_TAB_COLS から選択してみてください。

于 2013-09-27T23:13:52.227 に答える