如何将XML文件中的条目视为GString并且groovy仍然“评估”它?

时间:2009-03-17 20:11:08

标签: groovy

下面的第一个例子说明了工作代码。我想将工作代码更进一步,并将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}"}
    }
}

现在当我更改示例以从XML文件中读取SQL块时;我不知道如何(或者是否可能)将该值视为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}"}
    }
}

返回的错误是由于无法使用SQL.call的GString实现(GSTring,Closure):

  

陷入:   groovy.lang.MissingMethodException:没有   签名   方法:groovy.sql.Sql.call()是   适用于参数类型:   (java.lang.String中,tools.UAT $ _testRefCursors_closure2)

我目前的解决方法是,从拥有config.xml切换到拥有CONFIG.groovy文件,并从.groovy文件而不是XML中读取GStrings。任何建议都非常感谢。

2 个答案:

答案 0 :(得分:2)

XML文件不会返回GString,因为GString是由groovy编译器在编译时构造的。解析XML文件时,会得到一个String,而不是一个已编译的Groovy可执行文件。

如果你真的想在XML文档中嵌入groovy代码(这是你真正想要做的),那么你应该首先看一下:Embedding Groovy。基本上,您将读入SQL并将其视为嵌入式groovy脚本。

另一种选择(我遇到类似问题时采用的替代方法)是使用MessageFormat替换XML中的值。

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

然后在xml上使用XmlSlurper之后,您可以像这样替换XML中的值:

assert java.text.MessageFormat (xml.sql.query.text()).format ('dual') 
               == 'select * from dual'

答案 1 :(得分:0)

我想你可能会尝试

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

可能会返回一个GString。