Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Фигня какая то при использовании rownum и order by в ф-ции  [new]
Ден
Member

Откуда: Москва
Сообщений: 2076
Вобщем то простой скрипт, ф-ция должна вернуть 1ую строку запроса.
А хватает 2ую.. такое чуство, что не order by не срабатывают. Возвращает 'N'
Вобщем не могу понять где я накосячил..

create or replace function sy810.CheckMCURowSec(MCU in varchar,JDEUSER varchar) return nchar
is
  isUpdate nchar(1) default 'Y';
  isAppend nchar(1) default 'Y';
  isChange nchar(1) default 'Y';
begin

select FSA,FSCHNG into isAppend,isChange from
(select * from 
(
select d.AUSEQNO,f.* from sy810.F95921 h,sy810.F00926 d,sy810.F00950 f where Trim(RLTOROLE)= JDEUSER and h.RLFRROLE=d.AUUSER
and h.RLFRROLE=F.FSUSER and f.FSSETY='4' and f.FSDTAI='MCU' and f.FSOBNM='*ALL' 
and MCU between f.FSFRDV and f.FSTHDV and h.RLFRROLE in (select LLUSER from sy810.F0093 where LLLL like '%PD810%')
order by d.AUSEQNO desc,f.FSTHDV asc) where rownum=1);
       
 if isChange='N' or isAppend='N' then
          isUpdate:='N';
              else
          isUpdate:='Y';   
 end if;

  
        return isUpdate;
end;

   AUSEQNO F FSUSER     FSOBNM     FSDTAI     FSFRDV                         FSSY FSOWDI                                   FSFMNM     FSFU F F F F F F FSTHDV                             FSOBID F F F F F F F FSMUSE     FSPID      FSJOBN         FSUPMJ     FSUPMT   FSEXITID    FSTABID   FSTEXTID FSPTH                                                                                                                   
---------- - ---------- ---------- ---------- ------------------------------ ---- ---------------------------------------- ---------- ---- - - - - - - ------------------------------ ---------- - - - - - - - ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------------------------------------------------------------------------------------------------------------------------
       560 4 42CO_00001 *ALL       MCU                M331                        CostCenter                                                   Y Y Y Y         M331                            0               ХХХХХ  P00950     X617           110186     124628          0          0          0                                                                                                                         
       560 4 42CO_00001 *ALL       MCU                M329                        CostCenter                                                   Y N N N         M348                            0               ХХХХХ  EP00950    X617           110197     133256          0          0          0                                                                                                                         

9 авг 10, 13:51    [9234377]     Ответить | Цитировать Сообщить модератору
 Re: Фигня какая то при использовании rownum и order by в ф-ции  [new]
dfrtesvxczxc
Guest
Ден,

чувак, ты гонишь
9 авг 10, 13:59    [9234445]     Ответить | Цитировать Сообщить модератору
 Re: Фигня какая то при использовании rownum и order by в ф-ции  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Ден,

и как связан текст функции с приведёнными данными? :)

PS: В функции можно обойтись без блока IF.
9 авг 10, 14:05    [9234505]     Ответить | Цитировать Сообщить модератору
 Re: Фигня какая то при использовании rownum и order by в ф-ции  [new]
Ден
Member

Откуда: Москва
Сообщений: 2076
Может крыша от дыма едит
select sy810.CheckMCURowSec('        M331','ZAMOSHN_VA') from dual
SY810.CHECKMCUROWSEC('M331','ZAMOSHN_VA')                                                                                                             
------------------------------------------------------------------------------------------------------------------------------------------------------
N                                                                                                                                                     
1 row selected.
В продолжение моего первого поста
9 авг 10, 14:06    [9234512]     Ответить | Цитировать Сообщить модератору
 Re: Фигня какая то при использовании rownum и order by в ф-ции  [new]
Ден
Member

Откуда: Москва
Сообщений: 2076
suPPLer,

