我有一个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 回答
对于当前用户拥有的表,
information_schema.COLUMNS
的Oracle等效项为USER_TAB_COLS
,对于所有用户拥有的表,ALL_TAB_COLS
或DBA_TAB_COLS
.表空间不等同于模式,您也不必提供表空间名称 .
如果要为特定用户拥有的列OF表查询
ALL_TAB_COLS
或DBA_TAB_COLS
,则提供架构/用户名将是有用的 . 在你的情况下,我想象查询看起来像:请注意,使用此方法可能会导致SQL注入风险 .
EDIT: 大写表名和列名,因为它们在Oracle中通常是大写的;如果用双引号创建它们,它们只是低级或混合大小写 .
以下查询在Oracle数据库中对我有用 .
在oracle中你可以使用
显示包含在users表中的所有列
您可以尝试这样:(它适用于11g,它返回表中的所有列名,这里test_tbl是表名,user_tab_columns是用户允许的表的列)
从user_tab_columns中选择COLUMN_NAME
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这样的查询 . 我认为它没有找到元数据映射......您不会使用HQL,而是使用API方法来实现此目的,或者直接使用SQL . 例如,您可以使用JDBC DatabaseMetaData .
我认为表空间与模式无关 . AFAIK表空间主要用于逻辑内部技术目的,这应该打扰DBA . 有关表空间的更多信息,请参见Oracle doc .
我能够获取列名的唯一方法是使用以下查询:
我发现这个在Oracle中很有用:
有几次,我们需要以逗号分隔列表中的一个表中的所有列 . 在这种情况下,我们可以使用这个泛型函数,它以逗号分隔的列表作为字符串 .
因此,只需从查询中调用函数就会产生一个包含所有列的行 .
如果所有列的总长度超过
4000
字符,则 Note:LISTAGG
将失败 . 对于大多数情况,这将有效 .你可以试试这个:
描述'表名'
它将返回所有列名和数据类型
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>
- >注意:这是脚本输出 .关键是在toad你必须写表名资本,像这样:
您可以使用以下查询来获取使用DB2中特定列的表名列表:
注意:这里将
COLUMN_NAME
替换为您要搜索的列名 .