DataStage 调用存储过程(含输入输出参数)

浏览: 4496

版本:IBM InfoSphere DataStage V11.3.1

操作系统:linux redhat 6.4

需求场景:

DS调度数据库中存储过程,需要带入输入输出参数。

环境准备:

数据准备

数据库账户:scott  创建存储过程名 getSalaryByEmpNo  

CREATE OR REPLACE PROCEDURE getSalaryByEmpNo(eNo    IN NUMBER,
salary OUT NUMBER) AS
BEGIN
SELECT SAL INTO salary FROM EMP WHERE EMPNO = eNo;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;

DS环境变量配置

配置scott用户的环境变量

Clipboard Image.png
开发过程

1 创建作业如下

Clipboard Image.png

2 定义输入变量值 V_eNo

Clipboard Image.png

3 设置存储过程的连接信息

 设置存储过程属性,选择存储过程类型为Source(表示作为源),在Syntax属性栏手工设置输入参数pa的值为1,输出参数pb用:1作为占位符,表示将存储过程的结果输出到后续的DataStage组件(Peek)。

Clipboard Image.png

4 定义输出变量salary

Clipboard Image.png

5 调用 手工输入参数 V_eNo  

一般这个参数,我们可以写shell 脚本来获取,之前有些过文章。

Clipboard Image.png

Clipboard Image.png

6 查看日志

运行作业,日志显示存储过程getSalaryByEmpNo被DataStage调用,并输出正确结果。

Clipboard Image.png


关于Stored Procedures官网一些介绍:

关于 Stored Procedures 阶段

Stored Procedures 阶段支持三种过程类型:

  • 变换过程
  • 源过程
  • 目标过程

源过程和目标过程将列元数据用作参数以传入过程中。您不必输入参数信息,如果输入了此信息,该阶段会将其忽略。 源过程将列元数据用作输出参数(以从数据库中读取)。 目标过程将列元数据用作输入参数(以写入数据库)。

注: 源过程和目标过程不能同时具有输入和输出链接。必须使用变换过程。

源过程能够执行包含 SQL SELECT 语句的存储过程。它可以:

  • 针对作业调用一次
  • 与输出链接一起使用
  • 返回输出参数
  • 返回多行

目标过程能够执行包含 SQL INSERT 语句的存储过程。它可以:

  • 针对作业调用一次
  • 针对每行调用一次(缺省值)
  • 与输入链接一起使用
  • 传递输入参数

如果希望将参数与列元数据混合并匹配, 请使用变换过程,并在参数网格中指定存储过程参数。

变换过程在数据库中执行各种逻辑决策。它可以:

  • 针对作业调用一次
  • 针对每行调用一次(缺省值)
  • 使用参数网格传递输入参数
  • 使用参数网格返回输出参数
  • 如果在作业过程当中使用(输入和输出链接),那么传递列
  • 仅与输入链接一起使用
  • 仅与输出链接一起使用
  • 与输入链接和输出链接一起使用
  • 返回多行

所有过程都可以:

  • 返回可映射到数据流的错误代码(由用户定义或通过数据库定义)
  • 返回可映射到数据流的消息(由用户定义或通过数据库定义)
  • 允许用户定义的致命和警告代码恢复决策
  • 定义事务隔离级别
  • 当执行插入行的过程时,允许指定提交大小
  • 允许用户定义的过程执行语句(不常用)
  • 允许在读取时返回多行注: Stored Procedures 阶段不执行任何 SQL 语句。 它专用于存储过程的执行。本机阶段用于任何 SQL 语句的执行。

Teradata

通过使用 Stored Procedure 阶段,可以从 InfoSphere® DataStage® 作业调用 Teradata 存储过程、宏和函数。 不能从 InfoSphere DataStage 创建 Teradata 存储过程、宏或函数。应该使用 Teradata 自有的用户接口,如 BTEQ 或 Teradata SQL Assistant(在 Teradata Tools and Utilities 7.0 之前称为 Queryman),创建这类对象。

SQL Server

存储过程是一组 Transact-SQL 语句,这些语句被编译成单个执行计划,使用一个名称进行存储并作为一个单元来处理。

Stored Procedure 阶段支持调用 Microsoft SQL Server 存储过程(内部和外部)和返回单一值的用户定义的函数。

注: 返回表的用户定义的函数更适合从 ODBC 阶段调用,这是因为生成的 SELECT 语句必须查询表。

支持标量用户定义的函数。不支持将全局游标和使用游标变量的输出参数用作返回数据的方法。

Microsoft SQL Server 存储过程支持输入和输出参数。

总结:

多思考,多实践。


后续:

对于

begin

-- Call the procedure

sp_fct_capitalsource(v_date => :v_date,

v_return => :v_return);

end;

调度如附件

推荐 3
本文由 我是最优雅的杀手,不杀人专杀狗 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

7 个评论

大神,有3个小问题想请教一下(最近在做调用DB2的存储过程,老是调用失败)
1、看操作里没有将存储过程导入的步骤,请问导入存储过程是怎样的功能,可以不用导入吗?
2、设置存储过程属性的时候,您选择的是存储过程类型为Source(表示作为源),可不可以设置targert以及 转换,这个存储过程类型是怎么使用的?
3、输出参数用:1作为占位符,这个是必须的吗?目前我没有设置,默认的问号
1.导入存储过程,其实和表结构导入一样,只是为了方便我们从DS里面获取所要的信息。当然也可以不用导入,像我文章中就没有导入,直接在 Procedure call syntax 下面写执行存储脚本。
2.设置为变换过程或者目标过程 是依据 你开发的作业来设定的。你参考下面内容:
源过程和目标过程将列元数据用作参数以传入过程中。您不必输入参数信息,如果输入了此信息,该阶段会将其忽略。 源过程将列元数据用作输出参数(以从数据库中读取)。 目标过程将列元数据用作输入参数(以写入数据库)。

注: 源过程和目标过程不能同时具有输入和输出链接。必须使用变换过程。

3 :1作为占位符是必要的,是为了做让DS知道有输出参数。

你出错的问题可以截图发出来,我帮你看一下。你检查下1: Database Vendor 是否选了DB2, 2:确定下数据库中单独调度存储是否有问题。3:可以先不要输出参数。
每次报错Error occurred in call to ORPHCallActiveplugInitialize() ,还有我每次导入存储过程,都失败,导入时候需要传参,我输入了占位符。
1.针对报错Error occurred in call to ORPHCallActiveplugInitialize() 你查看下 你定义输出变量类型是什么?DS里面不支持输出类型是NVARCHAR2. 否则报错,你可以定义为VARCHAR.
2.没必须要导入存储过程,如果要导入,比如两个参数,你输入1,2 中间用逗号隔开即可。

报错信息,前面的预警信息,也需要关注。最好把详细日志发出来。
导入存储过程,传参 对于输入参数 填'#V_eNo#' (V_eNo 是你定义的变量名称) 输出参数填,:1 (占位符) 用逗号隔开。参照https://ask.hellobi.com/blog/Zeehom/4432
因为这里传不了图片,我上班地方又不能上网,所以有照片也不行,前面有一条警告是 Unknown client Library -DB2 ,网上查了很多资料要环境变量DBinstance_LD_library_path ,但是我 作业配置的有环境变量DBinstance ,LD_library_path ,是分开的,不知道什么回事 ,另外,DS服务器上面没有安装DB2客户端
导入我成功了

要回复文章请先登录注册