今天校验数据的时候,在A环境写了一个日期是否合法的校验函数,脚本正常执行,导入B环境,提示日期校验函数错误。分析很久,始终没有找到问题,最后才发现,原来A环境为DB2,B环境为ORACLE。在这两个环境下实现是否为日期的函数差别挺大,下面做一个简单的分析。
DB2环境函数实现如下:
CREATE OR REPLACE FUNCTION "GETISDATE" ( "VI_DATE" VARCHAR(20) )RETURNS INTEGER
SPECIFIC "SQLXXXXXX"
LANGUAGE SQL
NOT DETERMINISTIC
EXTERNAL ACTION
READS SQL DATA
BEGIN
DECLARE V_DATE DATE;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
RETURN 0;
END;
IF LENGTH(VI_DATE) <> 8 THEN
RETURN 0;
END IF;
SET V_DATE = TO_DATE(VI_DATE,'YYYYMMDD');
IF V_DATE IS NULL THEN
SET V_DATE= CURRENT DATE;
END IF;
RETURN 1;
END
RETURNS TYPE : 所创建的函数返回的类型。
SPECIFIC "SQLXXXXXX":为函数指定特定的名称SQLXXXXXX。
DETERMINISTIC: 指定是否每当以相同的一组输入参数执行函数时,都返回相同的结果。 确定性(Deterministic)函数包括数学函数和不依赖于表中数据或变化数据源的函数。
EXTERNAL ACTION: 指定函数对外部程序是否有影响。
READS SQL DATA表示子程序包含读数据的语句,但不包含写数据的语句。另外两种函数与数据库交互方式为CONTAINS,MODIFIES。
DECLARE EXIT HANDLER FOR SQLEXCEPTION:异常处理, 当出现SQL错误的时候,中断程序执行过程,跳出存储过程
ORACLE环境函数实现如下:
CREATE OR REPLACE FUNCTION GETISDATE(VI_DATE IN VARCHAR2)
RETURN INT
IS
RESULT DATE;
BEGIN
RESULT:= TO_DATE(VI_DATE,'YYYYMMDD');
RETURN 1;
EXCEPTION
WHEN OTHERS THEN RETURN 0;
END;