6

我正在考虑使用 RCP 来运行一个通用的 datastage 作业,但是每次调用它时初始 SQL 都会发生变化。是否有一个过程可以使用用户活动变量从文本文件或其他东西中注入 SQL,以便我可以使用相同的数据阶段?

我知道这个例程可以读取文件来查找参数:

Routine = ‘ReadFile’
vFileName = Arg1
vArray = ”
vCounter = 0
OPENSEQ vFileName to vFileHandle
Else Call DSLogFatal(“Error opening file list: “:vFileName,Routine)
Loop
While READSEQ vLine FROM vFileHandle
vCounter = vCounter + 1
vArray = Fields(vLine,’,’,1)
vArray = Fields(vLine,’,’,2)
vArray = Fields(vLine,’,’,3)
Repeat
CLOSESEQ vFileHandle
Ans = vArray
Return Ans

但这是否意味着我只将 SQL 存储在单行中,即使它很长?谢谢。

4

3 回答 3

2

为什么不在例程本身中包含 SQL 并传播参数?

我在一个例程中有多个查询(一个用于源代码,一个用于 AfterSQL 语句)

这是一个例子,很抱歉我在手机上回答这个问题!

InputCol=Trim(pTableName)

If InputCol='Table1' then column='Day'
If InputCol='Table2' then column='Quarter, Day'

    SQLCode = ' Select Year, Month, '
    SQLCode := column:", Time, "
    SQLCode := " to_date(current_timestamp, 'YYYY-MM-DD HH24:MI:SS'), "
    SQLCode := \ "This is example text as output" \
    SQLCode := "From DATE_TABLE"

    crt SQLCode

我在上面的例子中使用了多重封装,当传递给一个参数时,请确保你检查 ', " 要么被转义,要么正确显示

再次为质量道歉,但我希望它能给你一些想法!

于 2016-05-25T20:13:25.613 回答
1

你可以试试这个

  1. 正如您所提到的,将 SQL 维护在一个文件中(同样,如果 SQL 不断变化,您需要构建一个逻辑来自动填充新的 SQL)

  2. 在 Datastage Sequencer 中,使用执行命令活动打开 SQL 文件,例如:cat /home/bk/query.sql

  3. 在调用你的通用工作的工作活动中。您应该将 EC 活动的命令输出映射到作业参数

因此,如果 EC 活动名称为 exec_query ,则作业参数将为

            exec_query.$CommandOuput
  1. 当您运行序列时,您的查询将从

    SQL 文件--> EC 活动--> 作业活动中的参数--> DB 阶段(查询参数化)

于 2016-06-25T18:36:14.427 回答
1

您是否想过调用一个连接到数据库并从顺序作业执行 SQL 脚本的 shellscript?您可以使用 sqlplus 在 shellscript 中连接并使用 SQL 读取文件并使用它。要从顺序作业执行 shellscript,请使用 ExecCommand Stage (sh, ./, ...),它取决于解释器。

解决这个问题的其他方法,取决于你的 SQL 的修改程度;您可以调用处理参数并调用并行作业的例程库。

我认为您可能遇到的主要问题是可以存储参数的变量的 long 的限制。

告诉我您选择什么选项,我可以为您提供更多帮助。

于 2016-10-17T15:27:27.967 回答