Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment trouver la colonne utilisée dans la requête dynamique sans exécuter la requête entière

Vous n'avez pas besoin d'exécuter la requête pour obtenir les noms de colonne, il vous suffit de l'analyser ; par exemple. comme exemple 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;
/

qui affiche :

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.

Vous pouvez effectuer la validation dont vous avez besoin sur les noms de colonne à l'intérieur de la boucle.

Gardez à l'esprit que vous ne verrez (et ne validerez) que les noms de colonne ou les alias pour les expressions de colonne, qui ne refléteront pas nécessairement les données réellement récupérées. Quelqu'un pourrait créer une requête qui extrait toutes les données de n'importe quel endroit auquel il est autorisé à accéder, mais donne ensuite les alias de colonnes/expressions qui sont considérés comme valides.

Si vous essayez de restreindre l'accès à des données spécifiques, examinez d'autres mécanismes tels que les vues, la base de données privée virtuelle, etc.