sql >> Database >  >> RDS >> Oracle

Hoe de kolom te vinden die in de dynamische query wordt gebruikt zonder de hele query uit te voeren?

U hoeft de query niet uit te voeren om de kolomnamen te krijgen, u hoeft hem alleen maar te ontleden; bijv. als een eenvoudig voorbeeld:

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

welke uitgangen:

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.

Je kunt elke validatie doen die je nodig hebt op de kolomnamen in de lus.

Houd er rekening mee dat u alleen de kolomnamen of aliassen voor kolomexpressies ziet (en valideert), die niet noodzakelijk de gegevens weerspiegelen die daadwerkelijk worden opgehaald. Iemand zou een query kunnen maken die alle gegevens ophaalt van overal waar het toegangsrecht heeft, maar vervolgens de kolommen/expressie-aliassen geeft die als geldig worden beschouwd.

Als u de toegang tot specifieke gegevens probeert te beperken, kijk dan naar andere mechanismen zoals weergaven, virtuele privédatabase, enz.



  1. EF-query naar Oracle die ORA-12704 gooit:tekenset komt niet overeen

  2. LAAD DATA INFILE slechts 1 record ingevoegd

  3. Waarschuwing:mysqli_query() verwacht dat parameter 1 mysqli is, resource gegeven

  4. Postgres-fout:meer dan één rij geretourneerd door een subquery die als expressie wordt gebruikt