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_COLS
或DBA_TAB_COLS
。
表空间不等同于模式,您也不必提供表空间名称。
如果要查询ALL_TAB_COLS
或DBA_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
。