Vous n'avez pas besoin d'exécuter la requête pour obtenir les noms de colonne, il vous suffit de l'analyser ; par exemple. comme exemple simple :
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;
/
qui affiche :
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.
Vous pouvez effectuer la validation dont vous avez besoin sur les noms de colonne à l'intérieur de la boucle.
Gardez à l'esprit que vous ne verrez (et ne validerez) que les noms de colonne ou les alias pour les expressions de colonne, qui ne refléteront pas nécessairement les données réellement récupérées. Quelqu'un pourrait créer une requête qui extrait toutes les données de n'importe quel endroit auquel il est autorisé à accéder, mais donne ensuite les alias de colonnes/expressions qui sont considérés comme valides.
Si vous essayez de restreindre l'accès à des données spécifiques, examinez d'autres mécanismes tels que les vues, la base de données privée virtuelle, etc.