首页 文章

Oracle查询以获取列名称

提问于
浏览
94

我有一个mySQL查询来从表中获取列,如下所示:

String sqlStr="select column_name 
from information_schema.COLUMNS 
where table_name='users' 
and table_schema='"+_db+"' 
and column_name not in ('password','version','id')"

如何在Oracle 11g数据库中更改上述查询?我需要将列名称作为表'用户'的结果集,排除某些列,指定模式 . 现在我在新的表空间中有所有表,所以我是否指定了表空间名称来代替模式名称?

还有一个通用的HQL吗?在我的新Oracle数据库(我是Oracle新手)中,我只有表空间名称,所以它等同于模式名称(逻辑上?)

12 回答

  • 138

    对于当前用户拥有的表, information_schema.COLUMNS 的Oracle等效项为 USER_TAB_COLS ,对于所有用户拥有的表, ALL_TAB_COLSDBA_TAB_COLS .

    表空间不等同于模式,您也不必提供表空间名称 .

    如果要为特定用户拥有的列OF表查询 ALL_TAB_COLSDBA_TAB_COLS ,则提供架构/用户名将是有用的 . 在你的情况下,我想象查询看起来像:

    String sqlStr= "
    SELECT column_name
      FROM all_tab_cols
     WHERE table_name = 'USERS'
       AND owner = '" +_db+ "'
       AND column_name NOT IN ( 'PASSWORD', 'VERSION', 'ID' )"
    

    请注意,使用此方法可能会导致SQL注入风险 .

    EDIT: 大写表名和列名,因为它们在Oracle中通常是大写的;如果用双引号创建它们,它们只是低级或混合大小写 .

  • 83

    以下查询在Oracle数据库中对我有用 .

    select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';
    
  • 32

    在oracle中你可以使用

    desc users
    

    显示包含在users表中的所有列

  • 6

    您可以尝试这样:(它适用于11g,它返回表中的所有列名,这里test_tbl是表名,user_tab_columns是用户允许的表的列)

    从user_tab_columns中选择COLUMN_NAME
    table_name ='test_tbl';

  • 2

    与Oracle一起使用的查询是:

    String sqlStr="select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='"+_db+".users' and COLUMN_NAME not in ('password','version','id')"

    从来没有听说过HQL这样的查询 . 我认为它没有找到元数据映射......您不会使用HQL,而是使用API方法来实现此目的,或者直接使用SQL . 例如,您可以使用JDBC DatabaseMetaData .

    我认为表空间与模式无关 . AFAIK表空间主要用于逻辑内部技术目的,这应该打扰DBA . 有关表空间的更多信息,请参见Oracle doc .

  • 0

    我能够获取列名的唯一方法是使用以下查询:

    select COLUMN_NAME
    FROM all_tab_columns atc
    WHERE table_name like 'USERS'
    
  • 0

    我发现这个在Oracle中很有用:

    SELECT 
        obj.object_name, 
        atc.column_name, 
        atc.data_type, 
        atc.data_length 
    FROM 
        all_tab_columns atc,
        (SELECT 
            * 
         FROM 
             all_objects
         WHERE 
            object_name like 'GL_JE%'
            AND owner = 'GL'
            AND object_type in ('TABLE','VIEW')   
        ) obj
    WHERE 
        atc.table_name = obj.object_name
    ORDER BY 
        obj.object_name, 
        atc.column_name;
    
  • 0

    有几次,我们需要以逗号分隔列表中的一个表中的所有列 . 在这种情况下,我们可以使用这个泛型函数,它以逗号分隔的列表作为字符串 .

    CREATE OR REPLACE FUNCTION cols(
        p_schema_name IN VARCHAR2,
        p_table_name  IN VARCHAR2)
      RETURN VARCHAR2
    IS
      v_string VARCHAR2(4000);
    BEGIN
      SELECT LISTAGG(COLUMN_NAME , ',' ) WITHIN GROUP (
      ORDER BY ROWNUM )
      INTO v_string
      FROM ALL_TAB_COLUMNS
      WHERE OWNER    = p_schema_name
      AND table_name = p_table_name;
      RETURN v_string;
    END;
    /
    

    因此,只需从查询中调用函数就会产生一个包含所有列的行 .

    select cols('HR','EMPLOYEES') FROM DUAL;
    
    EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID
    

    如果所有列的总长度超过 4000 字符,则 Note: LISTAGG 将失败 . 对于大多数情况,这将有效 .

  • 0

    你可以试试这个:

    描述'表名'

    它将返回所有列名和数据类型

  • 0
    • SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0; - >请注意,这是Query Result,一个ResultSet . 这可以导出为其他格式 . 并且,您可以将 Query Result 导出为 Text 格式 . 当我做 SELECT * FROM SATURN.SPRIDEN WHERE ROWNUM = 0; 时,导出如下所示:

    “SPRTELE_PIDM” “SPRTELE_SEQNO” “SPRTELE_TELE_CODE” “SPRTELE_ACTIVITY_DATE” “SPRTELE_PHONE_AREA” “SPRTELE_PHONE_NUMBER” “SPRTELE_PHONE_EXT” “SPRTELE_STATUS_IND” “SPRTELE_ATYP_CODE” “SPRTELE_ADDR_SEQNO” “SPRTELE_PRIMARY_IND” “SPRTELE_UNLIST_IND” “SPRTELE_COMMENT” “SPRTELE_INTL_ACCESS” “SPRTELE_DATA_ORIGIN” “SPRTELE_USER_ID”“SPRTELE_CTRY_CODE_PHONE “”SPRTELE_SURROGATE_ID“”SPRTELE_VERSION“”SPRTELE_VPDI_CODE“

    • DESCRIBE <TABLE_NAME> - >注意:这是脚本输出 .
  • -1

    关键是在toad你必须写表名资本,像这样:

    select *
    FROM all_tab_columns
    where table_name like 'IDECLARATION';
    
  • 2

    您可以使用以下查询来获取使用DB2中特定列的表名列表:

    SELECT TBNAME                
    FROM SYSIBM.SYSCOLUMNS       
    WHERE NAME LIKE '%COLUMN_NAME';
    

    注意:这里将 COLUMN_NAME 替换为您要搜索的列名 .

相关问题