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

SQL:Søg på en liste over kolonner med en given værdi (inden for en række)

Dette er ikke et normalt stykke databasefunktionalitet. Du er dog ikke den første person, der har bedt om dette, eller noget lignende.

Løsningen kræver to ting. Den første er dataordbogen; Oracle-databasen understøtter ikke Reflection, men den kommer med et sæt visninger, som giver os metadata om vores databaseobjekter. I dette tilfælde har vi brug for user_tab_columns , som vil give os kolonnerne for en given tabel. Den anden ting er dynamisk SQL; dette er evnen til at samle en SQL-forespørgsel under kørsel og derefter udføre den. Der er et par måder at gøre dette på, men normalt er ref markører tilstrækkelige.

Følgende kode er et proof of concept. Det kræver fire parametre:

  1. navnet på den tabel, du vil søge efter
  2. navnet på tabellens primære nøglekolonne
  3. den primære nøgleværdi, du vil begrænse af
  4. den værdi, du vil søge efter.

Det er rough'n'ready, så du skal muligvis redigere det for at rydde op i outputtet eller for at gøre programmet mere fleksibelt.

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

Som du kan se, er dynamisk SQL svær at læse. Det er sværere at debugge :) Så det er en god idé at have et middel til at vise den endelige erklæring.

Uanset hvad, her er resultaterne:

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. Codeigniter/PHP tjek om kan oprette forbindelse til databasen

  2. Flyt node i indlejret sæt

  3. Kan ikke oprette forbindelse til min AWS-databaseinstans | psql:kunne ikke oprette forbindelse til serveren:Operation timeout

  4. 'Identificeret med adgangskode' i Create Database MySQL