银行 olapdb2 9.7

DB2 Infosphere Warehouse判断日期是否合法

使用的版本为DB2 Infosphere Warehouse V9.7.0.6,搭建的为16节点的集群。
安装了oracle兼容包,可以使用to_date函数。
在进行varchar转date类型的时候使用to_date函数,但数据质量不能保证,经常存在00000000、201406等不合法的日期数值,导致脚本报错。
自定义了一函数,输入两个参数,一个是欲转换的日期,一个是如果日期不合法则返回的日期;返回一个参数,为date类型的值。
处理逻辑为在函数中直接使用to_date函数,成功的话则返回转换后的值,若失败则通过捕捉异常的方式,返回输入的默认值。
函数编写后在单节点的DB2环境下通过编译并执行通过,但在多节点的集群中无法执行,返回动态编译语句无法在多节点环境中使用。
查询相关资料,都说捕捉异常无法在多节点的环境中使用。
请各位大大分享下经验,在DB2多节点的DPF环境中如何判断日期是否合法?
参与13

12 同行回答

lazyscar lazyscar 项目经理 羽实箫恩
你试过了?我是在V10.1 DPF环境下试过才贴给你的。我手头暂时没有V9.7的环境。你的问题在于分区环境的DB ...mdkii 发表于 2014-7-5 15:18 1.我9#的答复是对应6#的2.你这个静态的自定义函数只能作为参考,实际应用还有点局限,例如长度不是8位的(带横杠-或者/斜杠的10位等),或者2...显示全部
你试过了?我是在V10.1 DPF环境下试过才贴给你的。我手头暂时没有V9.7的环境。
你的问题在于分区环境的DB ...
mdkii 发表于 2014-7-5 15:18


1.我9#的答复是对应6#的
2.你这个静态的自定义函数只能作为参考,实际应用还有点局限,例如长度不是8位的(带横杠-或者/斜杠的10位等),或者2014011这种7位的等等。
3.huangdk的指定了BEGIN ATOMIC后是无法再使用错误捕捉的。 收起
银行 · 2014-07-09
浏览2332
huangdk huangdk 数据库架构师 IBM
你试过了?我是在V10.1 DPF环境下试过才贴给你的。我手头暂时没有V9.7的环境。你的问题在于分区环境的DB ...mdkii 发表于 2014-7-5 15:18     顶显示全部
你试过了?我是在V10.1 DPF环境下试过才贴给你的。我手头暂时没有V9.7的环境。
你的问题在于分区环境的DB ...
mdkii 发表于 2014-7-5 15:18



    顶 收起
IT咨询服务 · 2014-07-07
浏览2277
mdkii mdkii 软件开发工程师 bocn
回复  redspr 请仔细浏览问题,你这个解决方案我在提问题的时候就已经描述过不支持了 ...lazyscar 发表于 2014-7-1 11:12 你试过了?我是在V10.1 DPF环境下试过才贴给你的。我手头暂时没有V9.7的环境。你的问题在于分区环境的DB2不支持 compiled SQL PL function...显示全部
回复  redspr

请仔细浏览问题,你这个解决方案我在提问题的时候就已经描述过不支持了 ...
lazyscar 发表于 2014-7-1 11:12


你试过了?我是在V10.1 DPF环境下试过才贴给你的。我手头暂时没有V9.7的环境。
你的问题在于分区环境的DB2不支持 compiled SQL PL function。
我给的这个例子是 inlined SQL PL,应该可以编译通过。 收起
银行 · 2014-07-05
浏览2477
lazyscar lazyscar 项目经理 羽实箫恩
回复 7# huangdk 尝试过了各种静态啊动态啊的写法,但是还是无法实现显示全部
回复 7# huangdk

尝试过了各种静态啊动态啊的写法,但是还是无法实现 收起
银行 · 2014-07-01
浏览2467
lazyscar lazyscar 项目经理 羽实箫恩
回复 6# redspr 请仔细浏览问题,你这个解决方案我在提问题的时候就已经描述过不支持了显示全部
回复 6# redspr

