Consulta de Oracle para buscar nombres de columna

123

Tengo una consulta mySQL para obtener columnas de una tabla como esta:

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')"

¿Cómo cambio la consulta anterior en la base de datos Oracle 11g? Necesito obtener nombres de columnas como un conjunto de resultados para la tabla 'usuarios' excluyendo ciertas columnas, especificando un esquema. En este momento tengo todas las tablas en mi nuevo espacio de tabla, entonces, ¿especifico el nombre del espacio de tabla en lugar del nombre del esquema?

¿También hay un HQL genérico para esto? En mi nueva base de datos Oracle (soy nuevo en Oracle), solo tengo un nombre de espacio de tabla, entonces, ¿eso es equivalente al nombre del esquema (lógicamente?)

pri_dev
fuente

Respuestas:

176

El equivalente de Oracle para information_schema.COLUMNSes USER_TAB_COLSpara tablas propiedad del usuario actual ALL_TAB_COLSo DBA_TAB_COLSpara tablas propiedad de todos los usuarios.

El espacio de tabla no es equivalente a un esquema, tampoco tiene que proporcionar el nombre del espacio de tabla.

Proporcionar el esquema / nombre de usuario sería útil si desea consultar ALL_TAB_COLSo DBA_TAB_COLSpara columnas de tablas de propiedad de un usuario específico. en su caso, me imagino que la consulta se vería así:

String sqlStr= "
SELECT column_name
  FROM all_tab_cols
 WHERE table_name = 'USERS'
   AND owner = '" +_db+ "'
   AND column_name NOT IN ( 'PASSWORD', 'VERSION', 'ID' )"

Tenga en cuenta que con este enfoque, corre el riesgo de inyección SQL.

EDITAR: en mayúsculas los nombres de tabla y columna, ya que estos suelen estar en mayúsculas en Oracle; solo son minúsculas o mixtas si se crean entre comillas dobles.

Sathyajith Bhat
fuente
2
Por cierto, encontré una forma genérica de hacer esto independientemente de la base de datos a través de jdbc .. con el enlace aquí: kodejava.org/examples/163.html
pri_dev
También tuve que agregar and virtual_column = 'NO'a mi consulta.
musicin3d
101

La siguiente consulta funcionó para mí en la base de datos Oracle.

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';
Karthik NG
fuente
26
Tenga en cuenta que Oracle distingue entre mayúsculas y minúsculas. Me suelen utilizar ...WHERE LOWER(Table_Name) = 'mytablename';.
2
@ user565869 que usaría where lower(TABLE_NAME) = lower('WHATEVER'), de lo contrario, cuando el nombre de la tabla tenga algún carácter en mayúscula, tampoco encontrará la tabla
AlexanderD
SELECT column_name FROM all_tab_cols WHERE UPPER(Table_Name) = UPPER('tablename');funciona igual de bien
user3553260
Usar lower(TABLE_NAME)o upper(TABLE_NAME)requiere que Oracle haga un escaneo de la ALL_TAB_COLUMNStabla para obtener todos los valores TABLE_NAMEantes de que pueda compararlo con el suministrado UPPER('MyTableName'). En las pruebas rápidas esto hizo que el rendimiento fuera inutilizable para mi propósito, por lo que me atendré a las comparaciones entre mayúsculas y minúsculas.
Chris Magnuson el
40

en Oracle puedes usar

desc users

para mostrar todas las columnas que contienen en la tabla de usuarios

Arsalan Sheikh
fuente
66
... porque aunque representa una respuesta a 'cómo obtener una lista de todas las columnas de una tabla', no responde la pregunta que se hizo: 1) no es una consulta, 2) no limita / filtra las columnas devueltas, 3) ¿devuelve un conjunto de resultados?
Ehryk
66
La falta de votos a favor no desc usersresponde mal a algunas preguntas, pero no es una buena respuesta para esta .
Ehryk
y porque no es una consulta sql, más bien es un comando sql * plus. consulte esto para obtener más información: stackoverflow.com/questions/37133666/…
01000001
7

Puede intentar esto: (Funciona en 11g y devuelve todos los nombres de columna de una tabla, aquí test_tbl es el nombre de la tabla y user_tab_columns son las columnas de la tabla permitidas por el usuario)

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 

Md. Salman Fahad Famoso
fuente
1
USER_TAB_COLUMNSen realidad son las columnas de las tablas propiedad del usuario, no las de las tablas permitidas al usuario.
David Faber
2

La consulta para usar con Oracle es:

String sqlStr="select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='"+_db+".users' and COLUMN_NAME not in ('password','version','id')"

Nunca he oído hablar de HQL para tales consultas. Supongo que no tiene sentido que las implementaciones de ORM lo aborden. ORM es un mapeo relacional de objetos, y lo que está buscando es un mapeo de metadatos ... No usaría HQL, sino métodos de API para este propósito, o SQL directo. Por ejemplo, puede usar JDBC DatabaseMetaData .

Creo que tablespace no tiene nada que ver con el esquema. Los espacios de tabla AFAIK se utilizan principalmente para fines técnicos internos lógicos que deberían molestar a los DBA. Para obtener más información sobre los espacios de tabla, consulte el documento de Oracle .

yair
fuente
TABLE_NAME='"+_db+".users'fallará; necesita separar el propietario / esquema y el nombre de la tabla enALL_TAB_COLUMNS
David Faber
2

La única forma en que pude obtener los nombres de columna fue mediante la siguiente consulta:

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'
Altán
fuente
2

el punto es que en sapo tienes que escribir el nombre de la tabla capital, así:

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';
Ghadir Farzaneh
fuente
1

Encuentro este útil en 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;
Dave C.
fuente
Esta respuesta es muy difícil de leer. Por favor considere reformatear.
chharvey
¿Qué pasa si hay varias tablas con el mismo nombre, pero diferentes propietarios?
David Faber
1

En varias ocasiones, necesitaríamos una lista separada por comas de todas las columnas de una tabla en un esquema. En tales casos, podemos usar esta función genérica que busca la lista separada por comas como una cadena.

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;
/

Entonces, simplemente llamar a la función desde la consulta produce una fila con todas las columnas.

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

Nota: LISTAGG fallará si la longitud combinada de todas las columnas excede los 4000caracteres, lo cual es raro. Para la mayoría de los casos, esto funcionará.

Kaushik Nayak
fuente
0
  1. SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0;-> Tenga en cuenta que este es el resultado de la consulta, un conjunto de resultados. Esto es exportable a otros formatos. Y puede exportar el resultado de la consulta al Textformato. Exportar se ve a continuación cuando lo hice 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> -> Nota: Esta es la salida del script.

Uddhav Gautam
fuente
-1

Puede utilizar la consulta a continuación para obtener una lista de nombres de tabla que utiliza la columna específica en DB2:

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

Nota: Aquí reemplace el COLUMN_NAMEcon el nombre de la columna que está buscando.

Arulazagan Rathinam Infosys
fuente
¿Quizás debería buscar preguntas de DB2 para responder? Dudo que alguien que busque Oracle necesite una respuesta de DB2.
RichardTheKiwi
1
Esta respuesta realmente me ayudó. Estoy usando DB2 en modo Oracle y no es compatible con all_tab_cols.
wm_eddie
-1

Puedes probar esto:

describe 'Nombre de tabla'

Devolverá todos los nombres de columna y tipos de datos

Reza Rahimi
fuente