1-й пример ниже иллюстрирует рабочий код. Я хочу сделать рабочий код дальше и сохранить SQL в XML-файле. Однако, как только я прочитал его из XML-файла, я не могу больше расценивать это как оператор SQL как GString.
Вот рабочий пример:
private void testRefCursors(){
//object owner paramter
String owner = 'HR';
//Block of Oracle SQL to execute, returning 4 parameters
def sqlBlock =
"""
declare
type crsr is ref cursor;
tables crsr;
objects crsr;
begin
select count(*) into ${Sql.INTEGER} from all_tables where owner= ${owner} ;
open tables for select * from all_tables where owner= ${owner} ;
${Sql.resultSet OracleTypes.CURSOR} := tables;
select count(*) into ${Sql.INTEGER} from all_objects where owner= ${owner} ;
open objects for select * from all_objects where owner= ${owner};
${Sql.resultSet OracleTypes.CURSOR} := objects;
end;
"""
//note the order below, is the order of the 'types'
//in the SQL block used in the closure as parameters.
sqlSEDREF.call(sqlBlock){
t,user_tables,o,user_objects ->
println "found ${t} tables from a total of ${o} objects"
user_tables.eachRow(){x ->println "table:${x.table_name}"}
user_objects.eachRow(){println "object:${it.object_name}"}
}
}
Теперь, когда я изменю пример, чтобы прочитать блок SQL из файла XML; Я не знаю, как (или если это возможно) рассматривать это значение как GString:
private void testRefCursors(){
//object owner paramter
String owner = 'HR';
def configFile = new File("config.xml");
config = new XmlSlurper().parse(configFile);
// FAILURE HERE -
GString sqlBlock = config.'sql-test-cursors'
//note the order below, is the order of the 'types'
//in the SQL block used in the closure as parameters.
sqlSEDREF.call(sqlBlock){
t,user_tables,o,user_objects ->
println "found ${t} tables from a total of ${o} objects"
user_tables.eachRow(){x ->println "table:${x.table_name}"}
user_objects.eachRow(){println "object:${it.object_name}"}
}
}
Возвращенная ошибка является результатом невозможности использования реализации GString для SQL.call (GSTring, Closure):
Пойманный:
groovy.lang.MissingMethodException: Нет
подпись
Метод: groovy.sql.Sql.call () является
применимо для типов аргументов:
(Java.lang.String, tools.UAT $ _testRefCursors_closure2)
Мой текущий обходной путь - возможно, переключиться с файла config.xml на файл CONFIG.groovy и читать строки GStrings из файла .groovy вместо XML. Любые предложения с благодарностью.