我在创建函数时遇到了麻烦..
我希望该功能能够找到特定帐户在特定日期的租金。
该函数需要2个参数rentacc(number)和rentdate(varchar2)
create or replace function get_rent(rentacc in number,rentdate in varchar2)
return number
as
atype number :=rentacc
begin
if atype =1
then
select "RATE" from "RENTCHANGE" where TO_DATE(rentdate, 'YYYY-MM-DD') >= TIME or TO_DATE(rentdate, 'YYYY-MM-DD') <=TIME;
else return -1;
end if;
end get_rent;
这是我的table rentchange
ID ACOUNT RATE TIME
---------- ---------- ---------- ----------
123 1 ,58 2013-07-09
124 1 ,69 2013-09-02
125 1 1,78 2013-10-07
126 1 2,7 2013-10-17
select function_name(1,20131010)
from dual;
将返回
function_name
-------------------------
1,78
如果有人有任何建议我会很感激。 感谢。
答案 0 :(得分:2)
您的问题很混乱,因为您的示例数据和您的函数使用不同的列名等。
无论如何,这是一个SQL语句,可以帮助您了解如何修改函数中的查询:
with rentchange as (select 123 id, 1 account, .58 rate, to_date('09/07/2013', 'dd/mm/yyyy') time from dual union all
select 124 id, 1 account, .69 rate, to_date('02/09/2013', 'dd/mm/yyyy') time from dual union all
select 125 id, 1 account, 1.78 rate, to_date('07/10/2013', 'dd/mm/yyyy') time from dual union all
select 126 id, 1 account, 2.7 rate, to_date('17/10/2013', 'dd/mm/yyyy') time from dual)
-- end of mimicking the rentchange table with data in it. See SQL below:
select rate
from (select id,
account,
rate,
time start_time,
lead(time, 1, sysdate) over (partition by account
order by time) end_time
from rentchange)
where start_time <= to_date('10/10/2013', 'dd/mm/yyyy')
and end_time > to_date('10/10/2013', 'dd/mm/yyyy');
RATE
----------
1.78
这使用lead()分析函数来提取有关下一行日期的信息(或者,如果没有下一行,则使用当前时间),然后为您提供可以在其间查询的日期范围。
答案 1 :(得分:0)
这可能是您所需要的,与之前的帖子相比更加简化了!
create or replace function get_ränta(
p_kontotyp in number,
p_datum in varchar2)
return number
is
v_svar number(5,2);
begin
select ränta into v_svar
from ränteändring
where tid = (select max(tid) from ränteändring
where tid <= to_date(p_datum, 'yyyy,mm,dd')
and ktyp = p_kontotyp);
return v_svar;
exception
when no_data_found then
return -1;
end;