sql >> Base de Datos >  >> RDS >> Oracle

Cómo encontrar la columna utilizada en la consulta dinámica sin ejecutar la consulta completa

No necesita ejecutar la consulta para obtener los nombres de las columnas, solo necesita analizarla; p.ej. como un ejemplo 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;
/

que da salida:

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.

Puede hacer cualquier validación que necesite en los nombres de las columnas dentro del bucle.

Tenga en cuenta que solo verá (y validará) los nombres de las columnas o los alias de las expresiones de las columnas, lo que no necesariamente reflejará los datos que realmente se están recuperando. Alguien podría crear una consulta que extraiga cualquier dato de cualquier lugar al que tenga permiso de acceso, pero luego proporcione los alias de columna/expresión que se consideren válidos.

Si está tratando de restringir el acceso a datos específicos, busque otros mecanismos como vistas, base de datos privada virtual, etc.