Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Написать свою функцию сортировки таблицы / 12 сообщений из 12, страница 1 из 1
25.12.2021, 18:08
    #40122983
KiraBatya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать свою функцию сортировки таблицы
Дали задание написать функцию сортировки,где 1 параметр это имя столбца таблицы по которому надо сортировать
Написал первое что пришло в голову.
Код: 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.
DECLARE
function SortSelect(wichSort in char) return integer
is
    buf customers%rowtype;
    ord integer :=0;
    type fakeCursor is ref cursor;
    realCursor fakeCursor;
    BEGIN
        if  wichSort = 'cust_num'
            then ord :=1;
        elsif wichSort = 'company'
            then ord :=2;
        elsif wichSort = 'cust_rep'
            then ord :=3;
        elsif wichSort = 'credit_limit'    
            then ord :=4;   
        end if;    
         open realCursor for select * from customers order by ord;
            fetch realCursor into buf.cust_num,buf.company,buf.cust_rep,buf.credit_limit;
            while realCursor%found
            loop
                 DBMS_OUTPUT.PUT_LINE(realCursor%rowcount || ' ' || buf.cust_num || ' ' || buf.company || ' ' || buf.cust_rep || ' ' || buf.credit_limit);
                 fetch realCursor into buf.cust_num,buf.company,buf.cust_rep,buf.credit_limit;
            end loop;
         close realCursor;
    end;
begin 
     DBMS_OUTPUT.PUT_LINE(SortSelect('company'));
end;


Но оно все же не сортирует,выдает обычный набор строк из таблицы как будто order by ord и нет
...
Рейтинг: 0 / 0
25.12.2021, 18:19
    #40122986
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать свою функцию сортировки таблицы
Сортировка по константе именно так и должна работать.

Поменяй IF на CASE/DECODE и помести его прямо в ORDER BY.
...
Рейтинг: 0 / 0
25.12.2021, 18:36
    #40122988
KiraBatya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать свою функцию сортировки таблицы
Dimitry Sibiryakov,как это прямо в ORDER BY?
...
Рейтинг: 0 / 0
25.12.2021, 18:44
    #40122989
KiraBatya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать свою функцию сортировки таблицы
Dimitry Sibiryakov,

Жесть,никогда бы и не подумал что так можно делать,спасибо большое
...
Рейтинг: 0 / 0
25.12.2021, 20:14
    #40123003
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать свою функцию сортировки таблицы
Dimitry Sibiryakov

Поменяй IF на CASE/DECODE и помести его прямо в ORDER BY.


Не совсем:

Код: plsql
1.
ORDER BY { column-Name | ColumnPosition | Expression }



Посему 1, 2, 3, 4 в CASE будут восприняты литерально а не как позиции:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> select dname from dept order by 1;

DNAME
--------------
ACCOUNTING
OPERATIONS
RESEARCH
SALES

SQL> select dname from dept order by case 1 when 1 then 1 end;

DNAME
--------------
ACCOUNTING
RESEARCH
SALES
OPERATIONS

SQL>



Надеюсь ты имел ввиду:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
open realCursor
  for
    select  *
      from  customers
      order by case wichSort
                 when 'cust_num' then cust_num
                 when 'company' then company
                  when 'cust_rep' then cust_rep
                  when 'credit_limit' then credit_limit
               end;



при условии поле cust_num в таблице customers первое, company второе, cust_rep третье, credit_limit четвертое и то при условии все 4 одного типа. А в общем случае:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
open realCursor
  for
    select  *
      from  customers
      order by case wichSort
                 when 'cust_num' then cust_num
               end,
               case wichSort
                 when 'company' then company
               end,
               case wichSort
                  when 'cust_rep' then cust_rep
               end,
               case wichSort
                  when 'credit_limit' then credit_limit
               end;



SY.
...
Рейтинг: 0 / 0
25.12.2021, 21:38
    #40123033
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать свою функцию сортировки таблицы
В реальной программе
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
if wichSort='cust_num'  then
  open realCursor  for
  select  *
  from  customers
  order by cust_num;
  ...
