PX转换例程编译问题

问题描述 投票:0回答:2

我有一个用C ++编写的转换器例程,该例程设置为清除所有空白并在输入字符串为null或为空的情况下映射为一个值。 C ++代码已编译并且已经正确测试,但是我无法使例程在Datastage中工作。

按照说明,我已经复制了DS环境中的编译器选项,如下所示。

g++ -c -O -fPIC -Wno-deprecated -m64 -mtune=generic -mcmodel=small BlankToValue.cpp
g++ -shared -m64 BlankToValue.so BlankToValue.o

但是在工作中测试例程时,出现以下错误。

Sequential_File_36,0:内部错误:(shbuf):iomgr / iomgr.C:2649

我应该使用其他选项进行编译吗?

c++ datastage
2个回答
0
投票

威廉,

在指向该自定义函数的DataStage例程定义中,您是否选择例程类型作为对象(。o在运行时编译到转换器阶段的文件)或库(lib。so文件,在作业运行时加载,但对库命名约定有要求,并且该库位于库路径中)。上面的代码建议您创建一个* .so文件,但不要以lib为前缀。这是一个例子:https://www.ibm.com/support/pages/node/403041

另外,如果作业日志中的第一个错误不是库加载错误,而是内部错误(shbuf)错误,我发现过去使用自定义例程已经发生了几种情况:

  1. 自定义例程与您一样,都涉及空处理,并且在我们的产品中更改了空处理规则后,升级到Information Server 8.5后开始失败。更改说明如下:https://www.ibm.com/support/pages/node/433863您可以通过使用新的作业级别环境变量运行作业来测试这是否是问题:APT_TRANSFORM_COMPILE_OLD_NULL_HANDLING = 1

  2. 在另一种情况下,自定义例程中的shbuf错误是转换器阶段接收到大记录(大于自定义例程中定义的数据类型可以处理的记录)的结果。当仅使用单个样本输入记录且所有字符串类型字段中的值都较小时,作业是否仍会失败?

谢谢。


0
投票

另外,我注意到错误是来自顺序文件阶段,而不是使用自定义例程的转换器阶段。因此,可能还需要考虑自定义例程的输出数据类型是什么,并确保它以有效值退出,该有效值对于数据类型来说不要太大,并且也不要大于阶段之间使用的默认传输缓冲区大小(默认为128k)。

© www.soinside.com 2019 - 2024. All rights reserved.