用于获取列名的 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 数据库中更改上述查询?我需要获取列名作为表“ users”的结果集,其中不包括某些列,并指定一个模式。现在我的新表空间中有所有的表,那么我是否应该指定表空间名来代替模式名?

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

622185 次浏览

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

表空间不等效于架构,也不必提供表空间名称。

如果您想要查询特定用户所拥有的 OF 表列的 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 中通常是大写的; 如果在表名和列名周围加上双引号,它们只是小写或混合大写。

与 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 带来麻烦。有关表空间的更多信息,请参见 甲骨文文件

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

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

注意: 这里用您正在搜索的列名替换 COLUMN_NAME

下面的查询在 Oracle 数据库中对我很有用。

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';

你可以使用的神谕

desc users

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

我发现这个在甲骨文中很有用:

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;

您可以尝试这样做: (它在11g 上工作,并返回表中的所有列名,这里 test _ tbl 是表名,user _ tab _ column 是用户允许的表列)

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl';

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

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'

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

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

注意: LISTAGG将失败,如果所有列的合并长度超过 4000字符,这是罕见的。在大多数情况下,这将工作。

你可以试试这个:

描述「表名」

它将返回所有列名和数据类型

  1. 注意,这是 Query Result,一个 ResultSet,可以导出为其他格式。 并且,你可以导出 查询结果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 _ 注释”“ SPRTELE _ INTL _ ACCESS”“ SPRTELE _ DATA _ ORIGIN”“ SPRTELE _ ATYP _ CODE”“ SPRTELE _ ADDR _ SEQNO”“ SPRTELE _ PRIMARY _ IND”“ SPRTELE _ UNLIST _ IND”“ SPRTELE _ 注释”“ SPRTELE“ SPRTELE _ USER _ ID”“ SPRTELE _ CTRY _ CODE _ PHONE”“ SPRTELE _ Surrogate _ ID”“ SPRTELE _ VERVersion”“ SPRTELE _ VPDI _ CODE”

  2. 注意: 这是脚本输出。

关键是在蟾蜍中你必须写上表名大写,像这样:

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';