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

Come trovare la colonna utilizzata nella query dinamica senza eseguire l'intera query

Non è necessario eseguire la query per ottenere i nomi delle colonne, è sufficiente analizzarla; per esempio. come semplice esempio:

set serveroutput on

declare
  l_statement varchar2(4000) := 'select * from employees';
  l_c pls_integer;
  l_col_cnt pls_integer;
  l_desc_t dbms_sql.desc_tab;
begin
  l_c := dbms_sql.open_cursor;
  dbms_sql.parse(c=>l_c, statement=>l_statement, language_flag=>dbms_sql.native);
  dbms_sql.describe_columns(c=>l_c, col_cnt=>l_col_cnt, desc_t=>l_desc_t);

  for i in 1..l_col_cnt loop
    dbms_output.put_line(l_desc_t(i).col_name);
  end loop;

  dbms_sql.close_cursor(l_c);
exception
  when others then
    if (dbms_sql.is_open(l_c)) then
      dbms_sql.close_cursor(l_c);
    end if;
    raise;
end;
/

che emette:

EMPLOYEE_ID
FIRST_NAME
LAST_NAME
EMAIL
PHONE_NUMBER
HIRE_DATE
JOB_ID
SALARY
COMMISSION_PCT
MANAGER_ID
DEPARTMENT_ID

PL/SQL procedure successfully completed.

Puoi eseguire la convalida di cui hai bisogno sui nomi delle colonne all'interno del ciclo.

Tieni presente che vedrai (e convaliderai) solo i nomi di colonna o gli alias per le espressioni di colonna, che non rifletteranno necessariamente i dati che vengono effettivamente recuperati. Qualcuno potrebbe creare una query che estrae tutti i dati da qualsiasi luogo a cui ha il permesso di accedere, ma poi fornisce gli alias di colonne/espressione che sono considerati validi.

Se stai cercando di limitare l'accesso a dati specifici, esamina altri meccanismi come visualizzazioni, database privato virtuale, ecc.