列名を取得するためにクエリを実行する必要はありません。解析するだけで済みます。例えば簡単な例として:
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.
ループ内の列名に対して必要な検証を行うことができます。
列式の列名またはエイリアスのみが表示(および検証)されることに注意してください。これらは、実際に取得されているデータを必ずしも反映しているわけではありません。誰かが、アクセス許可のある場所から任意のデータをプルするクエリを作成し、有効と見なされる列/式のエイリアスを提供する可能性があります。
特定のデータへのアクセスを制限しようとしている場合は、ビュー、仮想プライベートデータベースなどの他のメカニズムを調べてください。