我在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中定义查询吗?
答案 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