Функция PL / SQL возвращает много значений - PullRequest
0 голосов
/ 24 декабря 2018

Я не могу понять, почему моя функция sql возвращает всю таблицу с одинаковым значением.

Задача следующая:

Создать функцию PL / SQL CalculationAge (Person), которая возвращает разницу между годом смерти и годом рождения, если человекуже умер, и разница между текущим годом и годом рождения, если человек еще жив.Текущий год определяется по системному времени СУБД.Пример: 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;

В данный момент функция возвращает правильное значение, ноон не должен делать это для каждой строки таблицы.

результирующая картинка

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

@ 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;
0 голосов
/ 24 декабря 2018

Это потому, что вы запускаете его в контексте запроса, он выполняется для каждой строки и вычисляет только Андреа.Чтобы вернуть только один результат, вам нужно запустить его всего один раз:

select BerechneAlter('Andrea') from dual;

И если вы хотите, чтобы он вычислялся для каждой строки в таблице, которую вы используете:

select BerechneAlter(name) from family;

dual - это системная таблица в Oracle, которая используется для возврата только одного результата / значения в запросе

...