Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Задача по Oracle PL/SQL / 11 сообщений из 11, страница 1 из 1
19.01.2022, 10:20
    #40127682
ddfix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача по Oracle PL/SQL
Ребята у меня есть такая задача
Помогите пожалуйста с её решением.
Необходимо написать сортировку массива строк методом "пузырька" используя Oracle PL/SQL.
Оформить в виде кода хранимой процедуры, на вход которой подается массив, возвращается массив.
Параметры:
p_asc - сортировка по убыванию или по возрастанию (по умолчанию по возрастанию)
p_nulls_last - значения NULL в конце списка (по умолчанию они больше бОльшего)

declare
p_arr dbms_sql.Number_Table;
i pls_integer;
procedure do_sort(p_arr in out
dbms_sql.Number_Table, p_asc in
boolean default null, p_nulls_last in
boolean default null) is
begin
return; - тут код сортировки
end;
begin
p_arr(-1) :=0;
p_arr(0) :=-2;
p_arr(1) :=10.1;
p_arr(2) :=null;
p_arr(3) :=10.1;
p_arr(4) :=-1;
p_arr(6) :=null;
do_sort(p_arr);
i := p_arr.first;
while i is not null loop
dbms_output.put_line('arr('||i||') = '||
nvl(to_char(p_arr(i)), 'null')||';');
i := p_arr.next(i);
end loop;
end;
...
Рейтинг: 0 / 0
19.01.2022, 10:49
    #40127693
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача по Oracle PL/SQL
ddfix

return; - тут код сортировки


что не получается
алгоритм 11758438 непонятен ? или с null запутались?

....
stax
...
Рейтинг: 0 / 0
19.01.2022, 12:09
    #40127734
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача по Oracle PL/SQL
ddfix
Ребята у меня есть такая задача
Помогите пожалуйста с её решением.
Необходимо написать сортировку массива строк методом "пузырька" используя Oracle PL/SQL.
Оформить в виде кода хранимой процедуры, на вход которой подается массив, возвращается массив.
Параметры:
p_asc - сортировка по убыванию или по возрастанию (по умолчанию по возрастанию)
p_nulls_last - значения NULL в конце списка (по умолчанию они больше бОльшего)

Код: 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.
declare
 p_arr dbms_sql.Number_Table;
 i pls_integer;
 procedure do_sort(p_arr in out
dbms_sql.Number_Table, p_asc in
boolean default null, p_nulls_last in
boolean default null) is
 begin
   return; - тут код сортировки
 end;
begin
  p_arr(-1) :=0;
  p_arr(0) :=-2;
  p_arr(1) :=10.1;
  p_arr(2) :=null;
  p_arr(3) :=10.1;
  p_arr(4) :=-1;
  p_arr(6) :=null;
  do_sort(p_arr);
  i := p_arr.first;
  while i is not null loop
     dbms_output.put_line('arr('||i||') = '||
nvl(to_char(p_arr(i)), 'null')||';');
     i := p_arr.next(i);
 end loop;
end;


Студентам, желающим помощи
...
Рейтинг: 0 / 0
20.01.2022, 23:15
    #40128254
ddfix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача по Oracle PL/SQL
Stax, да , мне не понятно как теперь передвинуть NULLS.

Код: 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.
declare   
  p_arr dbms_sql.Number_Table;   
  i pls_integer;   
  procedure do_sort(p_arr in out dbms_sql.Number_Table, p_asc in boolean default null, p_nulls_last in boolean default null) is   
  x pls_integer;  
  p_temp number;  
  begin     
  for i in -1..p_arr.COUNT - 1  
    loop   
      for x in 0..p_arr.COUNT - 2
      loop   
        if p_arr(x) < p_arr(x-1)   
        then   
          p_temp := p_arr(x-1);   
          p_arr(x-1) := p_arr(x);   
          p_arr(x) := p_temp;   
        end if;  
      end loop;  
    end loop;  
    return;   
  end;   
begin   
  p_arr(-1) := 0;   
  p_arr(0) := -2;   
  p_arr(1) := 10.1;   
  p_arr(2) := null;    
  p_arr(3) := 10.1;   
  p_arr(4) := -1;
  p_arr(5) := null;  
  do_sort(p_arr);   
  i := p_arr.first;   
  while i is not null loop   
   dbms_output.put_line ('arr('||i||') = '||nvl(to_char(p_arr(i)), 'null')||';');   
   i := p_arr.next(i);   
  end loop;   
end;
...
Рейтинг: 0 / 0
20.01.2022, 23:58
    #40128262
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача по Oracle PL/SQL
ddfix
Stax, да , мне не понятно как теперь передвинуть NULLS.

[/src]

Вопрос как - не имеет значения, до тех пор, пока не решено - куда .

Вот c таким сравнением можно передвинуть в начало:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Function LessNullsFirst(px in Number, py in Number) Return Boolean
Is

Begin
  Return Case (case when py is null then 1 Else 0 End + case when px is Null Then 2 Else 0 End)
             When 0 Then  px < py
             When 1 Then False
             Else True
             End;
End; 



Перепишите это так, чтобы можно было по вашему желанию собирать Null в начале или в конце массива.
...
Рейтинг: 0 / 0
21.01.2022, 10:26
    #40128327
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача по Oracle PL/SQL
ddfix
Stax, да , мне не понятно как теперь передвинуть NULLS.


условие перестановки усложните (null самое маленькое/большое и null==null не надо переставлять)

пример дали 22423969

и главное, на сколько хотите сдать?

если на 5, то циклы надо переделать
неспроста ж у Вас
p_arr( 4 ) :=-1;
p_arr( 6 ) :=null;
(результат Вы правильно выводите)

да и класический алгоритм немножко другой (меня такому учили)

https://uk.wikipedia.org/wiki/Сортування_бульбашкою

у Вас чутку другой вариант сортировки бульбашкою

.....
stax
...
Рейтинг: 0 / 0
21.01.2022, 12:20
    #40128360
ddfix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача по Oracle PL/SQL
Stax, мне будет достаточно троечки))
+ в условии мне нужно лишь написать код сортировки, но я уже это не могу сделать потому - что мне не хватает переменных
я не знаю могу ли я их задавать или нет
Условие
Код: plsql
1.
2.
3.
4.
5.
6.
7.
declare
 p_arr dbms_sql.Number_Table;
 i pls_integer;
 procedure do_sort(p_arr in out
dbms_sql.Number_Table, p_asc in
boolean default null, p_nulls_last in
boolean default null) is


То что у меня
Код: plsql
1.
2.
3.
4.
5.
6.
declare   
  p_arr dbms_sql.Number_Table;   
  i pls_integer;   
  procedure do_sort(p_arr in out dbms_sql.Number_Table, p_asc in boolean default null, p_nulls_last in boolean default null) is   
  x pls_integer;  
  p_temp number;  


И если честно я даже не понимаю как:


Код: 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.
вставить это

Function LessNullsFirst(px in Number, py in Number) Return Boolean
Is
Begin
  Return Case (case when py is null then 1 Else 0 End + case when px is Null Then 2 Else 0 End)
             When 0 Then  px < py
             When 1 Then False
             Else True
             End;
End; 
 
вот сюда

declare   
  p_arr dbms_sql.Number_Table;   
  i pls_integer;   
  procedure do_sort(p_arr in out dbms_sql.Number_Table, p_asc in boolean default null, p_nulls_last in boolean default null) is   
  x pls_integer;  
  p_temp number;  
  begin     
  for i in -1..p_arr.COUNT - 1  
    loop   
      for x in 0..p_arr.COUNT - 2
      loop   
        if p_arr(x) < p_arr(x-1)   
        then   
          p_temp := p_arr(x-1);   
          p_arr(x-1) := p_arr(x);   
          p_arr(x) := p_temp;   
        end if;  
      end loop;  
    end loop;  
    return;   
  end;   
begin 

...
Рейтинг: 0 / 0
21.01.2022, 13:17
    #40128387
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача по Oracle PL/SQL
ddfix
Stax, мне будет достаточно троечки))

надеюсь на троечку хватит
Код: 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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
declare
p_arr dbms_sql.Number_Table;
i pls_integer;
Function swap_flag(
     px number
    ,py number
    ,p_asc in boolean default TRUE
    ,p_nulls_last in boolean default TRUE)
return boolean
is
begin
 if px=py or px is null and py is null then --равны
    return FALSE; 
  end if ;
  if p_nulls_last then  --null последний
    if  px is null  then return TRUE;  end if;
  else                          --null вначале
    if  py is null  then return TRUE;  end if;
  end if ;
  if p_asc then  
   return px>py; --по возростанию
  else
   return px<py; --по убыванию
  end if;
