Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да намерите колоната, използвана в динамичната заявка, без да изпълнявате цялата заявка

Не е необходимо да изпълнявате заявката, за да получите имената на колоните, просто трябва да я анализирате; напр. като прост пример:

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

което извежда:

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.

Можете да направите каквото ви е необходимо валидиране на имената на колоните вътре в цикъла.

Имайте предвид, че ще виждате (и проверявате) само имената на колоните или псевдонимите за изрази на колони, които не е задължително да отразяват данните, които действително се извличат. Някой може да създаде заявка, която изтегля всякакви данни от всяко място, до което има разрешение за достъп, но след това дава псевдоними на колони/изрази, които се считат за валидни.

Ако се опитвате да ограничите достъпа до конкретни данни, тогава потърсете други механизми като изгледи, виртуална частна база данни и т.н.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Материализиран изглед със спусък?

  2. Как да създадете асоциативни масиви в базата данни на Oracle

  3. Грешка в буфера на символния низ е твърде малък в съхранената процедура на Oracle

  4. Опитвате се да преработите рекурсивната заявка в Oracle CTE?

  5. Нова грешка при пролетно зареждане 2.3.0.RELEASE:UnsatisfiedDependencyException за Oracle 12.2.0.1 jdbcdriver, но не и с mysql jdbcdriver