Oracle查询以获取列名称

时间:2012-01-05 07:47:34

标签: sql oracle

我有一个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新手)中,我只有表空间名称,所以它等同于模式名称(逻辑上?)

10 个答案:

答案 0 :(得分:149)

对于所有用户拥有的表,当前用户拥有的表information_schema.COLUMNSUSER_TAB_COLS的{​​{1}}的Oracle等效项为ALL_TAB_COLS

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

如果要查询DBA_TAB_COLSALL_TAB_COLS以查找特定用户拥有的列OF表,则可以使用模式/用户名。在你的情况下,我想象查询看起来像:

DBA_TAB_COLS

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

编辑:大写表名和列名,因为它们在Oracle中通常是大写的;如果在它们周围用双引号创建,它们只是较低或混合的情况。

答案 1 :(得分:90)

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

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';

答案 2 :(得分:35)

在oracle中你可以使用

desc users

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

答案 3 :(得分: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。我认为ORM实现处理它没有意义。 ORM是一个对象关系映射,您正在寻找的是元数据映射......您不会使用HQL,而是使用API​​方法来实现此目的,或者直接使用SQL。例如,您可以使用JDBC DatabaseMetaData

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

答案 4 :(得分:2)

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

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'

答案 5 :(得分: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;

答案 6 :(得分:0)

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

label

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

for item in root.cssselect("#Type_outer"):
    print(item.xpath("text()[normalize-space()]")[0].strip())

注意:如果所有列的总长度超过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 将失败。对于大多数情况,这将有效。

答案 7 :(得分:0)

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

    &#34; SPRTELE_PIDM&#34; &#34; SPRTELE_SEQNO&#34; &#34; SPRTELE_TELE_CODE&#34; &#34; SPRTELE_ACTIVITY_DATE&#34; &#34; SPRTELE_PHONE_AREA&#34; &#34; SPRTELE_PHONE_NUMBER&#34; &#34; SPRTELE_PHONE_EXT&#34; &#34; SPRTELE_STATUS_IND&#34; &#34; SPRTELE_ATYP_CODE&#34; &#34; SPRTELE_ADDR_SEQNO&#34; &#34; SPRTELE_PRIMARY_IND&#34; &#34; SPRTELE_UNLIST_IND&#34; &#34; SPRTELE_COMMENT&#34; &#34; SPRTELE_INTL_ACCESS&#34; &#34; SPRTELE_DATA_ORIGIN&#34; &#34; SPRTELE_USER_ID&#34; &#34; SPRTELE_CTRY_CODE_PHONE&#34; &#34; SPRTELE_SURROGATE_ID&#34; &#34; SPRTELE_VERSION&#34; &#34; SPRTELE_VPDI_CODE&#34;

  2. DESCRIBE <TABLE_NAME> - &gt;注意:这是脚本输出。

答案 8 :(得分:0)

关键是要在蟾蜍中输入表名大写,如下所示:

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';

答案 9 :(得分:-1)

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

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

注意:此处将COLUMN_NAME替换为您要搜索的列名。