我在外部程序(Pentaho Data Integration(PDI))中使用oracle SQL查询。 在继续使用它们之前,我需要将所有列转换为字符串值。
我正在寻找的是自动应用
的东西select to_date(col1), to_date(col2),..., to_date(colN) from example_table;
到所有列,以便您最多可以包装此语句:
select * from example_table;
并自动转换所有列。
解释:我需要这个,因为PDI在获取未发布的DATE列时似乎无法正常工作。由于我有动态查询,我不知道是否存在DATE列,只是想将所有列转换为字符串。
修改
由于查询各不相同,因为我有一个很长的列表作为输入,我正在寻找一种更通用的方法,而不仅仅是手动编写每列的to_char()。
答案 0 :(得分:2)
从example_table中选择TO_CHAR(*);
您不应在生产代码中使用*
,这是一种糟糕的编码习惯。您应该明确提到要获取的列名称。
此外, TO_CHAR(*)毫无意义。如何将日期转换为字符串?您必须使用正确的格式模型。
总之,使用优秀的文本编辑器列出列名称最多需要一两分钟。
答案 1 :(得分:2)
如果您正在寻找PDI中的解决方案,则需要创建一个作业(.kjb),在其中进行2次转换。 首先.ktr 会重建查询,秒.ktr 会执行新查询。
<强> 1。第一次转型:重建查询
select * from example_table;
并将行限制为0或1.这里的想法不是获取所有行,而是重新创建查询。这是自动为您重新创建字段的点。现在,下一步是使用新查询执行此字段。
<强> 2。第二次转换:在下一步中使用此set变量来获取结果。 ${NWFIELDNAME}
是您在上述转换中使用修改后的列设置的变量。
希望这会有所帮助:)
我已将第一个ktr的代码放在gist here中。
答案 2 :(得分:1)
我不能想象一个不了解实际数据类型的应用程序但是如果你真的想要自动化(gi)将所有列转换为字符串,我在Oracle中看到两种可能性:
另请注意,TO_CHAR会根据会话的NLS设置转换您的列,这可能会导致不需要的结果,因此您可能还希望始终指定如何转换:
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL;
答案 3 :(得分:1)
使用这两个表,您可以编写一个过程,查看每个表上的列,然后根据当前数据类型执行相应的TO_CHAR
select * from user_tab_columns
select * from user_tables
伪造的代码
begin
loop on table -- user_tables
loop on column -- user_tab_columns
if current data_type = DATE then
lnewColumn = TO_CHAR(oldColumn...(
elsif current data_type = NUMBER then
...