Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

SQL:Cari daftar kolom dengan nilai tertentu (dalam satu baris)

Ini bukan bagian normal dari fungsionalitas database. Namun Anda bukan orang pertama yang meminta ini, atau semacamnya.

Solusinya membutuhkan dua hal. Yang pertama adalah kamus data; database Oracle tidak mendukung Reflection tetapi dilengkapi dengan serangkaian tampilan yang memberi kita metadata tentang objek database kita. Dalam hal ini kita membutuhkan user_tab_columns , yang akan memberi kita kolom untuk tabel tertentu. Hal kedua adalah SQL dinamis; ini adalah kemampuan untuk merakit kueri SQL saat runtime dan kemudian menjalankannya. Ada beberapa cara untuk melakukan ini, tetapi biasanya kursor ref sudah cukup.

Kode berikut adalah bukti konsep. Dibutuhkan empat parameter:

  1. nama tabel yang ingin dicari
  2. nama kolom kunci utama tabel itu
  3. nilai kunci utama yang ingin Anda batasi
  4. nilai yang ingin Anda telusuri.

Ini kasar'n'ready sehingga Anda mungkin perlu mengeditnya untuk merapikan output atau untuk membuat program lebih fleksibel.

create or replace procedure search_cols
  (tname in user_tables.table_name%type
   , pk_col in user_tab_columns.column_name%type
   , pk in number
   , val in number )
is
    firstcol boolean := true;
    stmt varchar2(32767);
    result varchar2(32767);
    rc sys_refcursor;
begin
    stmt := 'select ';
    << projection >>
    for lrec in ( select column_name from user_tab_columns
                  where table_name = tname
                  and column_name != pk_col
                  and data_type = 'NUMBER'
                  order by column_id )
    loop
        if not firstcol then
            stmt := stmt || chr(10) || '||'',''||';
        else
            firstcol := false;
        end if;
        stmt := stmt || ' case when '|| lrec.column_name||' = '|| val ||
                           ' then '''|| lrec.column_name || ''' else null end';
    end loop projection;
    stmt := stmt || chr(10)|| ' from '||tname||' where '|| pk_col || ' = '|| pk;
    --  dbms_output.put_line(stmt);
    open rc for stmt;
    fetch rc into result;
    close rc;
    dbms_output.put_line(tname || '::' || val || ' found in '||result);
end search_cols;
/

Seperti yang Anda lihat, SQL dinamis sulit dibaca. Lebih sulit untuk di-debug :) Jadi ada baiknya untuk memiliki sarana untuk menunjukkan pernyataan akhir.

Nah ini dia hasilnya :

SQL> set serveroutput on size unlimited
SQL> exec search_cols('T23', 'ID', 111, 10)
T23::10 found in ,COL_B,COL_C,

PL/SQL procedure successfully completed.

SQL> exec search_cols('T23', 'ID', 222, 10)
T23::10 found in COL_A,,,

PL/SQL procedure successfully completed.

SQL>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Penegakan kunci unik/utama - jatuhkan indeks

  2. ORA-01704:string literal terlalu panjang 'Kesalahan saat memasukkan dokumen XML dalam tipe kolom Oracle XMLTYPE'

  3. Temukan rekor tertinggi kedua dari Oracle db

  4. urutan oracle hibernasi menghasilkan celah besar

  5. Mengembalikan nilai dari pernyataan insert