PL / SQL函数返回许多值

时间:2018-12-24 17:37:14

标签: sql oracle rdbms

我无法理解为什么我的sql函数返回具有相同值的整个表。

任务如下:

  

创建一个PL / SQL CalculationAge(Person)函数,如果该人已经去世,则该函数返回死亡年份和出生年份之间的差,如果该人已经死亡,则返回当前年份和出生年份之间的差。还活着。本年度应使用DBMS系统时间来确定。   示例:CalculateAlter('Andrea')应该返回24作为结果,而CalculateAlter('Albert')应该返回49。“

我正在使用下表。

Geboren=birth year
Gestorben=year of dead
Geschlecht=gender
gelebt=lived

I´m working with this table.

该函数的代码如下:

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;

此函数现在返回正确的值,但不应对表的每一行都执行此操作。

result picture

2 个答案:

答案 0 :(得分:4)

那是因为您是在查询的上下文中运行它,所以它在每一行都运行并且仅计算Andrea。为了只返回一个结果,您只需要运行一次:

select BerechneAlter('Andrea') from dual;

如果希望它为表中的每一行计算,则使用:

select BerechneAlter(name) from family;

dual是Oracle中的系统表,用于仅返回查询中的一个结果/值

答案 1 :(得分:2)

@JorgeCampos已经解释了为什么您得到重复的输出行。

让我还建议可以大大简化过程的代码,因此整个逻辑都在查询中执行:

  • 使用NVL预设失效日期
  • 使用EXTRACT动态计算当前年份(而不是对值进行硬编码)

代码:

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;