转换所有选定的列 to_char

Convert all selected columns to_char

我在外部程序(Pentaho 数据集成 (PDI))中使用 oracle SQL 查询。 在继续使用它们之前,我需要将所有列转换为字符串值。

我正在寻找的是自动应用

select to_date(col1), to_date(col2),..., to_date(colN) from example_table; 

到所有列,这样您最多可以换行此语句:

select * from example_table;

所有列都会自动转换。

解释:我需要这个,因为在获取未转换的 DATE 列时,PDI 似乎无法正常工作。由于我有动态查询,我不知道 DATE 列是否存在,只是想将所有列转换为字符串。

编辑

由于查询各不相同,而且我有一长串查询作为输入,我正在寻找一种更通用的方法,而不仅仅是在每一列的前面手动编写 to_char()。

select TO_CHAR(*) from example_table;

您不应在生产代码中使用 *,这是一种糟糕的编码习惯。您应该明确提及要获取的列名。

此外,TO_CHAR(*) 没有意义。您如何将 date 转换为 string?您必须使用正确的 格式模型 .

总而言之,使用一个好的文本编辑器最多需要一两分钟来列出列名称。 =12=]

我无法想象一个不知道实际数据类型的应用程序,但如果您真的想自动 (gi) 自动将所有列转换为字符串,我在 Oracle 中看到两种可能性:

  • 如果您的应用程序语言允许您指定绑定类型,您只需将所有输出变量绑定到一个字符串变量即可。 Oracle 驱动程序负责将所有类型转换为字符串,例如 jdbc (Java).
  • 如果(看起来)您的应用程序语言不允许第一个解决方案,我能想到的最好方法是为每个 select 定义一个视图,并使用适当的 TO_CHAR 次转化,然后 select 从视图中。这些视图最终也可以从 table 存储库 (user_table) 中自动生成,其中包含一些 PL/SQL.

另请注意,TO_CHAR 将根据会话的 NLS 设置转换您的列,这可能会导致不需要的结果,因此您可能还希望始终指定转换方式:

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL;

使用这 2 个 table,您可以编写一个过程来查看每个 table 上的列,然后根据当前数据类型[=12] 执行适当的 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
        ...

如果您正在 PDI 中寻找解决方案,您需要创建一个作业 (.kjb),在其中进行 2 次转换。 第一个 .ktr 将重建查询,第二个 .ktr 将执行新查询。

1.第一次转换: 重建查询

  • 阅读来源 Table 步骤 中的列(在您的案例中使用 Table 输入步骤)。编写查询 select * from example_table; 并将行限制为 0 或 1。这里的想法不是获取所有行而是重新创建查询。
  • 使用元结构步骤得到table的元结构。它将为您获取来自上一个的列列表。步骤.
  • 在 Modified JavaScript 步骤中,使用一小段代码检查列的数据类型是否为 Date 然后连接 to_Char(列)到行。
  • 最后将变量分组并设置为一个变量。

这是自动为您重新创建字段的位置。现在下一步是使用新查询执行此字段。

2。第二次转换: 在下一步中使用这个设置变量来得到结果。 ${NWFIELDNAME} 是你在上面的转换中用修改后的列设置的变量。

希望这对您有所帮助:)

我已将第一个 ktr 的代码放入 gist here