sql >> Database teknologi >  >> RDS >> Oracle

Hentning og visning af data fra Oracle-database

Du kan få kolonnebeskrivelsen/navnene - i en deterministisk rækkefølge - med noget som:

vælg coalesce(ct.col_desc, ct.col_name) fra col_tab ctleft join user_tab_columns utcon utc.table_name =ct.table_name og utc.column_name =ct.col_namewhere ct.table_name ='TABLE1'order efter utc.table_idc. , ct.col_name; 
COALESCE(CT.COL_----------------TABEL 1 COLUMN 3TABLE 1 COLUMN 1TAB1_COL_5TABLE 1 COLUMN 2TABLE 1 COLUMN 4 

Pivotering af disse rækker til kolonner skal ske dynamisk.

Du kan også generere en dynamisk forespørgsel for at få dataene i samme rækkefølge på en lignende måde.

Dette bruger SQL*Plus (eller SQLcl eller SQL Developer) bind variable ref cursorer til at få de to output, og bruger et tabelnavn defineret i blokken; men kunne nemt tilpasses til at være en procedure, der er bestået tabelnavnet og har parametre for ref-markørerne:

var rc1 refcursor;var rc2 refcursor;erklære l_table_name varchar2(30) :='TABLE1'; l_stmt varchar2(4000);begynd vælg 'vælg' || listagg('''' || coalesce(ct.col_desc, ct.col_name) || '''', ',') i gruppen (rækkefølge efter utc.column_id, ct.col_name) || 'fra dual' ind i l_stmt fra col_tab ct venstre join user_tab_columns utc på utc.table_name =ct.table_name og utc.column_name =ct.col_name hvor ct.table_name =l_table_name; dbms_output.put_line(l_stmt); åben :rc1 for l_stmt; vælg 'vælg' || listagg(coalesce(utc.column_name, 'null') || ' som ' || ct.col_name, ',') i gruppen (rækkefølge efter utc.column_id, ct.col_name) || ' fra ' || l_table_name ind i l_stmt fra col_tab ct left join user_tab_columns utc på utc.table_name =ct.table_name og utc.column_name =ct.col_name hvor ct.table_name =l_table_name; dbms_output.put_line(l_stmt); åben :rc2 for l_stmt;end;/ 

Kørsel af blokken får du dbms_output af udsagn kun til fejlretning, men kan være af interesse:

vælg 'TABLE 1 COLUMN 3','TABLE 1 COLUMN 1','TAB1_COL_5','TABLE 1 COLUMN 2','TABLE 1 COLUMN 4' fra dobbeltvælg TAB1_COL_3 som TAB1_COL_1_COL_1_COL_1_3,5 TAB1_COL_5,TAB1_COL_2 som TAB1_COL_2,nul som TAB1_COL_4 fra TABLE1 

og så kan du udskrive ref-markørerne (igen, klientspecifik adfærd):

print rc1'TABLE1COLUMN3' 'TABLE1COLUMN1' 'TAB1_COL_ 'TABLE1COLUMN2' 'TABLE1COLUMN4' ---------------- ------------ --------------------------------------------------TABEL 1 KOLONNE 3 TABEL 1 KOLONNE 1 TAB1_COL_5 TABEL 1 KOLONNE 2 TABEL 1 KOLONNE 4print rc2TAB1_COL_3 TAB1_COL_1 TAB1_COL_5 TAB1_COL_2 TAB1_COL_4--------------- -------------------- ---------- ------------- ----------TAB1_COL3_DATA1 TAB1_COL1_DAT TAB1_COL5_DAT2 TAB1_COL2_DAT TAB1_COL3_DATA2 TAB1_COL1_DAT TAB1_COL5_DAT1 TAB1_COL2_DAT TAB_1_AT_1_3_1_1_COL2_DAT TAB_1_AT_1_3_1_3_1_1_1_3_1_1_1_1_1_1_COL2_DAT_1_3_1_3 

I så fald kan du bruge et kasusudtryk til at udvide bestillingslogikken:

 inden for gruppen (rækkefølge efter case ct.col_name når 'TAB1_COL_3' derefter 1 når 'TAB1_COL_1' derefter 2 else 3 end, utc.column_id, ct.col_name) 

som så får:

'TABLE1COLUMN3' 'TABLE1COLUMN1' 'TAB1_COL_ 'TABLE1COLUMN2' 'TABLE1COLUMN4' ---------------- -------------- -- ---------- ----------------------------------TABEL 1 KOLONNE 3 TABEL 1 KOLONNE 1 TAB1_COL_5 TABEL 1 KOLONNE 2 TABLE 1 KOLONNE 4TAB1_COL_3 TAB1_COL_1 TAB1_COL_5 TAB1_COL_2 TAB1_COL_4--------------- -------------------- ------- ------- ------------- ----------TAB1_COL3_DATA1 TAB1_COL1_DAT TAB1_COL5_DAT2 TAB1_COL2_DAT TAB1_COL3_DATA2 TAB1_COL1_DAT TAB1_COL5_DAT1 TAB1_COL2_DAT_3_1_DATA TAB_1_DAT_3_1_1_1_COL2_DAT_1_1_COL2_DAT_3_1_1_1_COL2_DAT_1_1_1_COL2_DAT_3_1_1_1_COL2_DAT_1_1_1_COL2_DAT_3_1_1_1_1_COL2_DAT_1_1 

eller eventuelt bruge beskrivelsen i stedet for navnet, afhængigt af om det er navnet eller beskrivelsen, der forbliver det samme (svært at gætte ud fra eksemplet).

det er ikke rigtig nødvendigt her i sidste ende, og det er mere kompliceret end listagg Jeg brugte ovenfor; men du kunne gøre noget som;

 vælg 'vælg * fra (vælg rækkenummer() over (rækkefølge efter case ct.col_name når ''TAB1_COL_3'' derefter 1 når ''TAB1_COL_1'' derefter 2 ellers 3 end, utc.column_id, ct. col_name) som pos, coalesce(ct.col_desc, ct.col_name) som navn fra col_tab ct left join user_tab_columns utc på utc.table_name =ct.table_name og utc.column_name =ct.col_name hvor ct.table_name =:tab)pivot ( max(navn) som col for (pos) i ('|| listagg(niveau, ',') inden for gruppe (rækkefølge efter niveau)|| '))' til l_stmt fra dual connect med niveau <=(vælg count(* ) fra col_tab hvor tabelnavn =l_tabelnavn); dbms_output.put_line(l_stmt); åben :rc1 for l_stmt ved hjælp af l_table_name; 

som får output, der viser den genererede dynamiske forespørgsel som:

vælg * fra (vælg rækkenummer() over (rækkefølge efter case ct.col_name når 'TAB1_COL_3' derefter 1 når 'TAB1_COL_1' derefter 2 else 3 end, utc.column_id, ct.col_name) som pos, samles (ct.col_desc, ct.col_name) som navn fra col_tab ct left join user_tab_columns utc på utc.table_name =ct.table_name og utc.column_name =ct.col_name hvor ct.table_name =:tab)pivot (max(name) som col. for (pos) i (1,2,3,4,5)) 

og resultatet indstilles som:

1_COL 2_COL 3_COL 4_COL 5_COL ---------------------------------- ------- --------------------------------------------------TABEL 1 KOLONNE 3 TABEL 1 KOLONNE 1 TAB1_COL_5 TABEL 1 KOLONNE 2 TABEL 1 KOLONNE 4

Du kan bruge kolonnenavnene til pivoten i stedet for pos , det ville bare gøre det endnu sværere at læse, tror jeg, da du skal inkludere citater omkring dem.




  1. Hibernate genererer ikke kaskade

  2. Sådan viser du alle tabeller i Oracle

  3. Sådan bruges den samme tidsplan til flere SQL Server Agent-job (T-SQL)

  4. Hvordan opretter man forbindelse til MySQL-database i PHP ved hjælp af mysqli-udvidelse?