我正在尝试使用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;
答案 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
变量。您还可以从查询中生成字符串,然后返回该字符串;有很多方法可以做大多数事情......