Как я вижу, ничего из того, что вы хотите, не произойдет. Плохие новости, а?
Код, который вы написали, неверен - не из-за явных ошибок, а из-за оператора SELECT
курсора содержит 3 столбца, которые вы извлекаете в переменную 1 varchar2
. 3 не могут вписаться в 1;не таким образом, то есть.
Более того, что бы вы сделали с циклом внутри функции? Конечно, это может быть сделано, например (переключение на цикл курсора FOR
для простоты), но - в зависимости от того, куда вы положили RETURN
, вы либо вернете первое значение O_RESULT
или последнее (см. Комментариивнутри кода):
for cur_r in (select sprhold_hldd_code, ...
from sprhold ...
where --> ID condition missing here; ID you're passing, allegedly
)
loop
if cur_r.sprhold_hldd_code in ('TL', 'TY', ...) then ...
-- in a number of IFs, you find what O_RESULT variable is
end if;
-- if you put RETURN here, only one loop iteration will execute
end loop;
-- if you put RETURN here, only the last O_RESULT value will be returned
Это означает, что вы на самом деле хотите поместить цикл вне функции, то есть вызвать функцию в цикле для всех этих ID
s, которые вы 'собирается перейти к функции. Примерно так:
function f_result (par_id in number) return varchar2 is
o_result varchar2(20);
begin
select sprhold_hldd_code
into l_sprhold_hldd_code
from sprhold ...
where some_id = par_id;
if l_sprhold_hldd_code in ...
-- find O_RESULT in a number of IFs
end if;
return o_result;
end;
Теперь вызовите его в цикле
begin
for cur_r in (select id from some_table where some_condition) loop
dbms_output.put_line('For ID = ' || cur_r.id || ', function returned ' || f_result(cur_r.id));
end loop;
end;
Если ничего из вышеперечисленного не помогло, попробуйте перефразировать вопрос.