Не е необходимо да изпълнявате заявката, за да получите имената на колоните, просто трябва да я анализирате; напр. като прост пример:
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;
/
което извежда:
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.
Можете да направите каквото ви е необходимо валидиране на имената на колоните вътре в цикъла.
Имайте предвид, че ще виждате (и проверявате) само имената на колоните или псевдонимите за изрази на колони, които не е задължително да отразяват данните, които действително се извличат. Някой може да създаде заявка, която изтегля всякакви данни от всяко място, до което има разрешение за достъп, но след това дава псевдоними на колони/изрази, които се считат за валидни.
Ако се опитвате да ограничите достъпа до конкретни данни, тогава потърсете други механизми като изгледи, виртуална частна база данни и т.н.