Zapytanie Oracle w celu pobrania nazw kolumn


123

Mam zapytanie MySQL, aby pobrać kolumny z tabeli takiej jak ta:

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

Jak zmienić powyższe zapytanie w bazie danych Oracle 11g? Muszę uzyskać nazwy kolumn jako zestaw wyników dla tabeli „użytkownicy” z wyłączeniem niektórych kolumn, określając schemat. W tej chwili wszystkie tabele znajdują się w moim nowym obszarze tabel, czy więc w miejsce nazwy schematu należy podać nazwę obszaru tabel?

Czy istnieje do tego ogólny HQL? W mojej nowej bazie danych Oracle (jestem nowy w Oracle) mam tylko nazwę obszaru tabel, więc czy jest to odpowiednik nazwy schematu (logicznie?)

Odpowiedzi:


177

Wyrocznia odpowiednikiem information_schema.COLUMNSjest USER_TAB_COLSdla tabel posiadanych przez bieżącego użytkownika, ALL_TAB_COLSlub DBA_TAB_COLSna stołach posiadanych przez wszystkich użytkowników.

Przestrzeń tabel nie jest odpowiednikiem schematu, nie musisz też podawać nazwy obszaru tabel.

Podanie schematu / nazwy użytkownika będzie przydatne, jeśli chcesz zapytać ALL_TAB_COLSlub DBA_TAB_COLSdla kolumn tabel należących do określonego użytkownika. w twoim przypadku wyobrażam sobie, że zapytanie wyglądałoby mniej więcej tak:

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

Zauważ, że przy takim podejściu ryzykujesz wstrzyknięcie SQL.

EDYCJA: Wielkie litery w nazwach tabel i kolumn są zwykle pisane wielkimi literami w Oracle; mają one tylko małe lub mieszane litery, jeśli są utworzone z podwójnymi cudzysłowami.


2
przy okazji znalazłem ogólny sposób na zrobienie tego niezależnie od bazy danych poprzez jdbc .. z linkiem tutaj: kodejava.org/examples/163.html
pri_dev

Musiałem również dodać and virtual_column = 'NO'do mojego zapytania.
musicin3d

101

Poniższe zapytanie zadziałało dla mnie w bazie danych Oracle.

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';

26
Należy pamiętać, że Oracle rozróżnia wielkość liter. Zwykle używam ...WHERE LOWER(Table_Name) = 'mytablename';.

2
@ user565869 użyłbym, w przeciwnym razie where lower(TABLE_NAME) = lower('WHATEVER'), gdy nazwa tabeli zawiera jakąś wielką literę, tabeli również nie znajdzie
AlexanderD

SELECT column_name FROM all_tab_cols WHERE UPPER(Table_Name) = UPPER('tablename');działa równie dobrze.
user3553260

Użycie lower(TABLE_NAME)lub upper(TABLE_NAME)wymaga, aby Oracle wykonała skanowanie ALL_TAB_COLUMNStabeli w celu uzyskania wszystkich wartości, TABLE_NAMEzanim będzie mogła porównać ją z podaną UPPER('MyTableName'). W szybkich testach sprawiło to, że wydajność nie nadawała się do moich celów, więc będę trzymać się porównań z uwzględnieniem wielkości liter.
Chris Magnuson

40

w wyroczni, której możesz użyć

desc users

aby wyświetlić wszystkie kolumny zawierające w tabeli użytkowników


6
... ponieważ chociaż reprezentuje odpowiedź na pytanie `` jak uzyskać listę wszystkich kolumn tabeli '', nie odpowiada na zadane pytanie: 1) to nie jest zapytanie, 2) nie ogranicza / filtruj zwrócone kolumny, 3) czy zwraca zestaw wyników?
Ehryk

6
Brak głosów za nie desc usersjest złą odpowiedzią na niektóre pytania, ale nie jest to dobra odpowiedź na to pytanie .
Ehryk

a ponieważ nie jest to zapytanie sql, jest to raczej polecenie sql * plus.
sprawdź

7

Możesz spróbować tego: (Działa na 11g i zwraca wszystkie nazwy kolumn z tabeli, tutaj test_tbl to nazwa tabeli, a user_tab_columns to kolumny tabeli dozwolone przez użytkownika)

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 


1
USER_TAB_COLUMNSjest w rzeczywistości kolumnami tabel, których właścicielem jest użytkownik, a nie kolumnami tabel dozwolonych dla użytkownika.
David Faber

2

Zapytanie do użycia z Oracle to:

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

Nigdy nie słyszałem o HQL dla takich zapytań. Zakładam, że nie ma sensu zajmować się tym implementacjami ORM. ORM to Object Relational Mapping, a to, czego szukasz, to mapowanie metadanych ... Nie używałbyś HQL, raczej używaj do tego celu metod API lub bezpośredniego SQL. Na przykład możesz użyć JDBC DatabaseMetaData .

Myślę, że przestrzeń tabel nie ma nic wspólnego ze schematem. Obszary tabel AFAIK są używane głównie do logicznych wewnętrznych celów technicznych, które powinny przeszkadzać administratorom baz danych. Więcej informacji na temat obszarów tabel można znaleźć w dokumencie Oracle .


TABLE_NAME='"+_db+".users'zawiedzie; musisz oddzielić właściciela / schemat i nazwę tabeli wALL_TAB_COLUMNS
David Faber

2

Jedynym sposobem, w jaki mogłem uzyskać nazwy kolumn, było użycie następującego zapytania:

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'

2

chodzi o to, że w ropuchach musisz napisać nazwę tabeli wielką, w ten sposób:

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';

1

Uważam, że ten jest przydatny w 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;

Ta odpowiedź jest bardzo trudna do odczytania. Rozważ ponowne formatowanie.
chharvey

Co się stanie, jeśli istnieje wiele tabel o tej samej nazwie, ale różnych właścicieli?
David Faber

1

W kilku przypadkach potrzebowalibyśmy rozdzielonej przecinkami listy wszystkich kolumn z tabeli w schemacie. W takich przypadkach możemy użyć tej ogólnej funkcji, która pobiera listę oddzieloną przecinkami jako ciąg.

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

Zatem samo wywołanie funkcji z zapytania daje wiersz ze wszystkimi kolumnami.

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

Uwaga: LISTAGG zakończy się niepowodzeniem, jeśli łączna długość wszystkich kolumn przekracza liczbę 4000znaków, co jest rzadkie. W większości przypadków to zadziała.


0
  1. SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0;-> Zwróć uwagę, że jest to Wynik zapytania, zestaw wyników. Można to wyeksportować do innych formatów. Możesz też wyeksportować wynik zapytania do Textformatu. Eksport wygląda jak poniżej, gdy zrobiłem 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> -> Uwaga: to jest wyjście skryptu.


-1

Możesz użyć poniższego zapytania, aby uzyskać listę nazw tabel używających określonej kolumny w DB2:

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

Uwaga: w tym miejscu zastąp COLUMN_NAMEnazwę kolumny, której szukasz.


Może powinieneś poszukać odpowiedzi na pytania dotyczące DB2? Wątpię, by ktoś szukający Oracle potrzebował odpowiedzi DB2.
RichardTheKiwi,

1
Ta odpowiedź faktycznie mi pomogła. Używam bazy danych DB2 w trybie Oracle i nie obsługuje ona funkcji all_tab_cols.
wm_eddie,

-1

Możesz spróbować tego:

opisz „Nazwę tabeli”

Zwróci wszystkie nazwy kolumn i typy danych

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.