powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / не пойму как тут можно выкрутиться.
25 сообщений из 29, страница 1 из 2
не пойму как тут можно выкрутиться.
    #39272018
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!
есть на входе в pl/sql функцию пакета результат работы предыдущего компонента в виде таблицы, естессно.

исходная таблица:
"номер точки""время корректировки""величина корректировки"3131231316546464601.11.15 00:00:0098.9873131231316546464601.12.15 00:00:0078.7923131231316546464601.01.16 00:00:0080.9693131231316546464601.02.16 00:00:0039.0953131231316546464601.03.16 00:00:0023.5483131231316546464601.04.16 00:00:0012.7263131231316546464601.05.16 00:00:0013.5243131231316546464601.06.16 00:00:007.9523131231316546464601.07.16 00:00:006.7486543219674987324101.12.15 00:00:0063.2876543219674987324101.01.16 00:00:0027.9516543219674987324101.02.16 00:00:0030.9896543219674987324101.03.16 00:00:0032.26543219674987324101.04.16 00:00:0013.8186543219674987324101.05.16 00:00:0014.4136543219674987324101.06.16 00:00:0012.9926543219674987324101.07.16 00:00:004.9429875416732164613501.11.15 00:00:00136.0039875416732164613501.12.15 00:00:00212.8849875416732164613501.01.16 00:00:00122.4379875416732164613501.02.16 00:00:0078.963964741598529896401.12.15 00:00:0093.2053964741598529896401.02.16 00:00:009.243964741598529896401.03.16 00:00:005.883964741598529896401.04.16 00:00:0011.763964741598529896401.05.16 00:00:003.153964741598529896401.06.16 00:00:001.263964741598529896401.07.16 00:00:001.624
надо из этих исходных данных перейти к таким:
"номер точки""1""2""3""4""5""6""7""8""9"3131231316546464698.98778.79280.96939.09523.54812.72613.5247.9526.7486543219674987324163.28727.95130.98932.213.81814.41312.9924.94298754167321646135136.003212.884122.43778.963964741598529896493.2059.245.8811.763.151.261.624

не используя, ясно дело, число "9" как жестко известный предел кол-ва данных.
по горизонтали должно быть столько пронумерованных столбцов по сгруппированным точкам,
сколько их найдется в исходных данных. Т.е. если бы вдруг записей о первой точке было бы
15, к примеру - значит 15 пронумерованных столбцов и должно быть.
Несуществующие данные для точек, как видно - ничем не заполняются. (null).
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272022
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй pivot , правда если сможешь выкрутиться и не упасть от неизвестный предел кол-ва данных.
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272050
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
черт, все усложняется. после последнего столбца нужен еще один. Итого по всем строкам.
помогайте товарищи! как написать подходящий динамический код?
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272066
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Познающий,

Ты сначала обьясни как ты будешь обрабатывать результаты если число столбцов неизвестно?

SY.
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272083
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Познающийчерт, все усложняется. после последнего столбца нужен еще один. Итого по всем строкам.
помогайте товарищи! как написать подходящий динамический код?

PIVOT через OdciTable интерфейс. Например Anton Scheffer's dynamic pivot function . Теперь создаем последовательность для поддержки hard parse (важно!):

Код: plsql
1.
2.
3.
4.
5.
6.
SQL> create sequence force_hard_parse
  2  /

Sequence created.

SQL> 



Теперь делаем пивот с обеспечением hard parse:

Код: 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.
column force_hard_parse new_value force_hard_parse noprint
select  force_hard_parse.nextval force_hard_parse
  from  dual
/
select  /* &force_hard_parse */ *
  from  table(
              pivot(
                    'select  correction_point,
                             rn,
                             sum(correction_value) val
                       from  (
                              select  correction_point,
                                      lpad(dense_rank() over(order by correction_date nulls last),4) rn,
                                      correction_value
                                from  (
                                       select  correction_point,
                                               correction_date,
                                               sum(correction_value) correction_value
                                         from  tbl
                                         group by grouping sets(
                                                                (correction_point),
                                                                (correction_point,
                                                                 correction_date
                                                                )
                                                               )
                                      )
                             )
                       group by correction_point,
                                rn'
                   )
             )
/
old   1: select  /* &force_hard_parse */ *
new   1: select  /*          1 */ *

  CORRECTION_POINT          1          2          3          4          5          6          7          8          9         10
------------------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
 39647415985298964                93.205                  9.24       5.88      11.76       3.15       1.26      1.624    126.119
 65432196749873241                63.287     27.951     30.989       32.2     13.818     14.413     12.992      4.942    200.592
 31312313165464646     98.987     78.792     80.969     39.095     23.548     12.726     13.524      7.952      6.748    362.341
 98754167321646135    136.003    212.884    122.437      78.96                                                           550.284

SQL> 



Только все это баловство. Реально это нужно в отчетах и посему любой генератов отчетов делает все это куда проще.

SY.
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272161
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У нас нет генератора. и задачи ставят четко по имеющемуся по.
т.е. есть субд оракл, таблицы в нем, данные. по ним надо как то
сделать то, что описано. буквально.
результаты выводятся потом в табличном виде в стороннюю прогу,
что умеет работать с оракл по оси интерфейсу.
И к примеру, вот выше моего поста результат не буквален.
таблица итоговая имеет null ячейки не в тех местах, как у меня
в примере нарисовано....

увы, селяви. надо как то выкрутиться. или очень убедительно
доказать, что это невозможно.
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272214
nata44845
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Познающий,

Если уж совсем без вариантов, тогда обрабатывать в программе, к примеру при выводе в ексель идешь по курсору (ADOQuery или чего там у вас), номер столбца (j) увеличиваешь, значение 1 столбца сохраняешь в переменную (X), как только в первой колонке меняется значение (Value<>X) номер строки (i) набавляешь, j сбрасываешь на 1.
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272307
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nata44845Познающий,

Если уж совсем без вариантов, тогда обрабатывать в программе, к примеру при выводе в ексель идешь по курсору (ADOQuery или чего там у вас), номер столбца (j) увеличиваешь, значение 1 столбца сохраняешь в переменную (X), как только в первой колонке меняется значение (Value<>X) номер строки (i) набавляешь, j сбрасываешь на 1.

ну нет такой возможности. Прога только принимает таблицу. Ее надо сформировать как-то на стороне базы.
ИЛИ !доказательно! пояснить, что это невозможно сделать при текущих условиях.
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272314
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не пойму - тут вообще никак нельзя редактировать свои же сообщения?

Добавка. А если ограничиться все же константой столбцов в число 12, к примеру.
Допустим этот момент я еще смогу "пробить" в ТЗ. Хотя щаз этого и нельзя делать.

Этот момент упростит положение? Как то легче станет?
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272317
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не пойму - тут вообще никак нельзя редактировать свои же сообщения?

Добавка. А если ограничиться все же константой столбцов в число 12, к примеру.
Допустим этот момент я еще смогу "пробить" в ТЗ. Хотя щаз этого и нельзя делать.

Этот момент упростит положение? Как то легче станет?
P.S. точнее не просто 12, а ПОСЛЕДНИЕ 12 записей - т.к. есть сортировка по полю
даты, как видно из исходных данных в первом моем посте.
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272322
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПознающийДобавка. А если ограничиться все же константой столбцов в число 12, к примеру.
Допустим этот момент я еще смогу "пробить" в ТЗ. Хотя щаз этого и нельзя делать.

Этот момент упростит положение? Как то легче станет?
P.S. точнее не просто 12, а ПОСЛЕДНИЕ 12 записей - т.к. есть сортировка по полю
даты, как видно из исходных данных в первом моем посте.
легче станет - тогда можно использовать pivot с фиксированным набором полей
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272330
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что должно получиться? варианты - новая табличка - вьюшка.
Ну так, можно по данным посчитать количество колонок и заполнить, последовательно, из pl-sql кода, и скормить.

как надо, так и заполнить. некрасиво, но работает. и задать регламент уничтожения, этих времянок, допустим через три дня. Или меньше - по оповещению от внешней системы, что данные забрали.

т.е. если нужно из оракла сделать эксель с вба - то нужно из оракла делать .... эксель с вба ... последовательно рисующий в ячейках?
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272480
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПознающийИ к примеру, вот выше моего поста результат не буквален.
таблица итоговая имеет 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
column force_hard_parse new_value force_hard_parse noprint
select  force_hard_parse.nextval force_hard_parse
  from  dual
/
select  /* &force_hard_parse */ *
  from  table(
              pivot(
                    'select  correction_point,
                             rn,
                             sum(correction_value) val
                       from  (
                              select  correction_point,
                                      lpad(row_number() over(
                                                             partition by correction_point
                                                             order by correction_date nulls last
                                                            ),
                                           4
                                          ) rn,
                                      correction_value
                                from  (
                                       select  correction_point,
                                               correction_date,
                                               sum(correction_value) correction_value
                                         from  tbl
                                         group by grouping sets(
                                                                (correction_point),
                                                                (correction_point,
                                                                 correction_date
                                                                )
                                                               )
                                      )
                             )
                       group by correction_point,
                                rn'
                   )
             )
