从 Oracle 函数返回数据
本文关键字:数据 返回 函数 Oracle | 更新日期: 2024-11-05 22:03:51
嗨,我在 Oracle 中创建以下函数。我必须将 date-1 和 date-2 参数传递给函数,该函数应该将另一个日期返回给我。
请参阅下面的代码。
create or replace function GETD(p_d1 in date,
p_d2 in date ) return DATE
as
l_result DATE;
begin
SELECT EDIT_Date into l_result FROM qa.employees WHERE qa.employee_join_date BETWEEN TO_DATE(p_d1, 'MM/DD/YYYY') AND TO_DATE(p_d2, 'MM/DD/YYYY') AND ROWNUM <= 1
;
return l_result;
end;
我执行如下函数
SELECT GETD('27-JUN-12','28-JUN-12') FROM DUAL
函数被编译,在 im 传递参数以执行函数时,我收到以下错误"不是有效的月份"。有人可以告诉我我哪里出了问题
吗谢谢贾斯汀
首先,您不应该对日期变量调用TO_DATE
。 如果这样做,则强制 Oracle 首先使用会话的NLS_DATE_FORMAT
将日期转换为字符串,然后使用指定的格式掩码将字符串转换回日期。 如果您的NLS_DATE_FORMAT
碰巧与指定的格式掩码不匹配(并且由于NLS_DATE_FORMAT
由客户端控制,因此某些用户和会话将不可避免地具有不同的日期格式),您将收到错误。
假设您的意图只是忽略任何时间组件,您应该改用 trunc
函数。
create or replace function GETD(p_d1 in date,
p_d2 in date )
return DATE
as
l_result DATE;
begin
SELECT EDIT_Date
into l_result
FROM qa.employees
WHERE qa.employee_join_date BETWEEN trunc(p_d1) AND trunc(p_d2)
AND ROWNUM <= 1;
return l_result;
end;
rownum <= 1
条件的存在似乎有点奇怪 - 您似乎不太可能真的想从表中获取与employee_join_date
条件匹配的任意行。 不知道要求,您似乎可能想做一些确定性的事情来获取具有最小(或最大)edit_date
的行。
其次,调用函数时,应传入DATE
参数,而不是传入字符串并让 Oracle 使用会话的NLS_DATE_FORMAT
将字符串隐式转换为日期。 如果使用日期文本
SELECT GETD(date '2012-06-27', date '2012-06-28')
FROM DUAL
或使用TO_DATE
将字符串显式转换为日期
SELECT GETD(to_date('27-JUN-12', 'DD-MON-RR'), to_date('28-JUN-12', 'DD-MON-RR'))
FROM DUAL
然后,无论客户的NLS_DATE_FORMAT
如何,您的呼叫都将有效。