2012-04-20 14 views
14

Tengo una declaración SQL (para una base de datos Oracle) que tarda mucho tiempo en ejecutarse si es válida. Si no es válido, regresa inmediatamente con un error.¿Cómo puedo verificar la sintaxis de SQL para una declaración JDBC sin ejecutar la consulta real?

Me gustaría comprobar que la sintaxis es válida sin ejecutar la declaración (a través de JDBC), por ejemplo, detrás de un botón 'verificar declaración'. ¿Hay una forma de hacerlo independiente del proveedor? Mi primer pensamiento de simplemente definir la consulta como un PreparedStatement no parece causar ningún tipo de compilación o verificación de errores.

+0

Quizás las respuestas a esta otra pregunta puedan ayudarlo: http://stackoverflow.com/questions/141499/any-java-libraries-out-t-that-validate -sql-syntax –

Respuesta

11

posiblemente emitir un plan de explicación para la declaración le daría resultados útiles.

otro pensamiento - pero tal vez más difícil es editar la consulta para agregar (y rownum < 1) o algo para hacer que se ejecute rápido

+2

explicar el plan es el camino a seguir. Le dará los mismos errores de sintaxis que "ejecutar" la consulta –

+1

¿Cómo lidiar con los parámetros de enlace? – MRalwasser

+0

Es cierto que si tiene incluso un solo parámetro en su consulta, esto simplemente no funcionará. –

5

Esto es más de un truco que una respuesta real, pero que podría ejecutar una consulta que siempre devolverá una fila y una columna:

SELECT (EXISTS (SELECT 1 FROM dual) 
     OR 
     EXISTS (your Query here) 
     ) AS result 
FROM dual 

Esto debería devolver TRUE si su consulta es válida y elevar de error si no es válido.

+3

+1 alternativamente 'select * from (usted consulta aquí) donde 1 = 0' – gordy

+0

el comentario de gordy obtiene mi voto porque funciona para otros dbms además de Oracle. – AlainD

+0

@ user1938185 Sí, el 'FROM dual' solo funciona en Oracle y MySQL (y en SQLite, creo). En otro, liek SQL Server y Postgres, puedes eliminar completamente el 'FROM dual' y también funcionará. –

2

Puede usar DBMS_SQL.PARSE para verificar su estado de cuenta. Advertencia: Se acaba de analizar las sentencias DML, pero va a ejecutar y comprometerse instrucciones DDL como crear mesa, etc. Se puede crear un procedimiento almacenado para devolver un valor booleano o un bloque y envolver como esto:

set serveroutput on 
-- Example of good SQL 
declare 
    c integer; 
    s varchar2(50) := 'select * from dual'; 
begin 
    c := dbms_sql.open_cursor; 
    dbms_sql.parse(c,s,1); 
    dbms_sql.close_cursor(c); 
    dbms_output.put_line('SQL Ok'); 
exception 
    when others then 
    dbms_sql.close_cursor(c); 
    dbms_output.put_line('SQL Not Ok'); 
end; 
/

-- Example of bad SQL 
declare 
    c integer; 
    s varchar2(50) := 'select splat from dual'; 
begin 
    c := dbms_sql.open_cursor; 
    dbms_sql.parse(c,s,1); 
    dbms_sql.close_cursor(c); 
    dbms_output.put_line('SQL Ok'); 
exception 
    when others then 
    dbms_sql.close_cursor(c); 
    dbms_output.put_line('SQL Not Ok'); 
end; 
/
0

Puede usar Oracle's Pro*C precompiler para realizar una verificación de sintaxis (download here).

Esta es una herramienta destinada a la precompilación de código C que contiene sentencias de Oracle SQL sin formato, pero puede "abusar" de ella para realizar comprobaciones de sintaxis SQL.

  1. Crear un test.pc archivo con este código:

    EXEC SQL SELECT * FROM DUAL fueron 1 = 1;

  2. Ejecutar este comando después de instalar las herramientas de precompilador:

    proc INAME = SQLCheck test = La sintaxis de la

  3. Usted verá esta salida:

    Error de sintaxis en la línea 1, columna 34, archivo test.pc: Error en la línea 1, columna 34 en el archivo test.pc
    EXEC SQL SELECT * FROM DUAL WERE 1 = 1;
    ................................. 1
    PCC-S-02201, Encontrado el símbolo "1" cuando se espera uno de los siguientes:
    ; , para, unir, conectar, agrupar, tener, intersecar, menos, ordenar, iniciar, donde, con,
    El símbolo "teniendo" fue sustituido por "1" para continuar.

Debe ser fácil de integrar en su solución.

Tenga en cuenta que también puede realizar comprobaciones semánticas en línea, verificando que todos los procedimientos y tablas utilizados sean válidos en un esquema específico. Para eso, pasa SQLCHECK = SEMANTICS USERID = youruser

Cuestiones relacionadas