/

  CORRECTION_POINT          1          2          3          4          5          6          7          8          9         10
------------------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
 39647415985298964     93.205       9.24       5.88      11.76       3.15       1.26      1.624    126.119
 65432196749873241     63.287     27.951     30.989       32.2     13.818     14.413     12.992      4.942    200.592
 31312313165464646     98.987     78.792     80.969     39.095     23.548     12.726     13.524      7.952      6.748    362.341
 98754167321646135    136.003    212.884    122.437      78.96    550.284

SQL> 



Или если хочешь все итоги в последнем столбце:

Код: 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.
column force_hard_parse new_value force_hard_parse noprint
select  force_hard_parse.nextval force_hard_parse
  from  dual
/
select  /* &force_hard_parse */ *
  from  table(
              pivot(
                    'select  correction_point,
                             rn,
                             sum(correction_value) val
                       from  (
                              select  correction_point,
                                      lpad(
                                           case
                                             when correction_date is null
                                               then dense_rank() over(
                                                                      order by correction_date nulls last
                                                                     )
                                             else dense_rank() over(
                                                                    partition by correction_point
                                                                    order by correction_date nulls last
                                                                   )
                                           end,
                                           4
                                          ) rn,
                                      correction_value
                                from  (
                                       select  correction_point,
                                               correction_date,
                                               sum(correction_value) correction_value
                                         from  tbl
                                         group by grouping sets(
                                                                (correction_point),
                                                                (correction_point,
                                                                 correction_date
                                                                )
                                                               )
                                      )
                             )
                       group by correction_point,
                                rn'
                   )
             )
/
old   1: select  /* &force_hard_parse */ *
new   1: select  /*          3 */ *

  CORRECTION_POINT          1          2          3          4          5          6          7          8          9         10
------------------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
 39647415985298964     93.205       9.24       5.88      11.76       3.15       1.26      1.624                          126.119
 65432196749873241     63.287     27.951     30.989       32.2     13.818     14.413     12.992      4.942               200.592
 31312313165464646     98.987     78.792     80.969     39.095     23.548     12.726     13.524      7.952      6.748    362.341
 98754167321646135    136.003    212.884    122.437      78.96                                                           550.284

SQL> 



SY.
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272550
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

странно, но
для моего
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
на Ваш код я получаю
ORA-00904: "PIVOT": недопустимый идентификатор
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272559
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПознающийSY,

странно, но
для моего
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
на Ваш код я получаю
ORA-00904: "PIVOT": недопустимый идентификатор

у меня прокатывает только такое строение pivot оператора:

SELECT * FROM
(
SELECT column1, column2
FROM tables
WHERE conditions
)
PIVOT
(
aggregate_function(column2)
FOR column2
IN ( expr1, expr2, ... expr_n) | subquery
)
ORDER BY expression [ ASC | DESC ];
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272564
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Познающийстранно, но


Ты прочитал по-диагонали:

SYНапример Anton Scheffer's dynamic pivot function .

Ты этот zip скачал? Тaм есть pivotFun.sql. Вот он-то и создает ф-цию pivot (не путать с PIVOT clause - Антон нeудачно, IMHO, выбрал имя ф-ции).

SY.
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272565
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Познающийна Ваш код я получаю
ORA-00904: "PIVOT": недопустимый идентификаторГлаза разуй: 19397255
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272570
Amiri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1:
Click

2:
Код: 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.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
create or replace type varchar2_table as table of varchar2(4000);
 /
create or replace package PKG_PIVOT is

  function pivot_sql (
                      p_max_cols_query in varchar2 default null
                     , p_query in varchar2
                     , p_anchor in varchar2_table
                     , p_pivot in varchar2_table
                     , p_pivot_head_sql in varchar2_table default varchar2_table()
                     ) 
  return varchar2;
  
  function pivot_ref (
                         p_max_cols_query in varchar2 default null
                      , p_query in varchar2
                      , p_anchor in varchar2_table
                      , p_pivot in varchar2_table
                      , p_pivot_name in varchar2_table default varchar2_table()
                      )
  return sys_refcursor;

end PKG_PIVOT;
 /