请仔细浏览问题,你这个解决方案我在提问题的时候就已经描述过不支持了 收起
银行 · 2014-07-01
浏览2494
mdkii mdkii 软件开发工程师 bocn
为啥要用 catch exception的方式判断日期。这样效率太低了。给你贴个网上现成的。CREATE FUNCTION ISDATE(yyyymmdd VARCHAR(8))RETURNS INTEGERLANGUAGE SQLCONTAINS SQLDETERMINISTICNO EXTERNAL ACTIONRETURNCASE  WHEN TRANSLATE(yyyymmdd, '*', ' 0123456...显示全部
为啥要用 catch exception的方式判断日期。这样效率太低了。
给你贴个网上现成的。
CREATE FUNCTION ISDATE(yyyymmdd VARCHAR(8))
RETURNS INTEGER
LANGUAGE SQL
CONTAINS SQL
DETERMINISTIC
NO EXTERNAL ACTION
RETURN
CASE
  WHEN TRANSLATE(yyyymmdd, '*', ' 0123456789') = '' THEN
  CASE
    WHEN SUBSTR(yyyymmdd,1,4) BETWEEN '0001' AND '9999'
     AND SUBSTR(yyyymmdd,5,2) BETWEEN '01' AND '12'
     AND INT(SUBSTR(yyyymmdd,7,2)) BETWEEN 1
     AND DAY(DATE(CHAR(INSERT(SUBSTR(yyyymmdd,1,6),5,0,'-')||'-01',10)) + 1 MONTH - 1 DAY)
    THEN 1
  ELSE 0
  END
ELSE 0
END
@ 收起
银行 · 2014-07-01
浏览2528
huangdk huangdk 数据库架构师 IBM
BEGIN ATOMIC试试显示全部
BEGIN ATOMIC

试试 收起
IT咨询服务 · 2014-06-27
浏览2450
redspr redspr 数据库管理员 北京普远天成科技有限公司
回复 5# lazyscar     正常值直接转date类型,捕捉失败的报错,转默认日期显示全部
回复 5# lazyscar


    正常值直接转date类型,捕捉失败的报错,转默认日期 收起
互联网服务 · 2014-06-27
浏览2584
lazyscar lazyscar 项目经理 羽实箫恩
回复 3# redspr 你指的是编写一个先判断长度、再判断前四位年、再判断中间2位月是否在1-12,再判断日在不同月是否超过28、30或31?或者还有其他判断?先不说这样写是否代码复杂,二来的话是否效率也会是个问题。...显示全部
回复 3# redspr

你指的是编写一个先判断长度、再判断前四位年、再判断中间2位月是否在1-12,再判断日在不同月是否超过28、30或31?
或者还有其他判断?
先不说这样写是否代码复杂,二来的话是否效率也会是个问题。 收起
银行 · 2014-06-27
浏览2484
lazyscar lazyscar 项目经理 羽实箫恩
回复 2# huangdk SQL0390N编译型SQL函数在分区数据库环境中不受支持。类似于这个 判断是否日期的函数CREATE FUNCTION ISDATE(p_date varchar(10))RETURNS INTLANGUAGE SQLBEGIN  -- 错误标志  DECLARE v_result INT;  DECLARE v_date&nbs...显示全部
回复 2# huangdk

SQL0390N
编译型SQL函数在分区数据库环境中不受支持。

类似于这个 判断是否日期的函数
CREATE FUNCTION ISDATE(p_date varchar(10))
RETURNS INT
LANGUAGE SQL
BEGIN
  -- 错误标志
  DECLARE v_result INT;
  DECLARE v_date  DATE;
  -- 定义错误处理
  -- 如果发生错误,继续处理
  -- 但是把标志位设置为 0
  DECLARE CONTINUE HANDLER
  FOR
  SQLEXCEPTION SET v_result=0;
  -- 错误标志,首先设置为正常.
  SET v_result = 1;
  SET v_date = TO_DATE(p_date, 'YYYY-MM-DD');
  return v_result;
END
@ 收起
银行 · 2014-06-27
浏览2541

提问者

lazyscar
项目经理 羽实箫恩
评论9

相关问题

相关资料

问题状态

  • 发布时间:2014-06-25
  • 关注会员:1 人
  • 问题浏览:10744
  • 最近回答:2014-07-09
  • X社区推广