JYTHON脚本中的Oracle Data Integrator Substitution API

时间:2018-03-26 09:35:10

标签: jython

我在ODI过程中的JYTHON脚本中使用ODI SUBSTITUTION API和项目变量时遇到问题。

我使用Jython每隔15分钟检查一个标志的另一个数据库(DB1)。发送到该数据库的查询存储在来自另一个数据库(DB0)的专用模式的表中。我想对目标表和where子句使用ODI变量和替换API,因为根据环境会有不同的模式。

带有查询的DB0上的表:

CREATE TABLE QUERY_TABLE(
TARGET_QUERY CLOB,
TARGET_SCHEMA VARCHAR2(255),
LP_NAME VARCHAR2(255)
)

从JYTHON到DB0的第一个查询是

queryTable = odiRef.getObjectName("L","QUERY_TABLE","MyMetaData","D") 
LPName = odiRef.getLoadPlanInstance("LOAD_PLAN_NAME") 
getQuery = "SELECT TARGET_QUERY,TARGET_SCHEMA FROM " + queryTable + " WHERE 
PROCESS_NAME = '"+ LPName "'"

并且完全正常,而ODI SUBSTITUTION API在脚本中定义。

下一步是将上述查询的结果发送到DB1:

 flagCheckQuery = queryCursor.getString("TARGET_QUERY")
targetSchema = queryCursor.getString("TARGET_SCHEMA")
conn = odiRef.getJDBCConnectionFromLSchema(targetSchema,odiRef.getContext("CTX_CODE"))
flagCheckQueryCursor =  conn.createStatement().executeQuery(query) 

while flagCheckQueryCursor.next():
    if int(flagCheckQueryCursor.getString(1)) == 1: 
        #
        #Do other things here
        #

如果在DB0的QUERY_TABLE中,TARGET_QUERY具有与所有者类似的硬编码表

INSERT INTO QUERY_TABLE(TARGET_QUERY,TARGET_SCHEMA,LP_NAME)
VALUES ('SELECT FLAG FROM Flag_Schema.FLAG_TABLE','Flag_Schema','MY_LP')

工作正常。但是取决于环境模式,将是FLAG_SCHEMA_TEST,FLAG_SCHEMA_TEST2或其他名称,但始终在ODI中的逻辑模式中定义为Flag_Schema,并根据上下文引用其他精神架构中的心理模式。

所以我想使用ODI SUBSTITUTION API和这样的项目变量:

INSERT INTO QUERY_TABLE(TARGET_QUERY,TARGET_SCHEMA,LP_NAME)
VALUES ('SELECT FLAG FROM odiRef.getObjectName("L","DWH_PROCESS_STATUS","Flag_Schema","D") WHERE FLAG_DATE = to_date('':MyOdiProject.OdiDateVariable'',''mm/dd/yyyy'')','Flag_Schema','MY_LP')

但是,当我这样做时,Jython正在抛出异常

java.sql.SQLException: java.sql.SQLException: SQL string is not Query

知道如何在QUERY_TABLE中定义查询吗?

1 个答案:

答案 0 :(得分:0)

ODI Substitution API的语法是错误的,你必须把它放在<%= => 项目变量必须以#
开头 试试这段代码:

INSERT INTO QUERY_TABLE(TARGET_QUERY,TARGET_SCHEMA,LP_NAME)
VALUES ('SELECT FLAG FROM <%= odiRef.getObjectName("L","DWH_PROCESS_STATUS","Flag_Schema","D") %>
 WHERE FLAG_DATE = to_date(''#MyOdiProject.OdiDateVariable'',''mm/dd/yyyy'')','Flag_Schema','MY_LP')

阅读此文档https://docs.oracle.com/cd/E17904_01/integrate.1111/e12645/odiref_reference.htm