0

一个奇怪的要求也许但是。我的老板希望我创建一个页面的管理员版本,该页面在表中显示来自 oracle 查询的数据。

admin页面,不显示数据(查询返回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 不提供一种可靠的方式(没有伪列)来获取表的列名,作为对该表的查询的结果。但是您可能会考虑以下两种方法:

  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 回答