create or replace package body PKG_PIVOT is
 /**
 * Function returning query
 */
  function pivot_sql (
                      p_max_cols_query in varchar2 default null
                     , p_query in varchar2
                     , p_anchor in varchar2_table
                     , p_pivot in varchar2_table
                     , p_pivot_head_sql in varchar2_table
                     ) return varchar2
                     is
     l_max_cols number;
     l_query varchar2(4000);
     l_pivot_name varchar2_table:=varchar2_table();
     k integer;
     c1 sys_refcursor;
     v varchar2(30);
  begin
     -- Получаем кол-во столбцов
    if (p_max_cols_query is not null) then
      execute immediate p_max_cols_query
         into l_max_cols;
     else
      raise_application_error (-20001, 'Cannot figure out max cols');
     end if;

     -- Собираем по кускам необходимый нам запрос
    l_query := 'select ';

     for i in 1 .. p_anchor.count loop
      l_query := l_query || p_anchor (i) || ',';
     end loop;
     --Получаем названия колонок
    k:=1;
     if p_pivot_head_sql.count=p_pivot.count
      then
          for j in 1 .. p_pivot.count loop
             open c1 for p_pivot_head_sql(j);
             loop
              fetch c1 into v;
              l_pivot_name.extend(1);
              l_pivot_name(k):=v;
              EXIT WHEN c1%NOTFOUND;
              k:=k+1;
             end loop;
          end loop;
     end if;
      
     -- Добавляем колонки с полученными названиями
    -- в виде "max(decode(rn,1,C{X+1},null)) c_name+1_1"
     for i in 1 .. l_max_cols loop
      for j in 1 .. p_pivot.count loop
         l_query := l_query || 'max(decode(rn,' || i || ',' || p_pivot (j) || ',null)) '
                   ||'"' ||l_pivot_name ((j-1)*l_max_cols+i) ||'"'|| ',';
      end loop;
     end loop;

     -- Вставляем исходный запрос
    l_query := rtrim (l_query, ',') || ' from ( ' || p_query || ') group by ';

     -- Группируем по колонкам
    for i in 1 .. p_anchor.count loop
      l_query := l_query || p_anchor (i) || ',';
     end loop;

     l_query := rtrim (l_query, ',');

     -- Возвращаем готовый SQL запрос
    return l_query;
  end;
  
 /**
 * Функция возвращающая курсор на выполненный запрос
*/
  function pivot_ref (
                      p_max_cols_query in varchar2 default null
                     , p_query in varchar2
                     , p_anchor in varchar2_table
                     , p_pivot in varchar2_table
                     , p_pivot_name in varchar2_table
                     ) return sys_refcursor
                     is
     p_cursor sys_refcursor;
  begin
     execute immediate 'alter session set cursor_sharing=force';
     open p_cursor for pkg_pivot.pivot_sql (
                      p_max_cols_query
                     , p_query
                     , p_anchor
                     , p_pivot
                     , p_pivot_name
                     );
     execute immediate 'alter session set cursor_sharing=exact';
     return p_cursor;
  end;
end PKG_PIVOT;
 /



Пример использования:

begin
  :qq:=pkg_pivot.pivot_sql(
                              'select count(distinct trunc(dt)) from actions'
                             , 'select e.name name,sum(a.cnt) sum_cnt,a.dt,dense_rank() over(order by dt) rn from actions a left join emp e on e.id=a.emp group by e.name,a.dt'
                             , varchar2_table('NAME')
                             , varchar2_table('SUM_CNT')
                             , varchar2_table('select distinct ''Date ''||trunc(dt) from actions')
                          );
  :qc :=pkg_pivot.pivot_ref(
                              'select count(distinct trunc(dt)) from actions'
                             , 'select e.name,sum(a.cnt) sum_cnt,a.dt,dense_rank() over(order by dt) rn from actions a left join emp e on e.id=a.emp group by e.name,a.dt'
                             , varchar2_table('NAME')
                             , varchar2_table('SUM_CNT')
                             , varchar2_table('select distinct ''Date ''||trunc(dt) from actions')
                          );
end;

* This source code was highlighted with Source Code Highlighter.
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272582
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ндя, однако тяжелый способ самоубийства выходит.....
ладно. применим этот новый pivot.

но надо заметить, что в исходном посте фраза "Например ..{ссылка}.." никоим образом не подводит к тому,
что ТОЛЬКО после скачки архива с доп.функционалом я могу воспользоваться советом.
"Например - это всего лишь пример. Значит можно и не этот вариант брать" - я так посчитал...
и взял стандартный pivot clause....

ок, спасибо всем за всю эту науку. бум вчитываться дальше....
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272630
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

