2008-11-23 14 views

Respuesta

39

ACTUALIZACIÓN 2: org.hibernate.jdbc.util.BasicFormatterImpl nos cambiaron en la versión 4.0. Ahora se encuentra en: org.hibernate.engine.jdbc.internal.BasicFormatterImpl.

ACTUALIZACIÓN: La tecnología avanza. Como señaló Alex, org.hibernate.pretty.Formatter ya no existe a partir de la versión 3.3.2.GA. La sustitución es org.hibernate.jdbc.util.BasicFormatterImpl:

String formattedSQL = new BasicFormatterImpl().format(sql); 

En este escrito, esta respuesta tiene la mayoría de upvotes, y debe tener la respuesta correcta actual en ella, por lo que se han actualizado en consecuencia. Apoyos a Alex por mencionarlo.

...

respuesta original: Si está usando Hibernate, que tienen un built-in: org.hibernate.pretty.Formatter

String formattedSQL = new Formatter(sql).format(); 
+1

o DDLFormatter, que a) Insertar nueva línea después de cada coma; b) Sangra tres espacios después de cada nueva línea insertada; –

+0

Esto parece ser exactamente lo que estoy buscando. Hibernate ya es un componente central de mi solución, por lo que no presenta una nueva dependencia. –

+0

FYI, BasicFormatterImpl no maneja los comentarios '-' y DDLFormatter es aún más primitivo, ver http://www.dil.univ-mrs.fr/~massat/docs/hibernate-3.1/api/org/hibernate/pretty/ DDLFormatter.html # format() – Karl

1

Puede usar un SQL grammar y construir el AST con antlr. Luego puede generar el árbol en el formato que desee.

+0

Gracias. Ese será mi plan de último recurso. Afortunadamente estoy demasiado ocupado con un nuevo trabajo para mirar esto ahora y espero obtener una respuesta antes de tener que arremangarme. –

5

Parte del eclipse Data Tools Platform es el SQL Development Tools Project.

La página que describe cómo utilizar el SQL Query Parser tiene un muy breve uso de SQLQuerySourceFormat, que ofrece las siguientes opciones:

  • preserveSourceFormat = la opción para conservar el formateo de fuente de entrada cuando el texto de origen de SQL se genera
  • statementTerminator = el carácter que separa varias sentencias de SQL
  • hostVariablePrefix = el caracter que antecede una variable de lenguaje de host
  • parameterMarker = el caracter th por lo identifica un parámetro de lengua de acogida
  • delimitedIdentifierQuote * = el carácter que encierra identificadores delimitados cuya escritura en caso de que se preservará
  • omitSchema = el esquema actual (omitido en la fuente de SQL, implícita a las referencias de tabla sin calificar)
  • qualifyIdentifiers = la bandera describir identificadores cómo en el origen de SQL será calificado
  • preserveComments = la opción de conservar los comentarios en la fuente SQL analizada y/o el SQL generado fuente
  • generateCommentsForStatementOnly = la opción de generar comentarios para la fuente de SQL sólo en el contexto de la s completa esultados, o si se establece en falso, para objetos individuales de consultas SQL fuera del contexto de una declaración así
+0

Esta solución definitivamente me funcionaría, pero prefiero la simplicidad de la solución Hibernate. Una lástima que solo podría darle un +1 –

1

Quizás jsqlparser funcionará para ti.

No es tan fácil de encontrar como podría pensar, ya que hay una buena cantidad de proyectos difuntos por ahí. De hecho, no pude encontrarlo, así que terminé haciendo lo mío (basado en el analizador h2; me puedes contactar si todo lo demás falla). Como consecuencia, no sé si tiene un embellecedor, pero escribir uno encima debería ser lo suficientemente directo.

Está basado en una gramática y JavaCC, por lo que probablemente sea una mejor opción que reinventar esta rueda con antlr en cualquier caso. Puede encontrar si necesita admitir varios dialectos de sql en declaraciones complejas que cualquier enfoque basado en una gramática le fallará.

2

¿Ha considerado:

http://www.sqlinform.com

Ellos proporcionan tanto una versión de la API y una versión de línea de comandos (así como una versión en línea).

Sin embargo, no tiene conocimiento de los costos.

1

Que este trabajo - SQL Formatter.

+0

Necesito ser capaz de hacer esto fuera de línea como después del paso de generación de código en mi proceso de compilación. Entonces SQL Formatter no es una opción para mí. –

4

con Hibernate v3.3.2.GA, org.hibernate.pretty.Formatter ya no existe. Puede utilizar su sustitución: org.hibernate.jdbc.util.BasicFormatterImpl

Formatter f = new BasicFormatterImpl(); 
String formatted_sql_code = f.format(ugly_sql_code); 
0

Así que esto es definitivamente lo que busca: A SQL formatter library que el apoyo de Oracle, SQL Server, DB2, MySQL, PostgreSQL y Teradata .

Cuestiones relacionadas