Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So finden Sie die in der dynamischen Abfrage verwendete Spalte, ohne die gesamte Abfrage auszuführen

Sie müssen die Abfrage nicht ausführen, um die Spaltennamen zu erhalten, Sie müssen sie nur analysieren; z.B. als einfaches Beispiel:

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;
/

was ausgibt:

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.

Sie können die Spaltennamen innerhalb der Schleife beliebig validieren.

Denken Sie daran, dass Sie nur die Spaltennamen oder Aliase für Spaltenausdrücke sehen (und validieren), die nicht unbedingt die tatsächlich abgerufenen Daten widerspiegeln. Jemand könnte eine Abfrage erstellen, die alle Daten von überall her abruft, auf die sie Zugriffsrechte hat, aber dann die als gültig erachteten Spalten-/Ausdrucks-Aliasnamen angibt.

Wenn Sie versuchen, den Zugriff auf bestimmte Daten einzuschränken, prüfen Sie andere Mechanismen wie Ansichten, virtuelle private Datenbanken usw.