Oracle查询以获取列名称

pri*_*dev 110 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')"
Run Code Online (Sandbox Code Playgroud)

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

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

Sat*_*hat 157

Oracle的等价物information_schema.COLUMNSUSER_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' )"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 顺便说一句,我通过jdbc找到了一个通用的方法,无论数据库是什么...链接在这里:http://www.kodejava.org/examples/163.html (2认同)

Kar*_*N G 94

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

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';
Run Code Online (Sandbox Code Playgroud)

  • 请记住,Oracle区分大小写.我通常使用`... WHERE LOWER(Table_Name)='mytablename';`. (25认同)
  • @ user565869我使用`where lower(TABLE_NAME)= lower('WHATEVER')`,否则当表名有一些大写字符时,它将找不到表 (2认同)
  • 使用 `lower(TABLE_NAME)` 或 `upper(TABLE_NAME)` 需要 oracle 对 `ALL_TAB_COLUMNS` 表进行表扫描以获取 `TABLE_NAME` 的所有值,然后才能将其与提供的 `UPPER('MyTableName') 进行比较`. 在快速测试中,这使得性能无法用于我的目的,因此我将坚持区分大小写的比较。 (2认同)

Ars*_*ikh 39

在oracle中你可以使用

desc users
Run Code Online (Sandbox Code Playgroud)

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

  • ...因为虽然它代表了"如何获取表格的所有列的列表"的答案,但它没有回答被问到的问题:1)它不是查询,2)它不限制/过滤返回的列,3)是否返回结果集? (6认同)
  • 缺乏upvotes并不会让"desc用户"对某些问题的答案很糟糕,但对于这个问题来说,这不是一个好的答案. (6认同)
  • 为什么这不会有更多的赞成? (2认同)

Md.*_*ous 6

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

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 
Run Code Online (Sandbox Code Playgroud)

  • USER_TAB_COLUMNS 实际上是用户拥有的表的列,而不是用户允许的表的列。 (2认同)

小智 6

关键是在 Toad 中你必须将表名大写,如下所示:

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';
Run Code Online (Sandbox Code Playgroud)