2017-05-22 144 views
2

我正在尝试构建一个ODI过程,它将从oracle数据库元数据表中获取模式名称,数据库过程名称和参数。参数字段包含一个ODI全球variable.The源命令的名字是这样我可以在ODI中的源变量中调用全局变量吗?

SELECT SCHEMA_NAME VAR_SCHEMA, PROCEDURE_NAME VAR_PROCEDURE, PARAMETER_NAME 
VAR_PARAMETER FROM SCHEMA-NAME.TABLE_NAME 

源命令的输出是这样的:

VAR_SCHEMA_NAME VAR_TABLE_NAME VAR_PARAMETER 
ABC    PROC_LIST  TO_DATE('#VAR_ETL_LOAD_DATE','DD/MM/RRRR') 

这里,#VAR_ETL_LOAD_DATE是一个全局变量在ODI中。

在过程的目标命令中,我想从源命令中使用这些信息来执行元数据表中列出的过程。我写了这样的命令:

DECLARE 

VVC_SQL_STMT LONG; 

BEGIN 

VVC_SQL_STMT := 'BEGIN 
      #VAR_SCHEMA_NAME.#VAR_PROCEDURE_NAME(#VAR_PARAMETER); 
      END;';              

INSERT INTO AK_TST2 VALUES(VVC_SQL_STMT,SYSDATE); 

COMMIT; 

EXECUTE IMMEDIATE (VVC_SQL_STMT); 

END; 

这个代码给出了ODI以下错误:

ODI-1228: Task PROC_SP_HANDLER (Procedure) fails on the target ORACLE 
connection OCDM_SYS. 
Caused By: java.sql.SQLException: ORA-06550: line 8, column 61: 
PLS-00103: Encountered the symbol "#" when expecting one of the following: 

* & = - + ; </> at in is mod remainder not rem 
<an exponent (**)> <> or != or ~= >= <= <> and or like like2 
like4 likec between || multiset member submultiset 

什么是阅读过程名称并为此和ODI我如何可以执行存储过程的原因来自元数据表的参数?

回答

0

如果您从表中选择数据并将结果用作进一步执行的代码,那么通常您不能在其中使用ODI变量。因为ODI认识到它是一个变量并用变量代替它太迟了。这对于全局变量和项目变量都是一样的。

如果您可以打印"#"+variable_name来自?或%-substitution而不是它的工作。但是,如果@ -substitution输出变量名称,或者在从Source获取值之后变量显示为最终代码,则为时已晚。在这种情况下,它仍然是一个纯文本#VAR

在您的特定情况下,你可以执行以下操作:在包像#VAR_ETL_LOAD_DATE

  1. 声明所有变量。我的意思是可能会出现在元数据表中的所有变量。 Bacause情景应该事先知道所有变量。
  2. 使用odiRef.getJDBCConnection('SRC')在?替代中选择和提取记录。以可执行代码的形式将所有结果收集到一个java变量中。

例如,源代码看起来是这样的:

select 1 from dual; 
<? 
import java.sql.*; 
String crlf = System.getProperty("line.separator"); 
String result = "begin"+crlf+"null;"+crlf; 
PreparedStatement stmt = odiRef.getJDBCConnection("SRC").prepareStatement("select schema||'.'||proc||'('||param||')' from metatable"); 
ResultSet rs = stmt.executeQuery(); 
while(rs.next()){ 
    result += "insert into ak_tst2 values('"+rs.getString(1).replaceAll("'",'"'.toString())+"');"+crlf; 
    result += "commit;"+crlf; 
    result += rs.getString(1)+";"+crlf; 
} 
result += "end;"; 
rs.close(); 
stmt.close(); 
?> 

目标代码应该很简单

<?=result?> 

在运行时的目标代码会出现这样的

begin 
null; 
insert into ak_tst2 values('qwe.asd("param_using_#var")'); 
commit; 
qwe.asd('param_using_#var'); 
insert into ak_tst2 values('qwe2.asd2("param2_using_#var")'); 
commit; 
qwe2.asd2('param2_using_#var'); 
insert into ak_tst2 values('qwe3.asd3("param3_using_#var")'); 
commit; 
qwe3.asd3('param3_using_#var'); 
end; 

而ODI变量将被成功替换为值秒。

相关问题