要求从CSV文件中提取数据,然后将其转换为XML以最终加载到目标中。
CSV文件中的数据是
Number,Email,Email Communication,Member Type,VIN
85320000399,test@hotmail.com,TRUE,CANLAN,TEST
81890000887,test@hotmail.com,TRUE,CANLAN,TEST
85480001175,xx@live.ca,TRUE,CANLAN,TEST
85370001847,abc@hotmail.com,TRUE,CANLAN,TEST
85500000418,123ftremblay.ca,TRUE,CANLAN,TEST
XML格式
<MemberUpdate>
<MemId>85320000399</MemId>
<emailAddress>test@gmail.com</emailAddress>
<optInFlag>true</optInFlag>
<memberType>CANLAN</memberType>
</MemberUpdate>
POSQTGRESQL表列是XML数据类型
我创建了一个转换来执行上述操作,但是我收到了错误。
ERROR: column "content" is of type xml but expression is of type character varying.
Hint: You will need rewrite or cast the expression.
当我将表数据类型更改为&#34;字符变化&#34;时转换成功运行在我的本地数据库中。但我想在不对数据库进行任何更改的情况下执行此操作。因为我们无法对&#34; Prod数据库进行任何更改。&#34;我正在寻找一种方法来转换由&#34; ADD XML&#34;生成的xml字符串输出。转换为实际的XML。
答案 0 :(得分:2)
所以这就是我做了什么我从&#34;表输出中删除了XML列&#34;然后我添加了一个&#34;阻止这个步骤直到步骤完成&#34;转换以等待目标加载所有列(期望XML)。然后我用了一个&#34;执行SQL脚本&#34;我在其中运行以下脚本
UPDATE workflow_transaction SET content_data = ('?' ::xml) where workflow_transaction_id = ?
此处更新通过将ADD XML步骤中的字符串输出转换为实际XML来更新表并将值插入XML列。
我不太清楚我的回答有多正确,但我使用样本数据得到了理想的结果。可能会或可能不会有未来的复杂情况,但它现在服务于我的目的。 :)
答案 1 :(得分:0)
您无法在数据库中使用XML数据类型,因为PDI不理解它。仅使用varchar或text。
答案 2 :(得分:0)
获得结果的另一种有效方法是通过消除“表输出”和“阻止”步骤,而不是在执行SQL脚本转换中使用插入脚本将数据加载到目标中。插入脚本应该是这样的
INSERT INTO workflow_transaction列(workflow_transaction_id,content_data) 价值观(?,'?');
注意:使用insert脚本,我们不需要专门将输入数据类型转换为xml。