Почему возвращается только одна запись: вы перебираете набор записей, выбирая одну запись за раз, и каждый раз назначаете эту запись выходной переменной.Таким образом, только ваша последняя запись будет сохранена в выходной переменной.
То, что вы хотите сделать, это вернуть набор записей.Для этого вы можете использовать таблицы pl / sql.Чтобы легко получить набор в таблицу, вы можете использовать массовый сбор в ( ссылка - но Google найдет вас гораздо больше).Вы можете использовать тип строки в качестве типа для своей таблицы или тип, который вы создаете сами.Вы можете использовать переменную пакета для объявления типа или определить тип в схеме базы данных.Если вы используете rowtype, это совсем не плохо.Если ваша таблица должна измениться, то тип строки будет также отражать это, избавляя вас от хлопот, связанных с обходом кода для добавления или удаления столбцов, если вы вручную объявили каждый столбец в своем собственном типе.
Пример:
function hand_out_money
return pck_emp.t_tab_emp
is
tab_emp pck_emp.t_tab_emp;
begin
select *
bulk collect into tab_emp
from emp
where deptno = 20;
update emp
set comm = comm + 10
where deptno = 20;
return tab_emp;
end;
Чтобы использовать это, объявите t_tab_emp в package_spec.Таким образом, вы можете ссылаться на возвращаемый тип, откуда вы вызываете этот код.Просто вставьте туда type t_tab_emp is table of emp%rowtype;
- как я сделал бы в пакете pck_emp.
Тогда ваш код вызова может быть:
declare
tab_result pck.t_tab_emp;
begin
tab_result := hand_out_money;
end;
Чтобы обновить информацию: если вы извлекаете все свои записи втаблицу plsql, после чего вы можете сделать один оператор обновления:
update X_externalaccountref
set externalstatus = 1, externalchangedate = SYSDATE
where externalstatus IS NULL;
Также : вы можете просто использовать функцию, если вы только вернете эту одну переменную, это будет иметь смыслgetter.
Также : мне обычно не нравятся функции или процедуры с именем 'getxxx', которые затем выполняют DML.Более уместным было бы назвать вашу процедуру «activ_external_accounts», например, которая затем вернет набор записей.Имейте в виду, что если вы сделаете массовый выбор перед обновлением, externalstatus и externalchangedate не будут обновлены!Таким образом, вы получаете не возвращенный набор результатов, а набор перед обновлением.