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数据库中更改上述查询? 我需要将列名称作为表格“用户”的结果集,排除某些列,指定一个模式。 现在我在新的表空间中有所有的表,所以我指定表空间名replace模式名?

也有一个通用的HQL呢? 在我的新Oracle数据库(我是Oracle的新手)中,我只有表空间名,所以相当于模式名(逻辑上?)

information_schema.COLUMNS的Oracle等价物是当前用户拥有的表的USER_TAB_COLS ,所有用户拥有的表的ALL_TAB_COLSDBA_TAB_COLS

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

如果要查询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注入风险。

下面的查询在Oracle数据库中为我工作。

 select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName'; 

在oracle中你可以使用

 desc users 

显示包含在用户表中的所有列

你可以试试这个:(它工作在11g,它返回一个表中的所有列名,这里test_tbl是表名,user_tab_columns是用户允许的表的列)

 select COLUMN_NAME from user_tab_columns where table_name='test_tbl'; 

用于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文档 。

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

 select COLUMN_NAME FROM all_tab_columns atc WHERE table_name like 'USERS' 

我发现这个在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; 

有几次,我们需要一个模式中的表中所有列的逗号分隔列表。 在这种情况下,我们可以使用这个通用函数,以逗号分隔的列表作为string。

 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字符(很less见),则LISTAGG将失败。 对于大多数情况下,这将工作。

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

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

注意:这里用您正在search的列名replaceCOLUMN_NAME