如何在使用变量的函数中使用months_between(PL-SQL)

时间:2016-06-23 14:05:46

标签: oracle plsql

我正在尝试使用months_between函数来计算年龄并使用INTO将其分配给变量。但是我总是得到ora-00907错误。我在下面看到的代码有什么问题?谢谢。

CREATE OR REPLACE FUNCTION AGE_MOCKER (CUSTOMER_ID VARCHAR2)
   RETURN VARCHAR2
IS
   V_BIRTHDATE   DATE;
   V_AGE         NUMBER;
BEGIN

   V_AGE := 0;

   SELECT BIRTHDATE INTO V_BIRTHDATE  FROM CUSTOMER_ALL;

   SELECT FLOOR (
             MONTHS_BETWEEN (
                SYSDATE,
                  TO_DATE (TO_CHAR (V_BIRTHDATE, 'DD.MM.YYYY'), 'DD.MM.YYYY')
                / 12)   INTO V_AGE
     FROM DUAL;


     IF V_AGE >30
     THEN
     RETURN 'YOU ARE SO OLD'
     ELSE
     RETURN 'YOU MAY LIVE'
     END IF;
END AGE_MOCKER;

1 个答案:

答案 0 :(得分:3)

正如错误所说,你错过了一个右括号:

   SELECT FLOOR (
             MONTHS_BETWEEN (
                SYSDATE,
                  TO_DATE (TO_CHAR (V_BIRTHDATE, 'DD.MM.YYYY'), 'DD.MM.YYYY')
                / 12))   INTO V_AGE
---------------------^

但这不对:

TO_DATE (TO_CHAR (V_BIRTHDATE, 'DD.MM.YYYY'), 'DD.MM.YYYY')

V_BIRTHDATE已经是一个日期,因此将其转换为字符串并再次返回日期毫无意义。

您的第一个查询:

   SELECT BIRTHDATE INTO V_AGE FROM CUSTOMER_ALL;

需要通过passed_in CUSTOMER_ID进行过滤;否则,如果存在多个客户,您将获得太多行异常。 (如果传递的ID不存在,您仍然可以获得无数据)。如果这也是表格中的列名称,那么最好将正式参数名称更改为不同的名称,例如使用前缀,以避免范围问题。

您也可以直接从该表中选择:

CREATE OR REPLACE FUNCTION AGE_MOCKER (P_CUSTOMER_ID VARCHAR2)
   RETURN VARCHAR2
IS
   V_AGE         NUMBER;
BEGIN
   SELECT FLOOR (MONTHS_BETWEEN (SYSDATE, BIRTHDATE) / 12) INTO V_AGE
   FROM CUSTOMER_ALL
   WHERE CUSTOMER_ID = P_CUSTOMER_ID;
   IF V_AGE >30
   THEN
      RETURN 'YOU ARE SO OLD';
   ELSE
      RETURN 'YOU MAY LIVE';
   END IF;
END;
/

我也在RETURN电话上添加了缺失的分号。这不需要单独的V_BIRTHDATE变量。您还可以从查询中生成字符串,然后返回该字符串;有很多方法可以做大多数事情......