elseif   wichSort='company'  then
  open realCursor  for
  select  *
  from  customers
  order by company;
  ...


скорее всего, будет лучше.
...
Рейтинг: 0 / 0
25.12.2021, 21:58
    #40123037
Asmodeus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать свою функцию сортировки таблицы
Victor Metelitsa
В реальной программе
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
if wichSort='cust_num'  then
  open realCursor  for
  select  *
  from  customers
  order by cust_num;
  ...
elseif   wichSort='company'  then
  open realCursor  for
  select  *
  from  customers
  order by company;
  ...


скорее всего, будет лучше.
Поддержу. По крайней мере, это будут разные запросы, которые можно будет настраивать по разному. В отличие от случая одного "универсального" запроса, в котором "хвост вытащишь - нос увязнет".
...
Рейтинг: 0 / 0
26.12.2021, 15:42
    #40123162
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать свою функцию сортировки таблицы
Asmodeus
Поддержу. По крайней мере, это будут разные запросы, которые можно будет настраивать по разному. В отличие от случая одного "универсального" запроса, в котором "хвост вытащишь - нос увязнет".


Тут скорее вопрос производительности и ресурсов. CASE не позволит использовать индекс вместо сортировки и например рискует получить disk sort на больших объемах хотя возможен и обратный вариант - INDEX FULL SCAN + TABLE ACCESS BY ROWID (даже batched) может быть медленней TABLE ACCESS FULL + SORT ORDER BY.
А применительно к коду OP:

Код: plsql
1.
open realCursor for 'select * from customers order by ' || wichSort;



при условии поле cust_num в таблице customers первое, company второе, cust_rep третье, credit_limit четвертое конечно.

SY.
...
Рейтинг: 0 / 0
28.12.2021, 12:00
    #40123571
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать свою функцию сортировки таблицы
Asmodeus

Поддержу. По крайней мере,


тут важнее

Код: plsql
1.
при условии все 4 одного типа




......
stax
...
Рейтинг: 0 / 0
28.12.2021, 12:02
    #40123574
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать свою функцию сортировки таблицы
SY

при условии поле cust_num в таблице customers первое, company второе, cust_rep третье, credit_limit четвертое конечно.

SY.


не могу понять ето условие/ограничение, о чем ето?

.....
stax
...
Рейтинг: 0 / 0
28.12.2021, 15:19
    #40123639
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать свою функцию сортировки таблицы
Stax
SY

при условии поле cust_num в таблице customers первое, company второе, cust_rep третье, credit_limit четвертое конечно.

SY.


не могу понять ето условие/ограничение, о чем ето?

.....
stax


Посмотри на исходное сообщение. ТС хотел (причем неправильно ибо order by ord будет сортировать по Expression а не по ColumnPosition) сортировку по первому полю таблицы если wichSort = 'cust_num', по второму полю таблицы если wichSort = 'company', и.т.д. Мы не знаем порядок полей в таблице customers поэтому и говорим что

select * from customers order by 1

и

select * from customers order by cust_num

эквивалентны только при условии поле cust_num в таблице customers первое.

SY.
...
Рейтинг: 0 / 0
28.12.2021, 15:33
    #40123641
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать свою функцию сортировки таблицы
SY

Посмотри на исходное сообщение. ТС хотел (причем неправильно ибо order by ord будет сортировать по Expression а не по ColumnPosition) сортировку по первому полю таблицы если wichSort = 'cust_num', по второму полю таблицы если wichSort = 'company', и.т.д. Мы не знаем порядок полей в таблице customers поэтому и говорим что

select * from customers order by 1

и

select * from customers order by cust_num

эквивалентны только при условии поле cust_num в таблице customers первое.

SY.

по любому order by ord не будет сортировать,
даже если "поле cust_num в таблице customers первое"

зы
я уверен что Вы ето занаете,
обычно на англиском могу не так понять,
а тут на русском и я запутался в формулировке

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


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