сорри, данные из этого запроса, который слегка модифицированный используется в ф-ции
select d.AUSEQNO,f.* from sy810.F95921 h,sy810.F00926 d,sy810.F00950 f where Trim(RLTOROLE)= 'ZAMOSHN_VA' and h.RLFRROLE=d.AUUSER
and h.RLFRROLE=F.FSUSER and f.FSSETY='4' and f.FSDTAI='MCU' and f.FSOBNM='*ALL' 
and '        M331' between f.FSFRDV and f.FSTHDV and h.RLFRROLE in (select LLUSER from sy810.F0093 where LLLL like '%PD810%')
order by d.AUSEQNO desc,f.FSTHDV asc
9 авг 10, 14:08    [9234529]     Ответить | Цитировать Сообщить модератору
 Re: Фигня какая то при использовании rownum и order by в ф-ции  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Ден,

0. Зачем Вы используете varchar? Вы знаете разницу между varchar и varchar2?
1. А зачем столько столбцов, если в функции используются всего два? Покажите результат этого:

select FSA,FSCHNG from
(
select d.AUSEQNO,f.* from sy810.F95921 h,sy810.F00926 d,sy810.F00950 f where Trim(RLTOROLE)= JDEUSER and h.RLFRROLE=d.AUUSER
and h.RLFRROLE=F.FSUSER and f.FSSETY='4' and f.FSDTAI='MCU' and f.FSOBNM='*ALL' 
and MCU between f.FSFRDV and f.FSTHDV and h.RLFRROLE in (select LLUSER from sy810.F0093 where LLLL like '%PD810%')
order by d.AUSEQNO desc,f.FSTHDV asc) 
9 авг 10, 14:14    [9234568]     Ответить | Цитировать Сообщить модератору
 Re: Фигня какая то при использовании rownum и order by в ф-ции  [new]
Ден
Member

Откуда: Москва
Сообщений: 2076
select FSA,FSCHNG from
(
select d.AUSEQNO,f.* from sy810.F95921 h,sy810.F00926 d,sy810.F00950 f where Trim(RLTOROLE)= 'ZAMOSHN_VA' and h.RLFRROLE=d.AUUSER
and h.RLFRROLE=F.FSUSER and f.FSSETY='4' and f.FSDTAI='MCU' and f.FSOBNM='*ALL' 
and '        M331' between f.FSFRDV and f.FSTHDV and h.RLFRROLE in (select LLUSER from sy810.F0093 where LLLL like '%PD810%')
order by d.AUSEQNO desc,f.FSTHDV asc) 
F F
- -
Y Y
N N

2 rows selected.
Честно, я использую по привычке. Не знаю, чем здесь это может аукнуться.
Исправил на nvarchar2, ничего не поменялось..
9 авг 10, 14:28    [9234685]     Ответить | Цитировать Сообщить модератору
 Re: Фигня какая то при использовании rownum и order by в ф-ции  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Ден
Честно, я использую по привычке. Не знаю, чем здесь это может аукнуться.
Исправил на nvarchar2, ничего не поменялось..


Ну, nvarchar2 и varchar - это всё-таки разные типы. :) А вот varchar и varchar2 - пока что одинаковые, но только пока...

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/datatypes.htm#sthref736
Currently, VARCHAR is synonymous with VARCHAR2. However, in future releases of PL/SQL, to accommodate emerging SQL standards, VARCHAR might become a separate datatype with different comparison semantics. It is a good idea to use VARCHAR2 rather than VARCHAR.


Насчёт запроса: а теперь - в той же сессии

select FSA,FSCHNG from
(
select d.AUSEQNO,f.* from sy810.F95921 h,sy810.F00926 d,sy810.F00950 f where Trim(RLTOROLE)= 'ZAMOSHN_VA' and h.RLFRROLE=d.AUUSER
and h.RLFRROLE=F.FSUSER and f.FSSETY='4' and f.FSDTAI='MCU' and f.FSOBNM='*ALL' 
and '        M331' between f.FSFRDV and f.FSTHDV and h.RLFRROLE in (select LLUSER from sy810.F0093 where LLLL like '%PD810%')
order by d.AUSEQNO desc,f.FSTHDV asc) 
where rownum = 1;
9 авг 10, 14:48    [9234831]     Ответить | Цитировать Сообщить модератору
 Re: Фигня какая то при использовании rownum и order by в ф-ции  [new]
Ден
Member