кстати, в ветке https://asktom.oracle.com/pls/apex/f?p=100:11:0::::p11_question_id:4843682300346852395
за два поста до конца - Антон выкатил модифицированную версию этого "комбайна".
Правда не ясно - проблему с hard|soft parse и мульти-сессионностью решил он или нет, но проект развивался с 2006.
А Вы на форуме http://www.orafaq.com/forum/mv/msg/201346/653342/#msg_653342 как бы точку в обсуждениях не поставили?
Barbara Boehmer осталась при мнении что решена проблема, а Вы - что не до конца?
А предложенное мне решение - оно тоже с "подводными камнями"? Есть вариант, что я не получу верный итоговый отчет?

К примеру, как дела с очередностью?
всегда ли вертикальные столбцы
"1""2""3""4""5""6""7""8""9"
гарантированно будут в таком порядке?
я нашел обсуждение - проблема с очередностью "вывернутых" строк в столбцы - актуальна для этого "комбайна"
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39272664
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Познающий,

Проблему hard pass обойти нeльзя. Мы вынуждены форсировать hard parse каждый раз посколько данные и соответственно число столбцов могли измениться и только hard pass вызывает OdciTableDescribe который и отвечает за опредeлeния числa столбцов. Решить её можно выполняя каждый раз тот-же SQL с другим текстом (например каждый раз рaзный комментарий). Я привел пример как это cдeлать в SQL*Plus. В том же SQL*Plus можно:

Код: 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.
variable v_cur refcursor
declare
    v_force_hard_parse number;
begin
    v_force_hard_parse := force_hard_parse.nextval;
    open :v_cur
      for
        'select  /* ' || v_force_hard_parse || ' */ *
          from  table(
                      pivot(
                            ''select  correction_point,
                                      rn,
                                      sum(correction_value) val
                                from  (
                                       select  correction_point,
                                               lpad(
                                                    case
                                                      when correction_date is null
                                                        then dense_rank() over(
                                                                               order by correction_date nulls last
                                                                              )
                                                      else dense_rank() over(
                                                                             partition by correction_point
                                                                             order by correction_date nulls last
                                                                            )
                                                    end,
                                                    4
                                                   ) rn,
                                               correction_value
                                         from  (
                                                select  correction_point,
                                                        correction_date,
                                                        sum(correction_value) correction_value
                                                  from  tbl
                                                  group by grouping sets(
                                                                         (correction_point),
                                                                         (correction_point,
                                                                          correction_date
                                                                         )
                                                                        )
                                               )
                                      )
                                group by correction_point,
                                         rn''
                            )
                      )';
end;
/
print v_cur

  CORRECTION_POINT          1          2          3          4          5          6          7          8          9         10
------------------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
 39647415985298964     93.205       9.24       5.88      11.76       3.15       1.26      1.624                          126.119
 65432196749873241     63.287     27.951     30.989       32.2     13.818     14.413     12.992      4.942               200.592
 31312313165464646     98.987     78.792     80.969     39.095     23.548     12.726     13.524      7.952      6.748    362.341
 98754167321646135    136.003    212.884    122.437      78.96                                                           550.284

SQL> 



SY.
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39273120
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что-то не везет мне с этим "комбайном"

ORA-29913: ошибка при выполнении ODCITABLEDESCRIBE callout
29913. 00000 - "error in executing %s callout"
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39273208
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Познающийчто-то не везет мне с этим "комбайном"

ORA-29913: ошибка при выполнении ODCITABLEDESCRIBE callout
29913. 00000 - "error in executing %s callout"

Перeд тм как подкинуть SELECT ф-ции pivot проверь работает ли сам SELECT. Затем проверь годится ли он для ф-ции pivot - например ф-ция pivot не хавает WITH clause - необходимо все пихать в in-line view как в моем вызове.

SY.
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39273250
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ок, с этой ошибкой разобрался.
но теперь другая хрень: последний 10 столбец ЕСТЬ, но его содержимое не всё верное:
ТОЧКИ 1 2 3 4 5 6 7 8 9 1098754167321646135136.003212.884122.43778.96550.2846543219674987324163.28727.95130.98932.213.81814.41312.9924.942200.5923964741598529896493.2059.245.8811.763.151.261.624126.1193131231316546464698.98778.79280.96939.09523.54812.72613.5247.9526.748362.341

а - понял - его содержимое "прижалось" к данным.
к примеру, первая строка - сумма "550.284" - она в 5 столбце - сразу за данными,
а не в отдельном, специальном итоговом 10 столбце.

это вот как вышло??? у Вас верный результат, а у меня шиш....
...
Рейтинг: 0 / 0
не пойму как тут можно выкрутиться.
    #39273256
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
стоп-стоп! сам дурак!
все нашел и понял... отбой тревоге!
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / не пойму как тут можно выкрутиться.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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