Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Коллекция с record как параметр процедуры / 8 сообщений из 8, страница 1 из 1
07.12.2019, 13:34
    #39899380
nikodim124
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция с record как параметр процедуры
Полностью условие выглядит так:
Реализовать процедуру, входным параметром у которой будет коллекция элементов типа record(varchar2, number и date).
Процедура должна возвращать сумму всех длин varchar, сумму всех значений number, разницу в днях между max и min элементами date.


Я заполняю коллекцию через курсор
Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE OR REPLACE PACKAGE ttest_rec is
cursor l_cur is
        select last_name, weigh, birth from player_info;
type l_cur_tab is table of l_cur%rowtype index by pls_integer;
l_emp l_cur_tab;
procedure counter_test (var1 l_cur_tab);
end ttest_rec;



Хочу написать в FORALL простой возврат (в данном коде только суммы хотя бы), но что-то понимаю логики
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace package body ttest_rec is 
procedure counter_test (var1 l_cur_tab) is
    summa number;
    kol number;
    raz number;
begin
forall j in var1.FIRST..var1.LAST
    update player_info
    set weigh = weigh(j)
    returning sum(weigh) into summa
raz := maxdate - mindate;
DBMS_OUTPUT.PUT_LINE (summa);
end;
end ttest_rec;



По итогу ожидается подобный вызов
Код: plsql
1.
2.
3.
4.
5.
6.
begin
open ttest_rec.l_cur;
fetch ttest_rec.l_cur bulk collect into ttest_rec.l_emp;
close ttest_rec.l_cur;
ttest_rec.counter_test(ttest_rec.l_emp);
end;
...
Рейтинг: 0 / 0
07.12.2019, 15:50
    #39899403
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция с record как параметр процедуры
nikodim124

forall j in var1.FIRST..var1.LAST
update player_info
set weigh = weigh(j)
returning sum(weigh) into summa


А теперь прочти вслух вышестоящее: Берем weigh(1) и обновляем им поле weigh ВСЕХ строк таблицы player_info. Затем берем weigh(2) и обновляем им поле weigh ВСЕХ строк таблицы player_info, и.т.д. Без PK типа player_id в таблице и в курсоре ты не обойдешься.

SY.
...
Рейтинг: 0 / 0
07.12.2019, 18:02
    #39899429
iOracleDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция с record как параметр процедуры
nikodim124,

Сначала определись что ты на самом деле хочешь сделать, а потом читай про коллекции.
...
Рейтинг: 0 / 0
07.12.2019, 18:16
    #39899432
nikodim124
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция с record как параметр процедуры
SY,

Может есть тема обойти update/insert/delete или какую-нибудь пассивную операцию там использовать? Чувствую, что сам усложняю
...
Рейтинг: 0 / 0
07.12.2019, 18:37
    #39899436
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция с record как параметр процедуры
nikodim124

Может есть тема обойти update/insert/delete или какую-нибудь пассивную операцию там использовать? Чувствую, что сам усложняю


Ты внaчале слoвами огласи что должно произойти если в таблице Вася, Петя, Саша, Митя а в коллекции Вова и Петя и сравни со своим forall.

SY.
...
Рейтинг: 0 / 0
07.12.2019, 19:07
    #39899445
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция с record как параметр процедуры
nikodim124
Чувствую, что сам усложняю
Ты не понимаешь основ. Читай PL/SQL Guide с самого начала. До коллекций и SQL ты ещё не дорос.
...
Рейтинг: 0 / 0
09.12.2019, 10:14
    #39899796
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция с record как параметр процедуры
nikodim124

Процедура должна возвращать сумму всех длин varchar, сумму всех значений number, разницу в днях между max и min элементами date.[/b]
Хочу написать в FORALL


зачем Вам FORALL?
если надо "сумму всех длин varchar, сумму всех значений number, разницу в днях"

.....
stax
...
Рейтинг: 0 / 0
09.12.2019, 10:44
    #39899816
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция с record как параметр процедуры
nikodim124,

набрал
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
SQL> select sum(length(ename)) s_l,sum(sal) s_s,max(hiredate)-min(hiredate) d_d from emp;

       S_L        S_S        D_D
---------- ---------- ----------
        70      29025        756

SQL> declare
  2   cursor l_cur is
  3          select ename, sal, hiredate from emp;
  4   type l_cur_tab is table of l_cur%rowtype index by pls_integer;
  5   l_emp l_cur_tab;
  6   v_sum_length number;
  7   v_sum_numb   number;
  8   v_dif_dat    number;
  9  procedure counter_test (p_var1       in  l_cur_tab
 10                         ,p_sum_length out number
 11                         ,p_sum_numb   out number
 12                         ,p_dif_dat    out number) is
 13   d1 date;
 14   d2 date;
 15  begin
 16   p_sum_length:=0;
 17   p_sum_numb:=0;
 18   d1:=p_var1(p_var1.FIRST).hiredate;
 19   d2:=p_var1(p_var1.FIRST).hiredate;
 20   for j in p_var1.FIRST..p_var1.LAST loop
 21     p_sum_length:=p_sum_length+nvl(length(p_var1(j).ename),0);
 22     p_sum_numb  :=p_sum_numb+nvl(p_var1(j).sal,0);
 23     if d1>p_var1(j).hiredate then d1:=p_var1(j).hiredate; end if;
 24     if d2<p_var1(j).hiredate then d2:=p_var1(j).hiredate; end if; --выяснить что делать с null
 25   end loop;
 26   p_dif_dat:=d2-d1;
 27  end;
 28  begin
 29   open l_cur;
 30   fetch l_cur bulk collect into l_emp;
 31   close l_cur;
 32   counter_test (l_emp, v_sum_length, v_sum_numb, v_dif_dat);
 33   dbms_output.put_line('сумма всех длин varchar '||v_sum_length);
 34   dbms_output.put_line('сумму всех значений number '||v_sum_numb);
 35   dbms_output.put_line('разница в днях между max и min '||v_dif_dat);
 36  end;
 37  /
сумма всех длин varchar 70
сумму всех значений number 29025
разница в днях между max и min 756

PL/SQL procedure successfully completed.

SQL>



зи
hiredate not null

.....
stax
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Коллекция с record как параметр процедуры / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]