Откуда: Москва
Сообщений: 2076
Ну у меня все в юникоде, поэтому для надежности лучше nvarchar
На счет запроса, так в том то и фигня, что если его просто запустить
select FSA,FSCHNG from
(
select d.AUSEQNO,f.* from sy810.F95921 h,sy810.F00926 d,sy810.F00950 f where Trim(RLTOROLE)= 'ZAMOSHN_VA' and h.RLFRROLE=d.AUUSER
and h.RLFRROLE=F.FSUSER and f.FSSETY='4' and f.FSDTAI='MCU' and f.FSOBNM='*ALL' 
and '        M331' between f.FSFRDV and f.FSTHDV and h.RLFRROLE in (select LLUSER from sy810.F0093 where LLLL like '%PD810%')
order by d.AUSEQNO desc,f.FSTHDV asc) 
where rownum = 1;
то будет все нормально
F F
- -
Y Y
1 row selected.
а эта же фигня в ф-ции толи не срабатывает, толи какой не известный мне глюк.
т.к срабатывает данное условие
 if isChange='N' or isAppend='N' then
          isUpdate:='N';
              else
          isUpdate:='Y';   
 end if;
т.е ф-ция возвращает N
9 авг 10, 14:57    [9234927]     Ответить | Цитировать Сообщить модератору
 Re: Фигня какая то при использовании rownum и order by в ф-ции  [new]
dfrtesvxczxc
Guest
Ден,

create or replace function sy810.CheckMCURowSec(p_MCU in varchar,p_JDEUSER varchar) return nchar

return isChange||isAppend;
9 авг 10, 15:08    [9235054]     Ответить | Цитировать Сообщить модератору
 Re: Фигня какая то при использовании rownum и order by в ф-ции  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Ден,

create or replace function sy810.CheckMCURowSec_TEST(MCU in varchar,JDEUSER varchar) return nchar
is
  isUpdate nchar(1);
begin
---\/ Show NLS_SORT ---
  for n in (select 'DB' lev, parameter, value from nls_database_parameters where parameter = 'NLS_SORT'
             union all
            select 'SE' lev, parameter, value from nls_database_parameters where parameter = 'NLS_SORT')
  loop
    dbms_output.put_line(n.lev||':'||rpad(n.parameter, 32)||' - '||n.value);
  end loop;
---/\ Show NLS_SORT ---

  select case when FSA = 'Y' and FSCHNG = 'Y' then 'Y' else 'N' end  
    into isUpdate 
    from (select d.AUSEQNO,f.* 
            from sy810.F95921 h,sy810.F00926 d,sy810.F00950 f 
           where Trim(RLTOROLE)= JDEUSER and h.RLFRROLE=d.AUUSER
             and h.RLFRROLE=F.FSUSER and f.FSSETY='4' 
             and f.FSDTAI='MCU' and f.FSOBNM='*ALL' 
             and MCU between f.FSFRDV and f.FSTHDV 
             and h.RLFRROLE in (select LLUSER from sy810.F0093 where LLLL like '%PD810%')
           order by d.AUSEQNO desc,f.FSTHDV asc) 
   where rownum=1;
  
  return isUpdate;
end;
/

Что вернёт эта функция?
9 авг 10, 15:16    [9235138]     Ответить | Цитировать Сообщить модератору
 Re: Фигня какая то при использовании rownum и order by в ф-ции  [new]
-2-
Member

Откуда:
Сообщений: 15330
dfrtesvxczxc
return isChange||isAppend;
Не попал.

suPPLer
case when FSA = 'Y' and FSCHNG = 'Y' then 'Y' else 'N' end
А если там пробел?
9 авг 10, 15:25    [9235216]     Ответить | Цитировать Сообщить модератору
 Re: Фигня какая то при использовании rownum и order by в ф-ции  [new]
dfrtesvxczxc
Guest
-2-
[quot dfrtesvxczxc]
return isChange||isAppend;
Не попал.

ты не угадал
9 авг 10, 15:27    [9235231]     Ответить | Цитировать Сообщить модератору
 Re: Фигня какая то при использовании rownum и order by в ф-ции  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
-2-
А если там пробел?


Кстати, desc F00950 я так и не попросил... :-/
9 авг 10, 15:32    [9235268]     Ответить | Цитировать Сообщить модератору
 Re: Фигня какая то при использовании rownum и order by в ф-ции  [new]
Ден
Member

