powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Коллекция с record как параметр процедуры
8 сообщений из 8, страница 1 из 1
Коллекция с record как параметр процедуры
    #39899380
nikodim124
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Полностью условие выглядит так:
Реализовать процедуру, входным параметром у которой будет коллекция элементов типа 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
Коллекция с record как параметр процедуры
    #39899403
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Коллекция с record как параметр процедуры
    #39899429
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikodim124,

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

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

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


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

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

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


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

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


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