U hoeft de query niet uit te voeren om de kolomnamen te krijgen, u hoeft hem alleen maar te ontleden; bijv. als een eenvoudig voorbeeld:
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;
/
welke uitgangen:
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.
Je kunt elke validatie doen die je nodig hebt op de kolomnamen in de lus.
Houd er rekening mee dat u alleen de kolomnamen of aliassen voor kolomexpressies ziet (en valideert), die niet noodzakelijk de gegevens weerspiegelen die daadwerkelijk worden opgehaald. Iemand zou een query kunnen maken die alle gegevens ophaalt van overal waar het toegangsrecht heeft, maar vervolgens de kolommen/expressie-aliassen geeft die als geldig worden beschouwd.
Als u de toegang tot specifieke gegevens probeert te beperken, kijk dan naar andere mechanismen zoals weergaven, virtuele privédatabase, enz.