sql >> Database teknologi >  >> RDS >> Oracle

Sådan finder du kolonnen brugt i den dynamiske forespørgsel uden at udføre hele forespørgslen

Du behøver ikke at udføre forespørgslen for at få kolonnenavnene, du skal blot analysere den; for eksempel. som et simpelt eksempel:

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

som udsender:

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.

Du kan udføre den validering, du har brug for, på kolonnenavnene inde i løkken.

Husk, at du kun vil se (og validere) kolonnenavnene eller aliasserne for kolonneudtryk, som ikke nødvendigvis afspejler de data, der rent faktisk bliver hentet. Nogen kunne lave en forespørgsel, der henter data fra et hvilket som helst sted, den har tilladelse til at få adgang til, men derefter giver de kolonner/udtryksaliasser, der anses for gyldige.

Hvis du forsøger at begrænse adgangen til specifikke data, så se nærmere på andre mekanismer såsom visninger, virtuel privat database osv.



  1. Hibernate postgres bytea hentning problem

  2. Hvordan kalder man Stored Procedure in a View?

  3. TIMESTAMPDIFF i Oracle 11g?

  4. Hvordan får man resultatet af en select count(*)-forespørgsel i PHP?