sql >> Databasteknik >  >> RDS >> Oracle

Hur man hittar kolumnen som används i den dynamiska frågan utan att köra hela frågan

Du behöver inte köra frågan för att få kolumnnamnen, du behöver bara analysera den; t.ex. som ett enkelt exempel:

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 ger ut:

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 göra vilken validering du än behöver på kolumnnamnen inuti slingan.

Tänk på att du bara ser (och validerar) kolumnnamnen eller alias för kolumnuttryck, som inte nödvändigtvis återspeglar den data som faktiskt hämtas. Någon kan skapa en fråga som hämtar all data från var som helst den har behörighet att komma åt, men som sedan ger de kolumner/uttrycksalias som anses giltiga.

Om du försöker begränsa åtkomsten till specifik data, titta på andra mekanismer som vyer, virtuell privat databas, etc.



  1. Initcap hoppa över ord som är mindre än 4 tecken

  2. Hur man skapar mysql-databas med sequelize (nodejs)

  3. Migrera MySQL till PostgreSQL på AWS RDS, del 1

  4. Rudimentärt problem:grundläggande PL/SQL-konsolutgång?