Sql 我可以在ODI的源变量中调用全局变量吗?

Sql 我可以在ODI的源变量中调用全局变量吗?,sql,oracle,oracle-data-integrator,Sql,Oracle,Oracle Data Integrator,我正在尝试构建一个ODI过程,它将从oracle数据库元数据表中获取模式名、db过程名和参数。参数字段包含ODI全局变量的名称 SELECT SCHEMA_NAME VAR_SCHEMA, PROCEDURE_NAME VAR_PROCEDURE, PARAMETER_NAME VAR_PARAMETER FROM SCHEMA-NAME.TABLE_NAME begin null; insert into ak_tst2 values('qwe.asd("param_using_#var"

我正在尝试构建一个ODI过程,它将从oracle数据库元数据表中获取模式名、db过程名和参数。参数字段包含ODI全局变量的名称

SELECT SCHEMA_NAME VAR_SCHEMA, PROCEDURE_NAME VAR_PROCEDURE, PARAMETER_NAME 
VAR_PARAMETER FROM SCHEMA-NAME.TABLE_NAME
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;
源命令的输出如下所示:

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;
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();
?>
此代码在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中的存储过程?

如果从表中选择数据并将结果用作进一步执行的代码,通常不能在其中使用ODI变量。因为对于ODI来说,承认它是一个变量并用一个变量替换它已经太晚了。这对于全局变量和项目变量都是相同的

如果您可以打印+变量_name from?-或%-替换,那么它将起作用。但若@-substitution打印变量名,或者变量在从源代码获取值后显示为最终代码,那个就太晚了。在这种情况下,它仍然是一个纯文本变量

在您的特定情况下,您可以执行以下操作:

在包中声明所有变量,如VAR_ETL_LOAD_DATE。我的意思是所有可能出现在元数据表中的变量。因为场景应该提前知道所有变量。 使用odiRef.getJDBCConnection'SRC'选择并获取?-substitution中的记录。以可执行代码的形式将所有结果收集到java变量中。 例如,源代码可能如下所示:

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;
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();
?>
ODI变量将被值成功替换