После работы над той же проблемой мне удалось заставить работать синтаксический анализатор SQL:
Мой код выглядит следующим образом:
import oracle.jdeveloper.db.DatabaseConnections;
import oracle.javatools.db.sql.SQLQueryBuilder;
import oracle.javatools.db.Database;
...
// load the database connections
// this is specific to Oracle SQL developer
DatabaseConnections connections = DatabaseConnections.getPrivateInstance(
(new File("src/test/resources/connection.xml")).toURI().toURL(),
"somePassword");
// get the one we are interested in
Database database = connections.getDatabase("the-name-of-a-sqldeveloper-connection");
SQLQueryBuilder queryBuilder = SQLQueryBuilderFactory.createBuilder(
database, new Schema("OPTIONAL_SCHEMA"), "select * from some_table");
Задачи, чтобы заставить это работать:
- Получение OracleSQL Developer - это сложная задача. Для этого вам понадобится взломать файлы, которые Oracle SQL Developer создает для сохранения этих соединений; connection.xml в приведенном выше примере выглядит примерно так:
<?xml version = '1.0' encoding = 'UTF-8'?>
<References xmlns="http://xmlns.oracle.com/adf/jndi">
<Reference name="the-name-of-a-sqldeveloper-connection" className="oracle.jdeveloper.db.adapter.DatabaseProvider" xmlns="">
<Factory className="oracle.jdevimpl.db.adapter.DatabaseProviderFactory1212"/>
<RefAddresses>
<StringRefAddr addrType="password">
<Contents>HSx10FtlsPc=</Contents>
</StringRefAddr>
<StringRefAddr addrType="oraDriverType">
<Contents>thin</Contents>
</StringRefAddr>
...
Чтобы получить такой файл, вам нужно будет покопаться в папке, где хранятся настройки Oracle SQL Developer, и просто скопировать этот контент в свой собственный файл.
Теперь, если вам удалось продвинуться далеко, вотпроблемы и моменты, в которых меня разочаровало конечное решение:
- API в компоновщике приличный, но при синтаксическом анализе выполнит выполнение запроса (и это может быть большой проблемой- в моем случае мне нужен был быстрый разбор).
- API является официально не публичным . Не имея возможности привести здесь точную формулировку, я получил ответ Oracle, в котором указаноне является официально поддерживаемым парсером Oracle (якобы причина была в том, что это очень ценная технология, которая не будет продаваться или лицензироваться).
- Хотя это скорее взлом, чем решение, я понял, что это может бытьполезно для некоторых случаев (не для меня). Я считаю, что использование его в реальных сценариях может быть очень рискованным с технической и юридической точек зрения.
Сын, я опубликовал этот ответ, чтобы привлечь внимание сообщества к тому факту, что наличие парсера Oracle SQL вполне возможно , и, возможно, однажды Oracle рассмотрит возможность представить парсер конкурентным преимуществом (я уверен, что пользователитам, которые с радостью заплатили бы некоторые сборы, чтобы получить лицензию).