Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como encontrar a coluna usada na consulta dinâmica sem executar a consulta inteira


Você não precisa executar a consulta para obter os nomes das colunas, você só precisa analisá-la; por exemplo. como um exemplo simples:
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;
/

que emite:
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.

Você pode fazer qualquer validação que precisar nos nomes das colunas dentro do loop.

Lembre-se de que você só verá (e validará) os nomes de coluna ou aliases para expressões de coluna, que não refletirão necessariamente os dados que estão sendo recuperados. Alguém poderia criar uma consulta que extraia todos os dados de qualquer lugar que tenha permissão para acessar, mas fornece os aliases de colunas/expressão que são considerados válidos.

Se você está tentando restringir o acesso a dados específicos, procure outros mecanismos, como visualizações, banco de dados virtual privado, etc.