Existe uma maneira de obter tipos / nomes de uma consulta de db desconhecido sem executá-lo?
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.
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.