Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как объявить cursor для запроса, содержащего PIVOT ?  [new]
Кентурион Крысобой
Member

Откуда:
Сообщений: 202
Всем привет.
При раскомментировании r2_get_acnt_ids в нижеприведенном коде выводится
[Error] Syntax check (34: 5): ERROR line 34, col 5, ending_line 34, ending_col 9, 
Found 'pivot', Expecting: ) -or- INTERSECT MINUS UNION -or- CONNECT
GROUP HAVING MODEL START -or- , WHERE -or- CROSS FULL INNER JOIN
LEFT NATURAL PARTITION RIGHT

PIVOT действительно недопустим в этом месте или я неверно дал объявление ?
create or replace procedure testl( a_plan_id in int, result out int, val1 out int, val2 out int, val3 out int ) 
as
  cursor r_get_acnt_ids is
        select  
         max(case when node=161 then val end) result
        ,max(case when node=162 then val end) val1
        ,max(case when node=163 then val end) val2
        ,max(case when node=164 then val end) val3
          from xecint
          where owner =2000194 and node IN (161, 162, 163, 164) 
;
/*
cursor r2_get_acnt_ids is
    select  "161" result, "162" val1, "163" val2, "164" val3
    from(
        select  node,val
          from xecint
          where owner =2000194 and node IN (161, 162, 163, 164) 
    ) p            
    pivot (max(val) for node IN (161, 162, 163, 164));
*/       
  begin
    null;
  end; 
end;
/
14 янв 11, 14:53    [10073058]     Ответить | Цитировать Сообщить модератору
 Re: Как объявить cursor для запроса, содержащего PIVOT ?  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
у тебя не 11.2 наверное
14 янв 11, 14:55    [10073076]     Ответить | Цитировать Сообщить модератору
 Re: Как объявить cursor для запроса, содержащего PIVOT ?  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
насчет 11.1 просветите кстати - pivot там есть?
14 янв 11, 14:56    [10073086]     Ответить | Цитировать Сообщить модератору
 Re: Как объявить cursor для запроса, содержащего PIVOT ?  [new]
AmKad
Member

Откуда:
Сообщений: 5222
bdsm_sql
насчет 11.1 просветите кстати - pivot там есть?

Есть.
14 янв 11, 14:57    [10073092]     Ответить | Цитировать Сообщить модератору
 Re: Как объявить cursor для запроса, содержащего PIVOT ?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Кентурион Крысобой,

начните с
select  "161" result from dual;
14 янв 11, 14:59    [10073103]     Ответить | Цитировать Сообщить модератору
 Re: Как объявить cursor для запроса, содержащего PIVOT ?  [new]
-2-
Member

Откуда:
Сообщений: 15330
Кентурион Крысобой
[Error] Syntax check (34: 5): ERROR line 34, col 5, ending_line 34, ending_col 9, 
Found 'pivot', Expecting: ) -or- INTERSECT MINUS UNION -or- CONNECT
GROUP HAVING MODEL START -or- , WHERE -or- CROSS FULL INNER JOIN
LEFT NATURAL PARTITION RIGHT
Выкини свою гуеподелку. Правильные пацпны пользуются SQL*Plus'ом.
14 янв 11, 15:00    [10073124]     Ответить | Цитировать Сообщить модератору
 Re: Как объявить cursor для запроса, содержащего PIVOT ?  [new]
Кентурион Крысобой
Member

Откуда:
Сообщений: 202
-2-
Выкини свою гуеподелку. Правильные пацпны пользуются SQL*Plus'ом.

Разобрался: по привычке поставил перед словом 'pivot' имя источника, который надо транспонировать - 'p' (так требуется синтаксисом m$ sql, в котором доводилось работать).
В sqlplus это прокатило "на ура":
SQL> create or replace procedure testl( a_plan_id in int, result out int, val1 out int, val2 out int, val3 out int )
  2  as
  3  cursor r2_get_acnt_ids is
  4      select  "161" result, "162" val1, "163" val2, "164" val3
  5      from(
  6          select  node,val
  7            from xecint
  8            where owner =2000194 and node IN (161, 162, 163, 164)
  9      ) p
 10      pivot (max(val) for node IN (161, 162, 163, 164));
 11
 12    begin
 13      null;
 14    end;
 15  /

Procedure created.
А в TOAD 10.5.1.3 вызвало сообщение, которое я привёл выше. Удалив 'p', получил щасье.
Всем спасибо :-)
14 янв 11, 15:15    [10073298]     Ответить | Цитировать Сообщить модератору
 Re: Как объявить cursor для запроса, содержащего PIVOT ?  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
orawish
Кентурион Крысобой,

начните с
select  "161" result from dual;

Все там нормально:
DB11G/XTENDER> select  "161" result from (select 161 v from dual) pivot (max('ok') for v in(161));

RE
--
ok

1 row selected.
14 янв 11, 16:56    [10074207]     Ответить | Цитировать Сообщить модератору
 Re: Как объявить cursor для запроса, содержащего PIVOT ?  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Хотя, конечно, не очень так смотрится, лучше хоть как-то объяснить, например:
select beer, whisky.... from ... pivot (max(...) for v in(161 beer, 162 whisky...));
14 янв 11, 16:59    [10074238]     Ответить | Цитировать Сообщить модератору
 Re: Как объявить cursor для запроса, содержащего PIVOT ?  [new]
Кентурион Крысобой
Member

Откуда:
Сообщений: 202
xtender
Хотя, конечно, не очень так смотрится, лучше хоть как-то объяснить, например:
select beer, whisky.... from ... pivot (max(...) for v in(161 beer, 162 whisky...));
не, там названия колонок должны быть именно такими: "161" etc :-)
14 янв 11, 18:45    [10075005]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить