2012-01-05 21 views
78

Tengo una consulta MySQL para obtener columnas de una tabla como la siguiente:Oracle consulta a buscar nombres de columna

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 puedo cambiar 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. Ahora mismo tengo todas las tablas en mi nuevo espacio de tabla, así que ¿especifico el nombre del espacio de tablas 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), sólo tengo nombre de tablas, así es que equivale a nombre de esquema (lógicamente?)

Respuesta

121

El equivalente de Oracle para information_schema.COLUMNS es USER_TAB_COLS para las tablas propiedad del usuario actual, ALL_TAB_COLS o DBA_TAB_COLS para tablas propiedad de todos los usuarios.

Tablespace no es equivalente a un esquema, tampoco debe proporcionar el nombre del espacio de tabla.

Proporcionar el esquema/nombre de usuario sería útil si desea consultar ALL_TAB_COLS o DBA_TAB_COLS para columnas de tablas propiedad de un usuario específico. en su caso, me imagino que la consulta sería algo como:

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, se corre el riesgo de inyección SQL.

+2

por cierto he encontrado una forma genérica de hacer esto con independencia de la databbase a través jdbc .. con el enlace aquí: http://www.kodejava.org/examples/163.html –

+0

También tuve que agregar 'y virtual_column = 'NO'' a mi consulta. – musicin3d

2

la consulta para utilizar 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 oído hablar de HQL para este tipo de consultas. Supongo que no tiene sentido que las implementaciones de ORM lo solucionen. ORM es un mapeo relacional de objetos, y lo que está buscando es la asignación de metadatos ... No usaría HQL, más bien usaría métodos de API para este propósito o dirigiría SQL. Por ejemplo, puede usar JDBC DatabaseMetaData.

Creo que tablespace no tiene nada que ver con el esquema. Los espacios de tabla de 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 Oracle doc.

-1

Usted puede utilizar la consulta siguiente para obtener una lista de nombres de tabla que utiliza la columna específica de DB2:

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

Nota: Aquí reemplazar el COLUMN_NAME con el nombre de la columna que se está buscando.

+0

¿Quizás debería buscar las preguntas de DB2 para responder? Dudo que alguien que buscara Oracle necesite una respuesta de DB2. – RichardTheKiwi

+1

Esta respuesta realmente me ayudó. Estoy usando DB2 en el modo Oracle y no es compatible con all_tab_cols. –

70

La siguiente consulta me funcionó en la base de datos Oracle.

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName'; 
+21

Tenga en cuenta que Oracle distingue entre mayúsculas y minúsculas. Normalmente utilizo '... WHERE LOWER (Table_Name) = 'mytablename';'. –

+1

@ user565869 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 –

+0

'SELECT column_name FROM all_tab_cols WHERE UPPER (Table_Name) = UPPER ('tablename'); 'funciona igual de bien. – user3553260

29

en el oráculo puede utilizar

desc users 

para mostrar todas las columnas que contiene en la tabla usuarios

+2

¿Por qué esto no tiene más votos ascendentes? –

+6

... 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/filtrar las columnas devueltas, 3) ¿está devolviendo un conjunto de resultados? – Ehryk

+4

La falta de upvotes no hace que 'desc users 'sea una mala respuesta a algunas preguntas, pero no es una buena respuesta para _this one_. – Ehryk

0

Me parece uno ú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; 
+0

Esta respuesta es muy difícil de leer. Por favor considere reformatear. – chharvey

4

Usted puede probar este : (Funciona en 11g y devuelve todo el nombre de columna de una tabla, aquí test_tbl es el nombre de la tabla y user_tab_columns son columnas permitido usuario de mesa)

select COLUMN_NAME from user_tab_columns 
where table_name='test_tbl'; 

2

La única manera de que yo era capaz de obtener los nombres de las columnas estaba utilizando la siguiente consulta:

select COLUMN_NAME 
FROM all_tab_columns atc 
WHERE table_name like 'USERS' 
0

en varias ocasiones , necesitaríamos una lista separada por comas de todas las columnas de una tabla en un esquema. En tales casos, podemos utilizar esta función genérica que recupera 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; 
/

Por lo tanto, sólo tiene que llamar a la función de 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 se producirá un error si la longitud combinada de todas las columnas excede 4000 caracteres que es raro. Para la mayoría de los casos, esto funcionará.

0

Puede probar esto:

describen 'Nombre de la tabla'

Se devolverá todos los nombres de las columnas y tipos de datos

Cuestiones relacionadas