繁体   English   中英

Oracle 查询以获取列名

[英]Oracle query to fetch column names

我有一个 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 的新手),我只有表空间名称,所以它相当于模式名称(逻辑上?)

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

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

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

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

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';

在oracle中你可以使用

desc users

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

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

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

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';

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

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

注意:如果所有列的组合长度超过4000字符,则LISTAGG将失败,这种情况很少见。 对于大多数情况,这将起作用。

与 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 文档

我发现这在 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;
  1. SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0; --> 注意,这是Query Result,一个ResultSet。 这可以导出为其他格式。 并且,您可以将查询结果导出为Text格式。 当我执行SELECT * FROM SATURN.SPRIDEN WHERE ROWNUM = 0;时,导出如下所示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"

  2. DESCRIBE <TABLE_NAME> --> 注意:这是脚本输出。

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

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

注意:此处将COLUMN_NAME替换为您要搜索的列名。

你可以试试这个:

描述“表名”

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM