powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / запрос возвращающий таблицу с произвольным количеством столбцов
36 сообщений из 36, показаны все 2 страниц
запрос возвращающий таблицу с произвольным количеством столбцов
    #40104296
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
имеется таблица

value................row......col
----------------------------------
синий...............1..........1
розовый...........1..........2
голубой...........1..........3
оранжевый.....2..........1
зелёный...........2..........2

как написать запрос который мне вернёт эту таблицу в таком виде

сol1...................сol2...........сol3
---------------------------------------------
синий................розовый...голубой
оранжевый......зелёный...NULL

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

неубедительно

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

Давайте полную постановку задачи,
откуда появляются такие таблицы? рождаются из воздуха?
Если количество таких таблиц ограничено

В каком виде Вы хотите получить результат, (неопределенные таблицы либо в виде sysrefcursor, либо строкой),
и что Вы с полученным резултатом будете делать.
Скорее всего задача решается по другому и гораздо проще.

памятка:
HOWTO :: Как правильно задавать вопросы
Как мне оформить свое сообщение?
Студентам, желающим помощи

1) Полная постановка задачи (без сокращений)

2) Подготовьте тестовые данные, лучше в виде with
пример (не ваш случай) в конце

3) Покажите что сделали, что получили, без сокращений. ( лучше не в виде screenshot)

4) используйте Тэги, читать код без них неудобно, правильно оформляйте сообщение

Пример подготовленных данных, запроса и вывода.
Код: 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.
-- table 1 with column list
with user_tab(user_id,user_name,registry_date) as (
select 1,'Bob',to_date('11.02.1921 23:04:44','DD.MM.YYYY HH24:MI:SS') from dual union all
select 2,'Max',to_date('11.02.1922 23:04:44','DD.MM.YYYY HH24:MI:SS') from dual union all
select 3,'Jon',to_date('11.02.1923 23:04:44','DD.MM.YYYY HH24:MI:SS') from dual
)
-- table 2 with column list
,user_post(post_id,user_id,parent_post_id,post_date,message) as (
select 100,1,null,to_date('11.02.1923 23:04:00','DD.MM.YYYY HH24:MI:SS'),'Hi' from dual union all
select 101,2,100,to_date('11.02.1923 23:05:23','DD.MM.YYYY HH24:MI:SS'),'Hi' from dual union all
select 102,3,100,to_date('11.02.1923 23:05:35','DD.MM.YYYY HH24:MI:SS'),'Hi' from dual union all
select 103,1,102,to_date('11.02.1923 23:06:00','DD.MM.YYYY HH24:MI:SS'),'How are you' from dual union all
select 104,2,102,to_date('11.02.1923 23:07:05','DD.MM.YYYY HH24:MI:SS'),'All right!' from dual union all
select 105,1,101,to_date('11.02.1923 23:06:21','DD.MM.YYYY HH24:MI:SS'),'Bye' from dual union all
select 106,1,104,to_date('11.02.1923 23:04:37','DD.MM.YYYY HH24:MI:SS'),'Bye' from dual union all
select 107,2,null,to_date('11.02.1923 23:08:56','DD.MM.YYYY HH24:MI:SS'),'Hmm' from dual
)
select
rpad(to_char(p.post_date,'YYYY-MM-DD HH24:MI:SS  '),20+level*2,' ')||u.user_name||': '||p.message as txt
from 
 user_post p
 join user_tab  u on ( p.user_id = u.user_id)
where p.post_date >= u.registry_date
start with p.parent_post_id is null 
connect by prior p.post_id=p.parent_post_id 
;

TXT
--------------------------------------------------------------------------------
1923-02-11 23:04:00   Bob: Hi
1923-02-11 23:05:23     Max: Hi
1923-02-11 23:06:21       Bob: Bye
1923-02-11 23:05:35     Jon: Hi
1923-02-11 23:06:00       Bob: How are you
1923-02-11 23:07:05       Max: All right!
1923-02-11 23:04:37         Bob: Bye
1923-02-11 23:08:56   Max: Hmm

8 rows selected.
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40104360
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
таблицы в информационной системе, на которую я не влияю. Результат мне нужен в таком же виде как если бы я сделал обычный SELECT, именно такие запросы отрисовываются в отчётах в виде таблиц. В моей власти только составлять эти запросы. Уверен както через переменные или циклы это можно реализовать
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40104366
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmskmskmsВ моей власти только составлять эти запросы. Уверен както через переменные или
циклы это можно реализовать

Нет. Это нужен отчёт стиля "шахматка". Если отчётник его не поддерживает - обломись.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40104438
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmskmskms,

PRIVATE TEMPORARY TABLE.

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

Подавляющее количество отчеток умеет crosstab, который и является правильным решением задачи.
Еще одним подходом к решению может быть динамическая генерация запросов либо в слое-поставщике данных для отчетки, либо в БД (на базе weak ref cursor, пакета dbms_sql или их комбинации).
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40104686
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хорошо, я могу както создать тип TYPE t_col IS RECORD(...) но с произвольным количеством столбцов переданном в функции?
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40104694
Алымов Анатолий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmskmskms
таблицы в информационной системе, на которую я не влияю. Результат мне нужен в таком же виде как если бы я сделал обычный SELECT, именно такие запросы отрисовываются в отчётах в виде таблиц. В моей власти только составлять эти запросы. Уверен както через переменные или циклы это можно реализовать

Почему бы не делать обычный SELECT?
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40104718
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алымов Анатолий, напишите пример, каким образом это возможно?
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40104722
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmskmskms,

В общем виде - это невозможно. Максимум, что можно - написать pivot запрос (см. документацию) в виде
Код: sql
1.
select * from my_table pivot (count(*) for col in (1, 2, 3))

где 1, 2, 3 - возможные значения в столбце col. Их нужно перечислить явно. Соответственно, если в столбце col у вас месяцы в году, то они будут все время разные, и запрос нужно будет все время менять. А если у вас там, например, филиалы вашей компании, которых всего пять, и новые в следующие 10 лет не появятся, то сойдет и так.
Поэтому у вас и просят подробности постановки задачи - в зависимости от задачи, где-то можно будет срезать угол.
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40104728
Алымов Анатолий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmskmskms
Алымов Анатолий, напишите пример, каким образом это возможно?

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

PRIVATE TEMPORARY TABLE.


Исходная таблица:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
drop table test_tbl purge
/
create table test_tbl as (
                          select 'blue' val,1 rn,1 col from dual union all
                          select 'pink',1,2 from dual union all
                          select 'azure',1,3 from dual union all
                          select 'orange',2,1 from dual union all
                          select 'green',2,2 from dual
                         )
/



Создаем процедуру:

Код: 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.
create or replace
  procedure create_pivot_test_tbl_ptt
    authid current_user
    is
        v_stmt clob := 'CREATE PRIVATE TEMPORARY TABLE ORA$PTT_PIVOT_TEST_TBL AS SELECT ';
        v_cnt  number;
    begin
        select  count(*)
          into  v_cnt
          from  user_private_temp_tables
          where table_name = 'ORA$PTT_PIVOT_TEST_TBL';
        if v_cnt = 1
          then
            execute immediate 'DROP TABLE ORA$PTT_PIVOT_TEST_TBL PURGE';
            commit; -- важно
        end if;
        select  max(col)
          into  v_cnt
          from  test_tbl;
        for v_i in 1..v_cnt loop
          v_stmt := v_stmt || 'MAX(CASE COL WHEN ' || v_i || ' THEN VAL END) COL' || v_i || ',';
        end loop;
        v_stmt := rtrim(v_stmt,',') || ' FROM TEST_TBL GROUP BY RN ORDER BY RN';
        execute immediate v_stmt;
end;
/

Procedure created.

SQL>



Выполняем процедуру и затем select из PTT:

Код: 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.
SQL> exec create_pivot_test_tbl_ptt

PL/SQL procedure successfully completed.

SQL> select  *
  2    from  ora$ptt_pivot_test_tbl
  3  /

COL1   COL2   COL3
------ ------ ------
blue   pink   azure
orange green

SQL> insert
  2    into  test_tbl
  3    values(
  4           'yellow',
  5           1,
  6           7
  7          )
  8  /

1 row created.

SQL> exec create_pivot_test_tbl_ptt

PL/SQL procedure successfully completed.

SQL> select  *
  2    from  ora$ptt_pivot_test_tbl
  3  /

COL1   COL2   COL3   COL4   COL5   COL6   COL7
------ ------ ------ ------ ------ ------ ------
blue   pink   azure                       yellow
orange green

SQL> insert
  2    into  test_tbl
  3    values(
  4           'teal',
  5           3,
  6           4
  7          )
  8  /

1 row created.

SQL> exec create_pivot_test_tbl_ptt

PL/SQL procedure successfully completed.

SQL> select  *
  2    from  ora$ptt_pivot_test_tbl
  3  /

COL1   COL2   COL3   COL4   COL5   COL6   COL7
------ ------ ------ ------ ------ ------ ------
blue   pink   azure                       yellow
orange green
                     teal

SQL>



Из минусов:

1. процедура автоматом коммитит.
2. PTT хранится в памяти.

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

SY

PRIVATE TEMPORARY TABLE.

1. процедура автоматом коммитит.
2. PTT хранится в памяти.

SY.


Два вопросика для общего развития
1. Eсли создать в автономной, будет ли видна TEMPORARY в "основной транзакции".
2. задействуется ли весь механизм undo (сегменты отката) и соответственно redo (насколько я помню,
rollback сегменты журнализируются) при выполнении ДМЛ над PRIVATE TEMPORARY TABLE?

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

Два вопросика для общего развития
1. Eсли создать в автономной, будет ли видна TEMPORARY в "основной транзакции".
2. задействуется ли весь механизм undo (сегменты отката) и соответственно redo (насколько я помню,
rollback сегменты журнализируются) при выполнении ДМЛ над PRIVATE TEMPORARY TABLE?


1. Будет если создать с ON COMMIT PRESERVE DEFINITION. Но автономная не видит незакоммиченные изменения основной.
2. механизм undo (сегменты отката) - да если ON COMMIT PRESERVE DEFINITION (куда PTT UNDO пишется в память или в TEMP - не знаю). REDO - нет PTT хранится в памяти а UNDO либо памяти либо в TEMP. REDO (начиная c 12C) нет и для GTT т.к. GTT хранится в TEMP и GTT UNDO также (начиная c 12C) пишется в TEMP.

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

2. механизм undo (сегменты отката) - да если ON COMMIT PRESERVE DEFINITION (куда PTT UNDO пишется в память или в TEMP - не знаю)

SY.

спасибо

с ТЕМР примерно понятно, я о undo (роллбек сегментам), раз туда пишется,
а "блоки" роллбек логируются (поправте если ошибаюсь),
то при ДМЛ с PRIVATE TEMPORARY в логи будет будет всетаки инфа записываться?
или они (оракл) знают, что ето TEMPORARY и в лог нифига не пишут?

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

с ТЕМР примерно понятно, я о undo (роллбек сегментам), раз туда пишется,
а "блоки" роллбек логируются (поправте если ошибаюсь),


Stax, TEMP tablespace не логируется, память тоже.

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

Stax

с ТЕМР примерно понятно, я о undo (роллбек сегментам), раз туда пишется,
а "блоки" роллбек логируются (поправте если ошибаюсь),


Stax, TEMP tablespace не логируется, память тоже.

SY.


ето (TEMP tablespace не логируется, память тоже) мне понятно

не понятно с роллбек инфой, да бог с ней

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

не понятно с роллбек инфой


Temp table UNDO пишется в TEMP tablespace (а для PTT возможно в память). Ни TEMP tablespace ни память не логируется, ergo temp table UNDO не логируется.

SY.
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40105248
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYTemp table UNDO пишется в TEMP tablespace (а для PTT возможно в память). Ни TEMP tablespace ни память не логируется, ergo temp table UNDO не логируется.
Это не всегда так, а по умолчанию совсем не так.
Подробнее смотрите в документации: Managing Temporary Undo
авторBy default, undo records for temporary tables are stored in the undo tablespace and are logged in the redo, which is the same way undo is managed for persistent tables. However, you can use the TEMP_UNDO_ENABLED initialization parameter to separate undo for temporary tables from undo for persistent tables. When this parameter is set to TRUE, the undo for temporary tables is called temporary undo.
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40105262
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeaGate,

Ну если хочешь писать никому не нужные GTT UNDO в REDO то флаг в руки. А вот с PTT и это не выйдет.

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

SYНу если хочешь писать никому не нужные GTT UNDO в REDO то флаг в руки.
По умолчанию, будет работать именно так, независимо от того где находится флаг.
SYА вот с PTT и это не выйдет.
Это не верно.
Код: 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.
146.
147.
148.
149.
150.
151.
152.
153.
154.
SQL> @q
SQL> conn tc/tc@localhost/pdb
Connected.
SQL>
SQL> set echo on
SQL>
SQL> alter session set temp_undo_enabled=false;

Session altered.

SQL>
SQL> create private temporary table ora$ptt_t(x int);

Table created.

SQL>
SQL> select used_urec, used_ublk
  2    from v$session s, v$transaction t
  3   where s.sid = sys_context('userenv', 'sid')
  4     and t.addr = s.taddr;

no rows selected

SQL>
SQL> set autot trace stat
SQL>
SQL> insert into ora$ptt_t
  2  select rownum
  3    from dual
  4    connect by level<=5;

5 rows created.


Statistics
----------------------------------------------------------
         12  recursive calls
          8  db block gets
          6  consistent gets
          0  physical reads
        324  redo size
        195  bytes sent via SQL*Net to client
        420  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
          5  rows processed

SQL>
SQL> update ora$ptt_t
  2     set x = x+1
  3   where x = 1;

1 row updated.


Statistics
----------------------------------------------------------
          5  recursive calls
          1  db block gets
          7  consistent gets
          0  physical reads
        200  redo size
        195  bytes sent via SQL*Net to client
        395  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>
SQL> update ora$ptt_t
  2     set x = x+1
  3   where x = 2;

2 rows updated.


Statistics
----------------------------------------------------------
          4  recursive calls
          1  db block gets
          7  consistent gets
          0  physical reads
        240  redo size
        195  bytes sent via SQL*Net to client
        395  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          2  rows processed

SQL>
SQL> set autot off
SQL>
SQL> select used_urec, used_ublk
  2    from v$session s, v$transaction t
  3   where s.sid=sys_context('userenv', 'sid')
  4     and t.addr = s.taddr;

 USED_UREC  USED_UBLK
---------- ----------
         3          1

SQL>
SQL> select blocks, segtype
  2    from v$tempseg_usage
  3   where session_num=(select serial# from v$session where sid=sys_context('userenv', 'sid'));

    BLOCKS SEGTYPE
---------- ---------
       128 DATA

SQL>
SQL> col xid old_v xid
SQL> select replace(dbms_transaction.local_transaction_id, '.', ' ') xid from dual;

XID
--------------------------------------------------------------------------------
1 21 1389

SQL>
SQL> commit;

Commit complete.

SQL>
SQL> col member old_v member
SQL> select member from v$logfile where group#=(select group# from v$log where status='CURRENT') and rownum=1;

MEMBER
--------------------------------------------------------------------------------
+DATA/ORCL/ONLINELOG/group_3.260.1010265813

SQL>
SQL> alter system dump logfile '&member.' xid &xid.;
old   1: alter system dump logfile '&member.' xid &xid.
new   1: alter system dump logfile '+DATA/ORCL/ONLINELOG/group_3.260.1010265813' xid 1 21 1389

System altered.

SQL>
SQL> select value from v$diag_info where name='Default Trace File';

VALUE
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_8258.trc

SQL> select banner_full from v$version;

BANNER_FULL
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.9.0.0.0


redo:
Код: 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.
REDO RECORD - Thread:1 RBA: 0x00011d.00005adc.0010 LEN: 0x0144 VLD: 0x05 CON_UID: 2343465708
SCN: 0x00000000013ddc16 SUBSCN:  1 10/18/2021 17:35:20
CHANGE #1 CON_ID:3 TYP:0 CLS:17 AFN:48 DBA:0x01800080 OBJ:4294967295 SCN:0x00000000013ddbe0 SEQ:1 OP:5.2 ENC:0 RBL:0 FLG:0x0000
ktudh redo: slt: 0x0015 sqn: 0x0000056d flg: 0x0052 siz: 124 fbi: 0
            uba: 0x018003f7.0074.1d    pxid:  0x0000.000.00000000        pdbid:2343465708
CHANGE #2 CON_ID:3 TYP:0 CLS:18 AFN:48 DBA:0x018003f7 OBJ:4294967295 SCN:0x00000000013ddbdf SEQ:1 OP:5.1 ENC:0 RBL:0 FLG:0x0000
ktudb redo: siz: 124 spc: 4102 flg: 0x0012 seq: 0x0074 rec: 0x1d
            xid:  0x0001.015.0000056d
ktubl redo: slt: 21 wrp: 1 flg: 0x0c28 prev dba:  0x00000000 rci: 0 opc: 11.1 [objn: 4254950947 objd: 4195207 tsn: 3]
[Undo type  ] Regular undo  [User undo done   ]  No  [Last buffer split]  No
[Temp object]          Yes  [Tablespace Undo  ]  No  [User only        ]  No
Begin trans
 prev ctl uba: 0x018003f7.0074.1c prev ctl max cmt scn:  0x00000000013dd4b9
 prev tx cmt scn:  0x00000000013dd4d1
 txn start scn:  0xffffffffffffffff  logon user: 78
 prev brb:  0x018003e8  prev bcl:  0x00000000
BuExt idx: 0 flg2: 0
KDO undo record:
KTB Redo
op: 0x03  ver: 0x01
compat bit: 4 (post-11) padding: 1
op: Z
KDO Op code: QMD row dependencies Disabled
  xtype: XA flags: 0x00000000  bdba: 0x00400388  hdba: 0x00400387
itli: 1  ispac: 0  maxfr: 4863
tabn: 0 lock: 0 nrow: 5
slot[0]: 0
slot[1]: 1
slot[2]: 2
slot[3]: 3
slot[4]: 4

REDO RECORD - Thread:1 RBA: 0x00011d.00005adc.0154 LEN: 0x00c8 VLD: 0x01 CON_UID: 2343465708
SCN: 0x00000000013ddc16 SUBSCN:  1 10/18/2021 17:35:20
CHANGE #1 CON_ID:3 TYP:0 CLS:18 AFN:48 DBA:0x018003f7 OBJ:4294967295 SCN:0x00000000013ddc16 SEQ:1 OP:5.1 ENC:0 RBL:0 FLG:0x0000
ktudb redo: siz: 120 spc: 3976 flg: 0x0022 seq: 0x0074 rec: 0x1e
            xid:  0x0001.015.0000056d
ktubu redo: slt: 21 wrp: 1389 flg: 0x0020 prev dba:  0x00000000 rci: 29 opc: 11.1 [objn: 4254950947 objd: 4195207 tsn: 3]
[Undo type  ] Regular undo  [User undo done   ]  No  [Last buffer split]  No
[Temp object]          Yes  [Tablespace Undo  ]  No  [User only        ]  No
KDO undo record:
KTB Redo
op: 0x02  ver: 0x01
compat bit: 4 (post-11) padding: 1
op: C  uba: 0x018003f7.0074.1d
Array Update of 1 rows:
tabn: 0 slot: 0(0x0) flag: 0x2c lock: 1 ckix: 182
ncol: 1 nnew: 1 size: 0
KDO Op code:  21 row dependencies Disabled
  xtype: XAxtype KDO_KDOM2 flags: 0x00000080  bdba: 0x00400388  hdba: 0x00400387
itli: 1  ispac: 0  maxfr: 4863
vect = 0
col  0: [ 2]  c1 02

REDO RECORD - Thread:1 RBA: 0x00011d.00005add.002c LEN: 0x00f0 VLD: 0x01 CON_UID: 2343465708
SCN: 0x00000000013ddc16 SUBSCN:  1 10/18/2021 17:35:20
CHANGE #1 CON_ID:3 TYP:0 CLS:18 AFN:48 DBA:0x018003f7 OBJ:4294967295 SCN:0x00000000013ddc16 SEQ:2 OP:5.1 ENC:0 RBL:0 FLG:0x0000
ktudb redo: siz: 160 spc: 3854 flg: 0x0022 seq: 0x0074 rec: 0x1f
            xid:  0x0001.015.0000056d
ktubu redo: slt: 21 wrp: 1389 flg: 0x0020 prev dba:  0x00000000 rci: 30 opc: 11.1 [objn: 4254950947 objd: 4195207 tsn: 3]
[Undo type  ] Regular undo  [User undo done   ]  No  [Last buffer split]  No
[Temp object]          Yes  [Tablespace Undo  ]  No  [User only        ]  No
KDO undo record:
KTB Redo
op: 0x02  ver: 0x01
compat bit: 4 (post-11) padding: 1
op: C  uba: 0x018003f7.0074.1e
Array Update of 2 rows:
tabn: 0 slot: 0(0x0) flag: 0x2c lock: 1 ckix: 0
ncol: 1 nnew: 1 size: 0
KDO Op code:  21 row dependencies Disabled
  xtype: XAxtype KDO_KDOM2 flags: 0x00000080  bdba: 0x00400388  hdba: 0x00400387
itli: 1  ispac: 0  maxfr: 4863
vect = 0
col  0: [ 2]  c1 03
tabn: 0 slot: 1(0x1) flag: 0x2c lock: 1 ckix: 0
ncol: 1 nnew: 1 size: 0
KDO Op code:  21 row dependencies Disabled
  xtype: XAxtype KDO_KDOM2 flags: 0x00000080  bdba: 0x00400388  hdba: 0x00400387
itli: 1  ispac: 0  maxfr: 4863
vect = 0
col  0: [ 2]  c1 03

REDO RECORD - Thread:1 RBA: 0x00011d.00005add.011c LEN: 0x0068 VLD: 0x01 CON_UID: 2343465708
SCN: 0x00000000013ddc17 SUBSCN:  1 10/18/2021 17:35:20
CHANGE #1 CON_ID:3 TYP:0 CLS:17 AFN:48 DBA:0x01800080 OBJ:4294967295 SCN:0x00000000013ddc16 SEQ:1 OP:5.4 ENC:0 RBL:0 FLG:0x0000
ktucm redo: slt: 0x0015 sqn: 0x0000056d srt: 0 sta: 9 flg: 0x2 ktucf redo: uba: 0x018003f7.0074.1f ext: 4 spc: 3692 fbi: 0
END OF REDO DUMP

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

Значит был неправ когда решил что если PTT в памяти то и UNDO там же (хотя и сомневался: "куда PTT UNDO пишется в память или в TEMP - не знаю"). У нас temp_undo_enabled=true заложено в new database template. Не знаю почему Oracle решил дефолтное значение false.

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

Спасибо


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

PRIVATE TEMPORARY TABLE.

Соломон, я так и не понял, в чём преимущество подхода с PTT против классических ref cursor на динамическом sql или даже просто выдачи текста динамического sql на клиента даже при условии, что клиент в состоянии делать два вызова к серверу БД для генерации одного отчёта?
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40105400
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous

Соломон, я так и не понял, в чём преимущество подхода с PTT против классических ref cursor на динамическом sql или даже просто выдачи текста динамического sql на клиента даже при условии, что клиент в состоянии делать два вызова к серверу БД для генерации одного отчёта?


PTT это чисто SQL решение. Конечно если клиент на OCI, java, .NET python, ... "REF cursor на динамическом sql или даже просто выдачи текста динамического sql на клиента даже при условии, что клиент в состоянии делать два вызова к серверу БД для генерации одного отчёта" проще. И по большому счету на таких клиентах все что нужно это SELECT T.*,MAX(COL) OVER(PARTITION BY RN) COL_CNT FROM TEST_TBL T ORDER BY RN;
Кстати, как с PTT так и с "REF cursor на динамическом sql или даже просто выдачи текста динамического sql на клиента даже при условии, что клиент в состоянии делать два вызова к серверу БД для генерации одного отчёта" мы имеем потенциальный разрыв - SQL генерируется исходя из числа полей - MAX(COL) на момент выдачи SELECT а данные на момент создания PTT/выдачи динамического sql. Т.е. если в промежутке другая сессия закоммитила DELETE TEST_TBL WHERE COL = 3; то PTT/динамический SQL выдаст 3 поля и COL3 будет NULL во всех строках. Так-что по идее надо-бы взять текущий SCN и плясать от него как и в определении числа полей так и выборки данных.

SY.
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40105409
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
andrey_anonymous
классических ref cursor на динамическом sql
имхо проще и правильнее было бы использовать Implicit Statement Results (DBMS_SQL.RETURN_RESULT)
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40105410
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
PTT это чисто SQL решение.
А exec кто делает?
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40105433
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov
Implicit Statement Results (DBMS_SQL.RETURN_RESULT)

Уж больно оно новомодное.
Есть подозрение, что не каждый клиент справится - там апишка на клиенте вроде как своя (get_next_resultset).
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40105472
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег
SY
PTT это чисто SQL решение.
А exec кто делает?


SQL решение в смысле никаких сторонних tools типа Java, C++, .NET... и самое главное мы получаем результат через SELECT.

SY.
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40105477
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл про 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.
drop table test_tbl purge
/
drop sequence test_tbl_seq
/
create table test_tbl as (
                          select 'blue' val,1 rn,1 col from dual union all
                          select 'pink',1,2 from dual union all
                          select 'azure',1,3 from dual union all
                          select 'orange',2,1 from dual union all
                          select 'green',2,2 from dual
                         )
/
create or replace
  function pivot_test_tbl_macro
    return varchar2
    sql_macro
    is
        v_stmt clob := 'SELECT ';
        v_cnt  number;
    begin
        select  max(col)
          into  v_cnt
          from  test_tbl;
        for v_i in 1..v_cnt loop
          v_stmt := v_stmt || 'MAX(CASE COL WHEN ' || v_i || ' THEN VAL END) COL' || v_i || ',';
        end loop;
        v_stmt := rtrim(v_stmt,',') || ' FROM TEST_TBL GROUP BY RN ORDER BY RN';
        execute immediate v_stmt;
        return v_stmt;
end;
/
create sequence test_tbl_seq -- для форсирования 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.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
SQL> set verify off
SQL> column test_tbl_seq new_value test_tbl_seq noprint
SQL> select  test_tbl_seq.nextval test_tbl_seq
  2    from  dual
  3  /

SQL> select  *
  2    from  table(pivot_test_tbl_macro) -- execution &test_tbl_seq (форсируем hard parse чтобы SQL_MACRO вызывалось при каждом обращении)
  3  /

COL1   COL2   COL3
------ ------ ------
blue   pink   azure
orange green

SQL> insert
  2    into  test_tbl
  3    values(
  4           'yellow',
  5           1,
  6           7
  7          )
  8  /

1 row created.

SQL> select  test_tbl_seq.nextval test_tbl_seq
  2    from  dual
  3  /

SQL> select  *
  2    from  table(pivot_test_tbl_macro) -- execution &test_tbl_seq (форсируем hard parse чтобы SQL_MACRO вызывалось при каждом обращении)
  3  /

COL1   COL2   COL3   COL4   COL5   COL6   COL7
------ ------ ------ ------ ------ ------ ------
blue   pink   azure                       yellow
orange green

SQL> insert
  2    into  test_tbl
  3    values(
  4           'teal',
  5           3,
  6           4
  7          )
  8  /

1 row created.

SQL> select  test_tbl_seq.nextval test_tbl_seq
  2    from  dual
  3  /

SQL> select  *
  2    from  table(pivot_test_tbl_macro) -- execution &test_tbl_seq (форсируем hard parse чтобы SQL_MACRO вызывалось при каждом обращении)
  3  /

COL1   COL2   COL3   COL4   COL5   COL6   COL7
------ ------ ------ ------ ------ ------ ------
blue   pink   azure                       yellow
orange green
                     teal

SQL>



SY.
...
Рейтинг: 0 / 0
запрос возвращающий таблицу с произвольным количеством столбцов
    #40105504
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Забыл про SQL макро, правда придется форсировать hard parse:
SY.


test_tbl_seq.nextval форсирует hard parse?

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

test_tbl_seq.nextval форсирует hard parse?
stax


Не сам по себе а:

Код: plsql
1.
2.
3.
select  *
  from  table(pivot_test_tbl_macro) -- execution &test_tbl_seq (форсируем hard parse чтобы SQL_MACRO вызывалось при каждом обращении)
/



Посему каждый раз имеем новый SQL текст которого нет в shared pool так-что hard parse. Из минусов - пухнущий shared pool. Можно избежать:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create or replace
  function pivot_test_tbl_macro
    return varchar2
    sql_macro
    is
        v_stmt clob := 'SELECT ';
        v_cnt  number;
    begin
        select  max(col)
          into  v_cnt
          from  test_tbl;
        for v_i in 1..v_cnt loop
          v_stmt := v_stmt || 'MAX(CASE COL WHEN ' || v_i || ' THEN VAL END) COL' || v_i || ',';
        end loop;
        v_stmt := rtrim(v_stmt,',') || ' FROM TEST_TBL GROUP BY RN ORDER BY RN';
        execute immediate v_stmt;
        return v_stmt;
end;
/



Теперь:

Код: 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.
SQL> set verify off
SQL> column column_count new_value column_count noprint
SQL> select  max(col) column_count
  2    from  test_tbl
  3  /

SQL> select  *
  2    from  table(pivot_test_tbl_macro) -- column count is &column_count форсируем hard parse чтобы SQL_MACRO вызывалось при каждом новом числе полей
  3  /

COL1   COL2   COL3
------ ------ ------
blue   pink   azure
orange green

SQL> insert
  2    into  test_tbl
  3    values(
  4           'yellow',
  5           1,
  6           7
  7          )
  8  /

1 row created.

SQL> select  max(col) column_count
  2    from  test_tbl
  3  /

SQL> select  *
  2    from  table(pivot_test_tbl_macro) -- column count is &column_count форсируем hard parse чтобы SQL_MACRO вызывалось при каждом новом числе полей
  3  /

COL1   COL2   COL3   COL4   COL5   COL6   COL7
------ ------ ------ ------ ------ ------ ------
blue   pink   azure                       yellow
orange green

SQL> insert
  2    into  test_tbl
  3    values(
  4           'teal',
  5           3,
  6           4
  7          )
  8  /

1 row created.

SQL> select  max(col) column_count
  2    from  test_tbl
  3  /

SQL> select  *
  2    from  table(pivot_test_tbl_macro) -- column count is &column_count форсируем hard parse чтобы SQL_MACRO вызывалось при каждом новом числе полей
  3  /

COL1   COL2   COL3   COL4   COL5   COL6   COL7
------ ------ ------ ------ ------ ------ ------
blue   pink   azure                       yellow
orange green
                     teal

SQL> delete test_tbl
  2   where col = 7
  3  /

1 row deleted.

SQL> select  max(col) column_count
  2    from  test_tbl
  3  /

SQL> select  *
  2    from  table(pivot_test_tbl_macro) -- column count is &column_count форсируем hard parse чтобы SQL_MACRO вызывалось при каждом новом числе полей
  3  /

COL1   COL2   COL3   COL4
------ ------ ------ ------
blue   pink   azure
orange green
                     teal

SQL>



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


Не сам по себе а:



понял, я проморгал амперсанд

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


Число столбцов определяется только при hard parse посему что бы не использовалось (ODCI interface, SQL macro, polymorphic table function...) мы будем вынуждены форсировать 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.
SQL> select  *
  2    from  table(pivot_test_tbl_macro)
  3  /

COL1   COL2   COL3   COL4
------ ------ ------ ------
blue   pink   azure
orange green
                     teal

SQL> insert
  2    into  test_tbl
  3    values(
  4           'yellow',
  5           1,
  6           7
  7          )
  8  /

1 row created.

SQL>  -- не форсируем hard parse
SQL>  select  *
  2    from  table(pivot_test_tbl_macro)
  3  /

COL1   COL2   COL3   COL4
------ ------ ------ ------
blue   pink   azure
orange green
                     teal

SQL> select  *
  2    from  table(pivot_test_tbl_macro) -- column count 7 форсируем hard parse
  3  /

COL1   COL2   COL3   COL4   COL5   COL6   COL7
------ ------ ------ ------ ------ ------ ------
blue   pink   azure                       yellow
orange green
                     teal

SQL>



Первый SELECT в shared pool Oracle не находит и выполняет hard parse вызывая SQL macro который конструирует SELECT с четырьмя полями. Затем мы вставляем запись с COL=7 т.е. теперь надо вывести 7 полей. Однако при последующем выполнении идентичного SELECTа (абсолютно идентичный текст) Oracle находит SQL текст в shared pool и использует его. Посему SQL macro (ODCI interface, polymorphic table - любой метод переменного числа полей) не вызывается и последующие выполнения идентичного SELECTа выдадут 4 поля независимо от MAX(COL). А как только мы изменили текст SELECTа и Oracle не находит новый текст в shared pool то выполняется hard parse, вызывается SQL macro который конструирует SELECT с семью полями.

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

вызывается SQL macro который конструирует SELECT с семью полями.
SY.

имхо

то что с макро не парсится, ето скорее косяк, чем достоинство

добавили б хинт (прагму) парсить в любом случае (независимо от наличия в шаред пуле)

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


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