end;
procedure do_sort(
     p_arr in out dbms_sql.Number_Table
    ,p_asc in boolean default TRUE
    ,p_nulls_last in boolean default TRUE)
is
  m int :=0;
  i pls_integer;
  j pls_integer;
  n pls_integer;
  tmp number;
  v_f boolean;
begin
 n:=p_arr.last;
 v_f:=TRUE;
 while v_f and m<1000 loop --если была перестановка, пробуем еще раз
   m:=m+1;
   v_f:=FALSE;
   n:=p_arr.prior(n);
   i:=p_arr.first;
   while i<=n loop
     j:=p_arr.next(i);
     if swap_flag(p_arr(i),p_arr(j),p_asc,p_nulls_last) then --проверяем надо ли переставлять
       tmp:=p_arr(j);
       p_arr(j):=p_arr(i);
       p_arr(i):=tmp;
       v_f:=TRUE; --переставляли
     end if;
     i:=p_arr.next(i);
   end loop;
 end loop;
-- dbms_output.put_line('m = '||m);
 if m>1000 then
    raise_application_error(-20001,'ошибка в реализации пузырька (m='||m||').');
 end if;
return; -- тут код сортировки
end;
begin
p_arr(-1) :=0;
p_arr(0) :=-2;
p_arr(1) :=10.1;
p_arr(2) :=null;
p_arr(3) :=10.1;
p_arr(4) :=-1;
p_arr(6) :=null;
do_sort(p_arr);
i := p_arr.first;
while i is not null loop
  dbms_output.put_line('arr('||i||') = '||nvl(to_char(p_arr(i)), 'null')||';');
  i := p_arr.next(i);
end loop;
end;
SQL> /
arr(-1) = -2;
arr(0) = -1;
arr(1) = 0;
arr(2) = 10.1;
arr(3) = 10.1;
arr(4) = null;
arr(6) = null;

PL/SQL procedure successfully completed.

 69  p_arr(6) :=null;
 70  do_sort(p_arr,FALSE,FALSE);
 71  i := p_arr.first;
 72  while i is not null loop
 73    dbms_output.put_line('arr('||i||') = '||nvl(to_char(p_arr(i)), 'null')||';');
 74    i := p_arr.next(i);
 75  end loop;
 76* end;
SQL> /
arr(-1) = null;
arr(0) = null;
arr(1) = 10.1;
arr(2) = 10.1;
arr(3) = 0;
arr(4) = -1;
arr(6) = -2;

PL/SQL procedure successfully completed.

 69  p_arr(6) :=null;
 70  do_sort(p_arr,FALSE,TRUE);
 71  i := p_arr.first;
 72  while i is not null loop
 73    dbms_output.put_line('arr('||i||') = '||nvl(to_char(p_arr(i)), 'null')||';');
 74    i := p_arr.next(i);
 75  end loop;
 76* end;
SQL> /
arr(-1) = 10.1;
arr(0) = 10.1;
arr(1) = 0;
arr(2) = -1;
arr(3) = -2;
arr(4) = null;
arr(6) = null;

PL/SQL procedure successfully completed.



.....
stax
...
Рейтинг: 0 / 0
21.01.2022, 16:17
    #40128488
ddfix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача по Oracle PL/SQL
Stax, большое тебе спасибо!
Надеюсь для тебя это было не слишком напряжно, обещаю усердно учиться, чтобы потом тоже кому-нибудь помочь на этом форуме!!
...
Рейтинг: 0 / 0
22.01.2022, 23:27
    #40128739
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача по Oracle PL/SQL
ddfix,

напиши квиксорт для практики
или портируй с любого языка
...
Рейтинг: 0 / 0
26.01.2022, 15:21
    #40129630
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача по Oracle PL/SQL
Анекдот, навеянный этой темойМой друг учится на электрика и, судя по нему и его одногруппникам,
после того, как они придут на работу после окончания обучения,
половину из них сразу убьет током, а другая половина оставит, как минимум,
половину России без электричества.

А я учусь в мединституте на врача.
Так что тех молодых электриков, кого не убьет током сразу, убьют мои одногруппники.

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


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