Ancienne question, mais je pense que ce projet contient ce dont vous avez besoin :
Projet Data Tools - Outils de développement SQL
Voici la documentation pour le Analyseur de Requêtes SQL.
Aussi, voici un petit programme d'exemple. Je ne suis pas programmeur Java alors utilisez avec précaution.
package org.lala;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.List;
import org.eclipse.datatools.modelbase.sql.query.QuerySelectStatement;
import org.eclipse.datatools.modelbase.sql.query.QueryStatement;
import org.eclipse.datatools.modelbase.sql.query.TableReference;
import org.eclipse.datatools.modelbase.sql.query.ValueExpressionColumn;
import org.eclipse.datatools.modelbase.sql.query.helper.StatementHelper;
import org.eclipse.datatools.sqltools.parsers.sql.SQLParseErrorInfo;
import org.eclipse.datatools.sqltools.parsers.sql.SQLParserException;
import org.eclipse.datatools.sqltools.parsers.sql.SQLParserInternalException;
import org.eclipse.datatools.sqltools.parsers.sql.query.SQLQueryParseResult;
import org.eclipse.datatools.sqltools.parsers.sql.query.SQLQueryParserManager;
import org.eclipse.datatools.sqltools.parsers.sql.query.SQLQueryParserManagerProvider;
public class SQLTest {
private static String readFile(String path) throws IOException {
FileInputStream stream = new FileInputStream(new File(path));
try {
FileChannel fc = stream.getChannel();
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0,
fc.size());
/* Au lieu d'utiliser la valeur par défaut, passez un décodeur. */
return Charset.defaultCharset().decode(bb).toString();
} finally {
stream.close();
}
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
try {
// Créez une instance du gestionnaire d'analyse
// SQLQueryParserManagerProvider.getInstance().getParserManager
// renvoie le meilleur SQLQueryParserManager conforme
// prenant en charge le dialecte SQL de la base de données décrit par
// les informations sur le produit de base de données données. Dans le code ci-dessous, null est passé
// pour la base de données et la version
// auquel cas un analyseur générique est renvoyé
SQLQueryParserManager parserManager = SQLQueryParserManagerProvider
.getInstance().getParserManager("DB2 UDB", "v9.1");
// Requête d'exemple
String sql = readFile("c:\\test.sql");
// Analyser
SQLQueryParseResult parseResult = parserManager.parseQuery(sql);
// Obtenir l'objet modèle de requête depuis le résultat
QueryStatement resultObject = parseResult.getQueryStatement();
// Obtenez le texte SQL
String parsedSQL = resultObject.getSQL();
System.out.println(parsedSQL);
// Ici, nous avons le code SQL analysé !
QuerySelectStatement querySelect = (QuerySelectStatement) parseResult
.getSQLStatement();
List columnExprList = StatementHelper
.getEffectiveResultColumns(querySelect);
Iterator columnIt = columnExprList.iterator();
while (columnIt.hasNext()) {
ValueExpressionColumn colExpr = (ValueExpressionColumn) columnIt
.next();
// DataType dataType = colExpr.getDataType();
System.out.println("colonne de résultat effective : "
+ colExpr.getName());// + " with data type: " +
// dataType.getName());
}
List tableList = StatementHelper.getTablesForStatement(resultObject);
// List tableList = StatementHelper.getTablesForStatement(querySelect);
for (Object obj : tableList) {
TableReference t = (TableReference) obj;
System.out.println(t.getName());
}
} catch (SQLParserException spe) {
// gérer l'erreur de syntaxe
System.out.println(spe.getMessage());
@SuppressWarnings("unchecked")
List syntacticErrors = spe.getErrorInfoList();
Iterator itr = syntacticErrors.iterator();
while (itr.hasNext()) {
SQLParseErrorInfo errorInfo = (SQLParseErrorInfo) itr.next();
// Exemple d'utilisation de l'objet SQLParseErrorInfo
// le message d'erreur
String errorMessage = errorInfo.getParserErrorMessage();
String expectedText = errorInfo.getExpectedText();
String errorSourceText = errorInfo.getErrorSourceText();
// les numéros de ligne d'erreur
int errorLine = errorInfo.getLineNumberStart();
int errorColumn = errorInfo.getColumnNumberStart();
System.err.println("Erreur à la ligne " + errorLine + ", colonne "
+ errorColumn + ": " + expectedText + " "
+ errorMessage + " " + errorSourceText);
}
} catch (SQLParserInternalException spie) {
// gérer l'exception
System.out.println(spie.getMessage());
}
System.exit(0);
}
}