首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracel用户定义函数总是返回NULL。

Oracel用户定义函数总是返回NULL。
EN

Stack Overflow用户
提问于 2017-05-25 13:36:51
回答 3查看 124关注 0票数 0

我试图在oracle中编写UDF --返回的部分是基于提供的日期和今天之间的差异。下面是我的代码

代码语言:javascript
复制
SELECT FN_AGE_RANGE('01.01.2017') FROM DUAL;

CREATE OR REPLACE FUNCTION FN_AGE_RANGE(
    SAP_DATE IN VARCHAR2 )
  RETURN VARCHAR2
IS
  ResultVar VARCHAR2(255);
    TheDate DATE;
    TheDiff NUMBER;
  BEGIN
    --convert to date
    SELECT
      CASE
        WHEN SAP_DATE = '00.00.0000'
        THEN NULL
        ELSE to_date(SAP_DATE,'dd.mm.yyyy')
      END
    INTO TheDate
    FROM DUAL;
    --workout date difference
    SELECT sysdate - TheDate
    INTO TheDiff
    FROM DUAL;
    --set the frequency
    SELECT
      CASE
        WHEN TheDiff < -180
        THEN '>6 Months'
        WHEN TheDiff < -90
        THEN '3-6 Months'
        WHEN TheDiff < 0
        THEN '<3 Months'
      END
    INTO ResultVar
    FROM DUAL;
    RETURN(ResultVar);
  END;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-25 13:41:44

在你的代码中

(sysdate - TheDate)是阳性的

代码语言:javascript
复制
SELECT


CASE
    WHEN TheDiff < -180
    THEN '>6 Months'
    WHEN TheDiff < -90
    THEN '3-6 Months'
    WHEN TheDiff < 0
    THEN '<3 Months'
  END
INTO ResultVar
FROM DUAL;

总是返回null

将代码的最后一部分更改为

代码语言:javascript
复制
SELECT


    CASE
        WHEN TheDiff > -180
        THEN '>6 Months'
        WHEN TheDiff > -90
        THEN '3-6 Months'
        WHEN TheDiff > 0
        THEN '<3 Months'
      END
    INTO ResultVar
    FROM DUAL;
票数 2
EN

Stack Overflow用户

发布于 2017-05-25 14:25:51

Vecchiasignora的答案与代码的逻辑有关。但是,我想补充的是,要运行case语句,您不需要SQL,您也可以在PL/SQL中使用该构造。这稍微简化了您的代码。

代码语言:javascript
复制
    CREATE OR REPLACE FUNCTION FN_AGE_RANGE(
        SAP_DATE IN VARCHAR2 )
      RETURN VARCHAR2
    IS
      ResultVar VARCHAR2(255);
        TheDate DATE;
        TheDiff NUMBER;
      BEGIN
        --convert to date
         CASE
            WHEN SAP_DATE = '00.00.0000' THEN NULL;
            ELSE TheDate := to_date(SAP_DATE,'dd.mm.yyyy');
          END CASE;

        --workout date difference
        TheDiff :=  sysdate - TheDate;

        --set the frequency
          CASE
            WHEN TheDiff > 180 THEN ResultVar := '>6 Months';
            WHEN TheDiff > 90  THEN ResultVar := '3-6 Months';
            WHEN TheDiff > 0   THEN ResultVar := '<3 Months';
          END CASE;

        RETURN(ResultVar);
      END;
票数 1
EN

Stack Overflow用户

发布于 2017-05-25 15:32:42

确保case语句涵盖示例集

首先,SAP_DATE的显著值似乎是当SYSDATE大于SAP_DATE时。

例如,当我们有2016年11月1日的日期时,SAP_DATE的年龄应该是6个月。

SAP_DATE大于当前日期时,未定义任何ResultVar。我把这叫做“电流”。

在Oracle中使用case语句时,重要的是要考虑正在执行短路评估,因此第一个为真的布尔表达式将是分配给ResultVar的结果值。

以下是我的修改:

代码语言:javascript
复制
SCOTT@dev>set echo on;
SCOTT@dev>CREATE OR REPLACE FUNCTION FN_AGE_RANGE(
  2      SAP_DATE IN VARCHAR2 )
  3    RETURN VARCHAR2
  4  IS
  5    ResultVar VARCHAR2(255);
  6      TheDate DATE;
  7      TheDiff NUMBER;
  8    BEGIN
  9      --convert to date
 10      SELECT
 11        CASE
 12          WHEN SAP_DATE = '00.00.0000'
 13          THEN NULL
 14          ELSE to_date(SAP_DATE,'dd.mm.yyyy')
 15        END
 16      INTO TheDate
 17      FROM DUAL;
 18      --workout date difference
 19      SELECT sysdate - TheDate
 20      INTO TheDiff
 21      FROM DUAL;
 22      --set the frequency
 23      SELECT
 24        CASE
 25          WHEN TheDiff > 180
 26          THEN '>6 Months'
 27          WHEN TheDiff > 90
 28          THEN '3-6 Months'
 29          WHEN TheDiff > 0
 30          THEN '<3 Months'
 31          WHEN TheDiff <= 0
 32          THEN  'Current'
 33          ELSE NULL
 34        END
 35      INTO ResultVar
 36      FROM DUAL;
 37      RETURN(ResultVar);
 38    END;
 39  /

Function FN_AGE_RANGE compiled

SCOTT@dev>---sample data
SCOTT@dev>-- > 6 months
SCOTT@dev>SELECT FN_AGE_RANGE('01.11.2016') FROM DUAL;
FN_AGE_RANGE('01.11.2016')
>6 Months


SCOTT@dev>-- > 3 months
SCOTT@dev>SELECT FN_AGE_RANGE('01.02.2017') FROM DUAL;
FN_AGE_RANGE('01.02.2017')
3-6 Months


SCOTT@dev>SELECT FN_AGE_RANGE('01.07.2017') FROM DUAL;
FN_AGE_RANGE('01.07.2017')
Current


SCOTT@dev>--> NULL
SCOTT@dev>SELECT FN_AGE_RANGE(NULL) FROM DUAL;
FN_AGE_RANGE(NULL)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44182013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档