Consulta Oracle para buscar nomes de colunas


123

Eu tenho uma consulta mySQL para obter colunas de uma tabela 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')"

Como altero a consulta acima no banco de dados Oracle 11g? Preciso obter nomes de colunas como um conjunto de resultados para a tabela 'usuários' excluindo determinadas colunas, especificando um esquema. No momento, tenho todas as tabelas no meu novo espaço de tabela; portanto, especifique o nome do espaço de tabela no lugar do nome do esquema?

Também existe um HQL genérico para isso? No meu novo banco de dados Oracle (sou novo no Oracle), tenho apenas o nome do espaço de tabela; isso é equivalente ao nome do esquema (logicamente?)

Respostas:


176

O equivalente a Oracle para information_schema.COLUMNSé USER_TAB_COLSpara tabelas pertencentes ao usuário atual ALL_TAB_COLSou DBA_TAB_COLSpara tabelas pertencentes a todos os usuários.

O espaço de tabela não é equivalente a um esquema, nem é necessário fornecer o nome do espaço de tabela.

Fornecer o esquema / nome de usuário seria útil se você deseja consultar ALL_TAB_COLSou DBA_TAB_COLSpara colunas de tabelas pertencentes a um usuário específico. no seu caso, eu imaginaria que a consulta seria 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' )"

Observe que, com essa abordagem, você corre o risco de injeção de SQL.

EDIT: Coloque em maiúscula os nomes de tabela e coluna, pois normalmente são maiúsculos no Oracle; elas são apenas minúsculas ou mistas se criadas com aspas duplas ao seu redor.


2
pela maneira que eu encontrei uma forma genérica de se fazer isso independentemente do databbase através jdbc .. com o link aqui: kodejava.org/examples/163.html
pri_dev

Eu também tive que adicionar and virtual_column = 'NO'à minha consulta.
musicin3d

101

A consulta abaixo funcionou para mim no banco de dados Oracle.

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';

26
Lembre-se de que o Oracle diferencia maiúsculas de minúsculas. Eu normalmente uso ...WHERE LOWER(Table_Name) = 'mytablename';.

2
@ user565869 Eu usaria where lower(TABLE_NAME) = lower('WHATEVER'), caso contrário, quando o nome da tabela tiver algum caractere maiúsculo, também não encontrará a tabela #
AlexanderD

SELECT column_name FROM all_tab_cols WHERE UPPER(Table_Name) = UPPER('tablename');funciona tão bem.
user3553260

Usar lower(TABLE_NAME)ou upper(TABLE_NAME)requer que o oracle faça uma varredura da ALL_TAB_COLUMNStabela para obter todos os valores TABLE_NAMEantes que possa compará-la com o fornecido UPPER('MyTableName'). Em testes rápidos, isso tornava o desempenho inutilizável para o meu objetivo, para que eu fique com comparações que diferenciam maiúsculas de minúsculas.
22718 Chris Magnuson

40

no oracle você pode usar

desc users

para exibir todas as colunas que contêm na tabela de usuários


6
... porque, embora represente uma resposta para 'como obter uma lista de todas as colunas de uma tabela', não responde à pergunta que foi feita: 1) não é uma consulta, 2) não limita / filtrar as colunas retornadas, 3) está retornando um conjunto de resultados?
Ehryk

6
A falta de votos positivos não é desc usersuma resposta ruim para algumas perguntas, mas não é uma boa resposta para essa pergunta .
Ehryk

e porque não é uma consulta sql, é um comando sql * plus. checkout isto para obter mais informações: stackoverflow.com/questions/37133666/…
01000001 15/10 1818

7

Você pode tentar o seguinte: (Funciona com 11g e retorna todo o nome da coluna de uma tabela, aqui test_tbl é o nome da tabela e user_tab_columns são colunas da tabela permitida pelo usuário)

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 


1
USER_TAB_COLUMNSsão, na verdade, as colunas das tabelas pertencentes ao usuário, não as das tabelas permitidas ao usuário.
David Faber

2

A consulta a ser usada com o Oracle é:

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

Nunca ouvi falar do HQL para essas consultas. Presumo que não faça sentido para implementações ORM lidar com isso. ORM é um mapeamento relacional de objetos, e o que você está procurando é o mapeamento de metadados ... Você não usaria HQL, em vez disso, utilizaria métodos de API para esse fim ou SQL direto. Por exemplo, você pode usar o JDBC DatabaseMetaData .

Eu acho que o espaço de tabela não tem nada a ver com esquema. Os espaços de tabela AFAIK são usados ​​principalmente para fins técnicos internos lógicos que devem incomodar os DBAs. Para obter mais informações sobre espaços de tabela, consulte Oracle doc .


TABLE_NAME='"+_db+".users'vai falhar; você precisa separar proprietário / esquema e nome da tabela noALL_TAB_COLUMNS
David Faber

2

A única maneira de obter os nomes das colunas foi usando a seguinte consulta:

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'

2

o ponto é que, no sapo, você deve escrever o nome da tabela em maiúscula, assim:

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';

1

Acho este útil no 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;

Esta resposta é muito difícil de ler. Por favor, considere a reformatação.
22415 chharvey

E se houver várias tabelas com o mesmo nome, mas proprietários diferentes?
David Faber

1

Em várias ocasiões, precisaríamos de uma lista separada por vírgula de todas as colunas de uma tabela em um esquema. Nesses casos, podemos usar essa função genérica que busca a lista separada por vírgulas como uma string.

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

Portanto, simplesmente chamar a função da consulta gera uma linha com todas as colunas.

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 falhará se o comprimento combinado de todas as colunas exceder 4000caracteres, o que é raro. Na maioria dos casos, isso funcionará.


0
  1. SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0;-> Observe que este é o Resultado da consulta, um ResultSet. Isso é exportável para outros formatos. E você pode exportar o resultado da consulta para o Textformato. A exportação se parece abaixo quando eu fiz 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 é a saída do script.


-1

Você pode usar a consulta abaixo para obter uma lista de nomes de tabelas que usam a coluna específica no DB2:

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

Nota: Substitua aqui pelo COLUMN_NAMEnome da coluna que você está procurando.


Talvez você deva procurar perguntas do DB2 para responder? Duvido que alguém procurando pelo Oracle precise de uma resposta do DB2.
21812 RichardTheKiwi

1
Essa resposta realmente me ajudou. Estou usando o DB2 no modo Oracle e ele não suporta all_tab_cols.
Wm_eddie

-1

Você pode tentar isso:

descrever 'Nome da tabela'

Ele retornará todos os nomes de colunas e tipos de dados

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.