sql >> Databáze >  >> RDS >> Oracle

Jak najít sloupec použitý v dynamickém dotazu bez provedení celého dotazu

Chcete-li získat názvy sloupců, nemusíte dotaz provádět, stačí jej analyzovat; např. jako jednoduchý příklad:

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

jehož výstupy:

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.

U názvů sloupců uvnitř smyčky můžete provést jakékoli ověření, které potřebujete.

Mějte na paměti, že uvidíte (a ověříte) pouze názvy sloupců nebo aliasy pro výrazy sloupců, které nemusí nutně odrážet data, která jsou skutečně načítána. Někdo by mohl vytvořit dotaz, který stáhne jakákoli data odkudkoli, kde má oprávnění k přístupu, ale pak poskytne aliasy sloupců/výrazů, které jsou považovány za platné.

Pokud se snažíte omezit přístup ke konkrétním datům, podívejte se na další mechanismy, jako jsou pohledy, virtuální soukromá databáze atd.



  1. Jak odstranit všechny primární klíče ze všech tabulek v databázi SQL Server - SQL Server / TSQL výukový program, část 65

  2. Vyplnění více tabulek v plachtách vodoryska orm

  3. Vyloučit sloupec pomocí SELECT * [kromě sloupceA] FROM tableA?

  4. Získejte sledující post efektivním způsobem v laravel 5.1