Откуда: Москва
Сообщений: 2076
Всем пасибо! Пока я тут копался, решили пойти другим путем, организационным, чтоб диапазаоны не вклинивались друг в друга-) поэтому данных для теста не осталось-)
TABLE sy810.F00950
 Name                                                                                Null?    Type                                                    
 ----------------------------------------------------------------------------------- -------- --------------------------------------------------------
 FSSETY                                                                              NOT NULL NCHAR                                                   
 FSUSER                                                                              NOT NULL NCHAR                                                   
 FSOBNM                                                                              NOT NULL NCHAR                                                   
 FSDTAI                                                                              NOT NULL NCHAR                                                   
 FSFRDV                                                                              NOT NULL NCHAR                                                   
 FSSY                                                                                NOT NULL NCHAR                                                   
 FSOWDI                                                                                       NCHAR                                                   
 FSFMNM                                                                                       NCHAR                                                   
 FSFUNO                                                                                       NCHAR                                                   
 FSINSL                                                                                       NCHAR                                                   
 FSRUN                                                                                        NCHAR                                                   
 FSVWYN                                                                                       NCHAR                                                   
 FSA                                                                                          NCHAR                                                   
 FSCHNG                                                                                       NCHAR                                                   
 FSDLT                                                                                        NCHAR                                                   
 FSTHDV                                                                                       NCHAR                                                   
 FSOBID                                                                                       NUMBER(15)                                              
 FSADDC                                                                                       NCHAR                                                   
 FSIOK                                                                                        NCHAR                                                   
 FSICPY                                                                                       NCHAR                                                   
 FSIUPT                                                                                       NCHAR                                                   
 FSATN1                                                                                       NCHAR                                                   
 FSATN2                                                                                       NCHAR                                                   
 FSATN3                                                                                       NCHAR                                                   
 FSMUSE                                                                                       NCHAR                                                   
 FSPID                                                                                        NCHAR                                                   
 FSJOBN                                                                                       NCHAR                                                   
 FSUPMJ                                                                                       NUMBER(6)                                               
 FSUPMT                                                                                       NUMBER                                                  
 FSEXITID                                                                                     NUMBER(15)                                              
 FSTABID                                                                                      NUMBER(15)                                              
 FSTEXTID                                                                                     NUMBER(15)                                              
 FSPTH                                                                                        NCHAR
9 авг 10, 15:53    [9235484]     Ответить | Цитировать Сообщить модератору
 Re: Фигня какая то при использовании rownum и order by в ф-ции  [new]
Ден
Member

Откуда: Москва
Сообщений: 2076
suPPLer
Ден,

create or replace function sy810.CheckMCURowSec_TEST(MCU in varchar,JDEUSER varchar) return nchar
is
  isUpdate nchar(1);
begin
---\/ Show NLS_SORT ---
  for n in (select 'DB' lev, parameter, value from nls_database_parameters where parameter = 'NLS_SORT'
             union all
            select 'SE' lev, parameter, value from nls_database_parameters where parameter = 'NLS_SORT')
  loop
    dbms_output.put_line(n.lev||':'||rpad(n.parameter, 32)||' - '||n.value);
  end loop;
---/\ Show NLS_SORT ---

  select case when FSA = 'Y' and FSCHNG = 'Y' then 'Y' else 'N' end  
    into isUpdate 
    from (select d.AUSEQNO,f.* 
            from sy810.F95921 h,sy810.F00926 d,sy810.F00950 f 
           where Trim(RLTOROLE)= JDEUSER and h.RLFRROLE=d.AUUSER
             and h.RLFRROLE=F.FSUSER and f.FSSETY='4' 
             and f.FSDTAI='MCU' and f.FSOBNM='*ALL' 
             and MCU between f.FSFRDV and f.FSTHDV 
             and h.RLFRROLE in (select LLUSER from sy810.F0093 where LLLL like '%PD810%')
           order by d.AUSEQNO desc,f.FSTHDV asc) 
   where rownum=1;
  
  return isUpdate;
end;
/

Что вернёт эта функция?
Этот вариант я поставил в свою ф-цию, пасибо! Правда протестить не удаствся пока что, т.к данные поменяли, убрали вложенные диапазоны
9 авг 10, 15:56    [9235500]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить