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.