我无法理解为什么我的sql函数返回具有相同值的整个表。
任务如下:
创建一个PL / SQL CalculationAge(Person)函数,如果该人已经去世,则该函数返回死亡年份和出生年份之间的差,如果该人已经死亡,则返回当前年份和出生年份之间的差。还活着。本年度应使用DBMS系统时间来确定。 示例:CalculateAlter('Andrea')应该返回24作为结果,而CalculateAlter('Albert')应该返回49。“
我正在使用下表。
Geboren=birth year
Gestorben=year of dead
Geschlecht=gender
gelebt=lived
该函数的代码如下:
create or replace FUNCTION BerechneAlter(n_Name varchar)
RETURN Integer
is
age_result integer;
v_gestorben integer;
v_geboren integer;
Begin
select gestorben, geboren into v_gestorben, v_geboren
from Family
where Family.name = n_Name;
if v_gestorben is Null
then age_result := (2018 - v_geboren);
else
age_result := v_gestorben - v_geboren;
end if;
return age_result;
end;
此函数现在返回正确的值,但不应对表的每一行都执行此操作。
答案 0 :(得分:4)
那是因为您是在查询的上下文中运行它,所以它在每一行都运行并且仅计算Andrea。为了只返回一个结果,您只需要运行一次:
select BerechneAlter('Andrea') from dual;
如果希望它为表中的每一行计算,则使用:
select BerechneAlter(name) from family;
dual
是Oracle中的系统表,用于仅返回查询中的一个结果/值
答案 1 :(得分:2)
@JorgeCampos已经解释了为什么您得到重复的输出行。
让我还建议可以大大简化过程的代码,因此整个逻辑都在查询中执行:
代码:
create or replace FUNCTION BerechneAlter(n_Name varchar)
RETURN Integer
IS
age_result integer;
BEGIN
SELECT
NVL(gestorben, EXTRACT(year from sysdate)) - geboren into age_result
FROM Family
WHERE Family.name = n_Name;
RETURN age_result;
end;