从Groovy访问Pentaho数据源

dohp0rv5  于 2023-04-19  发布在  其他
关注(0)|答案(2)|浏览(115)

在Pentaho报表设计器(PRD)中,我想通过引用在www.example.com文件中创建的JNDI,使用Groovy脚本(或EMCAScript脚本)连接到我的数据源default.properties。因此,我将创建一个包含JNDI名称的多值列表参数,并根据参数中选择的JNDI连接到数据源。
脚本:

import groovy.sql.Sql
import javax.naming.InitialContext
import javax.sql.DataSource

class SqlClient {

    InitialContext context = new InitialContext()
    DataSource dataSource = context.lookup("OLTP") as DataSource
    def sql = new Sql(dataSource)
    sql.execute("SELECT * FROM Person.User_JNDI")
    TypedTableModel model = new TypedTableModel();   
    while(sql.next())  
    model.addRow(new Object [] {rs.getString(1)});    
    c.close();  
    return model;
}

我收到以下错误:原因:org.apache.bsf.BSFException:Groovy的例外:org.codehaus.groovy.control.MultipleCompilationErrorsException:启动失败:表达式:11:意外令牌:sql @ line 11,column 5. sql.execute(“SELECT * FROM Person.User_JNDI”)
此外,PRD期望脚本返回一个模型,可能与TypedtableModel类有关。
谁能给予我一个Groovy脚本的例子?

wfveoks0

wfveoks01#

假设您已经按照here的格式填充了default.properties,您应该能够使用以下内容访问数据源:

import groovy.sql.Sql

import javax.naming.InitialContext
import javax.sql.DataSource

class SqlClient {

    InitialContext context = new InitialContext()
    DataSource dataSource = context.lookup("SampleData") as DataSource
    def sql = new Sql(dataSource)
    sql.execute '''
       select * from ... '''
    ...
}

使用Sql示例

egdjgwm8

egdjgwm82#

我可以通过以下方式实现这一点:

import groovy.sql.Sql
import javax.naming.InitialContext
import javax.sql.DataSource
import org.pentaho.reporting.engine.classic.core.util.TypedTableModel
import org.pentaho.reporting.engine.classic.core.modules.misc.connections.JndiDataSourceService

JndiDataSourceService jdss = new JndiDataSourceService()
DataSource dataSource = jdss.getDataSource("INSERT_DATASOURCE_NAME")

def sql = new Sql(dataSource)
def rows = sql.rows '''
    select 1 from dual
'''
TypedTableModel model = new TypedTableModel();    
if(rows.size()>0)
    for (columnEntry in rows[0].entrySet()){
        def name = columnEntry.getKey()
        def type = columnEntry.getValue().getClass()
        model.addColumn(name,type)
    }

for (row in rows)
    model.addRow(row.values().toArray())  

sql.close();  
return model;

相关问题