m0_57748717 2022-01-01 13:30 采纳率: 76.3%
浏览 60
已结题

oracle输出临时表所有列名

公司业务需要,现在要将输出的表所有列名都查询出来,并放入另一个表的同一列里面。原查询语句是通过with as建立临时表再查询得到最后结果,试过用下面这个语句输出列名,但结果是空的:


select
COLUMN_NAME
from
user_tab_columns
where
TABLE_NAME=
'
表名
' 

请问各位有没有什么办法,可以将with as建立的临时表所有列名作为一列的内容输出呢?

  • 写回答

1条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-01-01 14:39
    关注

    你这个语句如果查出来为空,说明你当前登录的用户下没有建立任何表,请尝试切换到你要查询的表的用户,或者把查询的这个视图换成 DBA_TAB_COLUMNS或 ALL_TAB_COLUMNS,并加上OWNER条件


    你这个sql明显不对啊,你TABLE_NAME='A' ,意思就是查名字为'A'这一个字母的表,
    如果你b表里面有表名字段,假设这个字段名叫 TABLE_NAME,那么这个sql应该这么写

    select a.table_name,a.COLUMN_NAME  
     from user_tab_columns a,b
     where a.table_name=b.table_name
    

    with as 不是临时表,它只是个子查询,没有创建实体对象,因此无法在静态视图中查询相关信息,如果要尝试获取任意查询sql的字段,可以使用以下sql

    SELECT t2.column_value.getrootelement() name
      FROM (SELECT *
              FROM TABLE(XMLSEQUENCE(cursor (select *
                                        from (select 1 字段1, 2 字段2
                                                from dual
                                              union all
                                              select 2, 4
                                                from dual)
                                       where rownum = 1)))) t1,
           TABLE(XMLSEQUENCE(EXTRACT(t1.column_value, '/ROW/node()'))) t2;
    

    img

    以上sql就是针对下面这个sql获取字段名

    select 1 字段1, 2 字段2
        from dual
     union all
          select 2, 4
      from dual
    

    原理就是取一行数据转游标转xml,获取xml的根标签。

    另外,还可以通过调用dbms_sql包来获取sql中的字段名称


    题主有点离谱了,字段名里怎么会带逗号括号这种东西,这种保留符号会导致各种异常,一般都用下划线。
    当然,如果非得查出符号,也不是没办法,需要写一个自定义函数进行转换。不过你这题赚大了

    img

    这个自定义函数"unistr_xml"我就不贴代码了,原理就是解析字符串,正则匹配、替换、解码


    这题还没采纳呀?今天我在复刻数据库内置程序的时候发现了个好玩意,可以解决xml修改符号的问题

    SELECT utl_i18n.ENCODE_SQL_XML(t2.column_value.getrootelement()) name
      FROM (SELECT *
              FROM TABLE(XMLSEQUENCE(cursor (select *
                                        from (select 1 "字段1,(", 2 字段2
                                                from dual
                                              union all
                                              select 2, 4
                                                from dual)
                                       where rownum = 1)))) t1,
           TABLE(XMLSEQUENCE(EXTRACT(t1.column_value, '/ROW/node()'))) t2;
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月13日
  • 已采纳回答 1月5日
  • 创建了问题 1月1日

悬赏问题

  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)