【问题标题】:Pentaho Kettle yells SQL Script error that Oracle doesn'tPentaho Kettle 大喊 Oracle 没有的 SQL 脚本错误
【发布时间】:2021-10-28 21:00:14
【问题描述】:

我有一个执行几十个 SQL 查询任务的 ETL 进程。

一个特别是不断向我的一个查询抛出错误:"ORA-01843: not a valid month",但是同样的查询在 PL/SQL 上正常运行。我什至用相同查询的版本创建了一个过程,它运行也很顺畅,但是从 pentaho 调用这个过程总是抛出同样的错误。请问,有人知道为什么 pentaho 会出现 PL/SQL 没有的查询错误吗?提前致谢!

【问题讨论】:

  • 我觉得是工具问题。一些工具是宽容的,可以毫无错误地转换日期/时间/数字等。有些工具很敏感。我建议请正确转换为日期,不要依赖自动转换。如果这没有帮助,那么数据可能有错误的日期格式。
  • 可能不同的 NLS 设置。或者你的存储过程初始化 NLS 环境,而 Kettle 没有
  • 使用date/timestamp literal而不是看起来像日期的字符串,一切都应该没问题
  • PL/SQL 是一种编程语言。你是说桌面工具PL/SQL Developer
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: sql oracle etl pentaho kettle


【解决方案1】:

如果你这样做:

SELECT TO_DATE('01-FEB-03', 'DD-MON-RR') FROM DUAL;

然后,在具有默认设置的英文数据库上,查询工作

然后你改变你的会话设置:

ALTER SESSION SET NLS_DATE_LANGUAGE = 'FRENCH';
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-RR';

并运行相同的查询:

SELECT TO_DATE('01-FEB-03', 'DD-MON-RR') FROM DUAL;

你会得到错误:

ORA-01843: not a valid month

对此有三种解决方案:

  1. 对两个查询使用相同的设置 - 这不是一个可靠的解决方案,因为您可以为某些服务指定设置,然后它会工作一段时间,但随后新开发人员出现并连接新服务并且不知道所需的设置,突然一切都坏了。

  2. 指定要在查询中使用的设置。

    SELECT TO_DATE(
             '01-FEB-03',
             'DD-MON-RR',                -- Specify the format
             'NLS_DATE_LANGUAGE=English' -- Specify the language
           )
    FROM DUAL;
    
  3. 使用日期文字(与设置无关):

    SELECT DATE '2003-02-01' FROM DUAL;
    

db小提琴here

【讨论】:

  • 嗨!你是对的,这解决了问题。在我的方法中,由于简单,我使用了第一个选项,因为我可以配置水壶连接以自动设置每个连接的 NLS 参数,这比更改大量查询和文档更快,应该避免将来出现问题。非常感谢您的帮助!
  • @FagnerRotter 请 (1) 记录所有内容,以便新开发人员知道您做了什么以及为什么; (2) 在未来的查询中开始实施选项 #2 或 #3,这样您就不会不断增加技术债务,在某些时候,您将不得不投入时间和精力来“修复”更多强大的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
相关资源
最近更新 更多