tipos subconsultas resueltos inner ejercicios ejemplos datos consultas complejas sql database oracle plsql

sql - subconsultas - ¿Hay alguna manera de obtener tipos/nombres de una consulta db desconocida sin ejecutarlo?



inner join en sql (2)

Tengo una aplicación web donde los usuarios ingresan consultas sql arbitrarias para el procesamiento por lotes posterior. Queremos validar la sintaxis de la consulta sin realmente ejecutarla. Algunas de las consultas tomarán mucho tiempo, por lo que no queremos ejecutarlas. Estoy usando Oracle dbms_sql.parse para hacer esto.

Sin embargo, ahora tengo una situación en la que necesito saber el número y el tipo de las columnas del conjunto de resultados. ¿Hay alguna manera de hacerlo sin ejecutar realmente la consulta? Es decir, hacer que Oracle analice la consulta y me diga qué tipo de datos / nombres de resultado se devolverán cuando la consulta se ejecute realmente. Estoy usando Oracle 10g y es una aplicación Java 1.5 / Servlet 2.4.

Editar: los usuarios que ingresan las consultas ya son usuarios en la base de datos. Se autentican en mi aplicación con sus credenciales de base de datos y las consultas se ejecutan usando esas credenciales. Por lo tanto, no pueden ingresar ninguna consulta que no puedan ejecutarse simplemente conectando con sqlplus.


Debería poder preparar una consulta SQL para validar la sintaxis y obtener los metadatos del conjunto de resultados. La preparación de una consulta no debería ejecutarlo.

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

Luego puede obtener metadatos sobre cada columna del conjunto de resultados.


Si desea hacer esto estrictamente a través de pl / sql, podría hacer lo siguiente:

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;

DBMS_SQL.desc_tab contiene prácticamente todo lo que necesita saber sobre las columnas.