powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Написать свою функцию сортировки таблицы
12 сообщений из 12, страница 1 из 1
Написать свою функцию сортировки таблицы
    #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
Написать свою функцию сортировки таблицы
    #40122986
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сортировка по константе именно так и должна работать.

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

Жесть,никогда бы и не подумал что так можно делать,спасибо большое
...
Рейтинг: 0 / 0
Написать свою функцию сортировки таблицы
    #40123003
Фотография 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
Написать свою функцию сортировки таблицы
    #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
Написать свою функцию сортировки таблицы
    #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
Написать свою функцию сортировки таблицы
    #40123162
Фотография 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
Написать свою функцию сортировки таблицы
    #40123571
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Asmodeus

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


тут важнее

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




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

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

SY.


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

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


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