Existe uma maneira de obter tipos / nomes de uma consulta de db desconhecido sem executá-lo?

StackOverflow https://stackoverflow.com/questions/163389

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu tenho um aplicativo da web onde os usuários entram consultas SQL arbitrárias para processamento em lote mais tarde. Queremos validar a sintaxe da consulta sem realmente executá-lo. Algumas das perguntas vai levar um longo tempo, e é por isso que não queremos para executá-los. Estou usando dbms_sql.parse da Oracle para fazer isso.

No entanto, agora tenho uma situação onde eu preciso saber o número e tipo das colunas conjunto de resultados. Existe uma maneira de fazer isso sem realmente executar a consulta? Ou seja, para ter a Oracle analisar a consulta e me diga o que os tipos de dados de resultado / nomes será devolvido quando a consulta é realmente executada? Estou usando o Oracle 10g e e é um 2.4 aplicativo Java 1.5 / Servlet.

Edit: Os usuários que entram as consultas já são usuários do banco de dados. Eles autenticar para meu aplicativo com suas credenciais de banco de dados e as consultas são executadas usando essas credenciais. Portanto eles não podem colocar em qualquer consulta que não podiam correr por apenas conectar-se com sqlplus.

Foi útil?

Solução

Você deve ser capaz de preparar uma consulta SQL para validar a sintaxe e obter metadados conjunto de resultados. Preparar uma consulta não deve executá-lo.

import java.sql.*;
. . .
Connection conn;
. . .
PreparedStatement ps = conn.prepareStatement("SELECT * FROM foo");
ResultSetMetadata rsmd = ps.getMetaData();
int numberOfColumns = rsmd.getColumnCount();

Em seguida, você pode obter metadados sobre cada coluna do conjunto de resultados.

Outras dicas

Se você quiser fazer isso estritamente através de pl / sql, então você pode fazer o seguinte:

DECLARE 
  lv_stat varchar2(100) := 'select blah blah blah';
  lv_cur INTEGER;
  lv_col_cnt INTEGER;
  lv_desc DBMS_SQL.desc_tab;
BEGIN
  DBMS_SQL.parse(lv_cur,lv_stat,DBMS_SQL.NATIVE);
  DBMS_SQL.describe_columns(lv_cur,lv_col_cnt,lv_desc);
  FOR ndx in lv_desc.FIRST .. lv_desc.LAST LOOP
    DBMS_OUTPUT.PUT_LINE(lv_desc(ndx).col_name ||' '||lv_desc(ndx).col_type);
  END LOOP;
END;

o DBMS_SQL.desc_tab contém praticamente tudo o que você precisa saber sobre as colunas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top