【问题标题】:Overlap function in OracleOracle 中的重叠函数
【发布时间】:2014-04-29 13:36:35
【问题描述】:

我正在写一个包来学习Oracle。我想创建一个OVERLAP 函数来检查两个日期范围是否相互重叠。

  FUNCTION OVERLAP(p_START_DATE_1 DATE, p_END_DATE_1 DATE,
   p_START_DATE_2 DATE, p_END_DATE_2 DATE) RETURN VARCHAR2 AS

   lv_RESULT VARCHAR2(1);
  BEGIN 

   lv_RESULT := SELECT 'T' AS overlap FROM dual
       WHERE (p_START_DATE_1, p_END_DATE_1) overlaps (p_START_DATE_2, p_END_DATE_2);

   IF (lv_RESULT = 'T')
     RETURN 'T';

   RETURN 'N';

  END OVERLAP;

我尝试执行我的函数,但收到错误ORA-04063: package body 'XYZ' contains errors...

SELECT KP_XYZ_PACKAGE_SQL.OVERLAP(
       TO_DATE('01/01/2014', 'DD/MM/YYYY'),
       TO_DATE('01/12/2014', 'DD/MM/YYYY'),
       TO_DATE('01/02/2014', 'DD/MM/YYYY'),
       TO_DATE('01/05/2014', 'DD/MM/YYYY'))
FROM DUAL;

我认为SELECT 工作正常。但是错误发生在这里(我想):lv_RESULT := SELECT...。为什么?

【问题讨论】:

  • 如果您尝试学习 Oracle,为什么要从未记录的特性开始?

标签: sql oracle oracle11g


【解决方案1】:

试试这个:

CREATE OR REPLACE FUNCTION OVERLAP(p_START_DATE_1 DATE, p_END_DATE_1 DATE,
   p_START_DATE_2 DATE, p_END_DATE_2 DATE) RETURN VARCHAR2 AS

   lv_RESULT VARCHAR2(1);
  BEGIN 
       lv_RESULT := 'N';      

       SELECT 'T' into lv_RESULT FROM dual
           WHERE (p_START_DATE_1, p_END_DATE_1) overlaps (p_START_DATE_2, p_END_DATE_2);

   IF (lv_RESULT = 'T') THEN
     RETURN 'T';
   END IF;

   RETURN 'N';

  END OVERLAP;

IF 语句也不完整 - THEN 和 END IF 丢失了,我现在已经添加了。

SELECT INTO 语句的文档是 here。页面末尾有示例链接。

【讨论】:

  • 还是同样的问题:S
  • IF 语句不正确。我现在已经修改了查询。
  • 这里有更多信息:perumal.org/overlaps-predicate OVERLAPS 函数似乎没有文档记录,因此不建议使用。
  • 咬我的朋友! :-)
【解决方案2】:

更正的版本:返回 'T' 表示 True 'N' 表示 False (?)

CREATE OR REPLACE FUNCTION OVERLAP(p_START_DATE_1 DATE, p_END_DATE_1 DATE,
    p_START_DATE_2 DATE, p_END_DATE_2 DATE) RETURN VARCHAR2 AS

  lv_RESULT VARCHAR2(1);

 BEGIN 
    SELECT 'T' into lv_RESULT FROM dual WHERE (p_START_DATE_1, p_END_DATE_1) overlaps (p_START_DATE_2, p_END_DATE_2);
 RETURN lv_RESULT;

  EXCEPTION
      WHEN NO_DATA_FOUND THEN lv_RESULT := 'N'; 
  RETURN lv_RESULT;

END OVERLAP;
/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多