Как обрабатывать запись в XML-файле как GString и все еще «оценивать» ее groovy? - PullRequest
3 голосов
/ 17 марта 2009

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. Любые предложения с благодарностью.

Ответы [ 2 ]

2 голосов
/ 23 марта 2009

XML-файл не вернет GString, поскольку GString создается Groovy-компилятором во время компиляции. При анализе XML-файла вы получаете строку, а не скомпилированный исполняемый файл Groovy.

Если вы действительно хотите встроить отличный код в XML-документ (что вы действительно и здесь пытаетесь сделать), то вам следует начать с рассмотрения этого: Встраивание Groovy . По сути, вы читали бы в SQL и рассматривали бы его как встроенный скрипт groovy.

Альтернативой (которую я принял, столкнувшись с аналогичной проблемой), является использование MessageFormat для замены значений в XML.

def s = '<sql><query-name>Some SQL</query-name>
           <query>
                select * from {0}
           </query>
         </sql>'

И затем после использования XmlSlurper в xml вы можете заменить значения в XML следующим образом:

assert java.text.MessageFormat (xml.sql.query.text()).format ('dual') 
               == 'select * from dual'
0 голосов
/ 18 марта 2009

Я думаю, вы могли бы попробовать

var sqlBlock = config['sql-test-cursors'].text()

, который может вернуть строку GString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...