Bạn không cần thực hiện truy vấn để lấy tên cột, bạn chỉ cần phân tích cú pháp nó; ví dụ. như một ví dụ đơn giản:
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;
/
đầu ra nào:
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.
Bạn có thể thực hiện bất kỳ xác thực nào bạn cần đối với các tên cột bên trong vòng lặp.
Hãy nhớ rằng bạn sẽ chỉ thấy (và xác thực) tên cột hoặc bí danh cho các biểu thức cột, điều này sẽ không nhất thiết phản ánh dữ liệu thực sự đang được truy xuất. Ai đó có thể tạo ra một truy vấn lấy bất kỳ dữ liệu nào từ bất kỳ nơi nào mà nó có quyền truy cập, nhưng sau đó cung cấp cho các cột / bí danh biểu thức được coi là hợp lệ.
Nếu bạn đang cố gắng hạn chế quyền truy cập vào dữ liệu cụ thể, hãy xem xét các cơ chế khác như chế độ xem, cơ sở dữ liệu riêng ảo, v.v.