Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / запрос возвращающий таблицу с произвольным количеством столбцов / 25 сообщений из 36, страница 1 из 2
14.10.2021, 09:20
    #40104296
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос возвращающий таблицу с произвольным количеством столбцов
имеется таблица

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

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

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

количество заданных столбцов и строк может быть любым
тоесть таблицу надо строить исходя из максимальных
...
Рейтинг: 0 / 0
14.10.2021, 10:18
    #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
14.10.2021, 12:52
    #40104360
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос возвращающий таблицу с произвольным количеством столбцов
таблицы в информационной системе, на которую я не влияю. Результат мне нужен в таком же виде как если бы я сделал обычный SELECT, именно такие запросы отрисовываются в отчётах в виде таблиц. В моей власти только составлять эти запросы. Уверен както через переменные или циклы это можно реализовать
...
Рейтинг: 0 / 0
14.10.2021, 13:04
    #40104366
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос возвращающий таблицу с произвольным количеством столбцов
kmskmskmsВ моей власти только составлять эти запросы. Уверен както через переменные или
циклы это можно реализовать

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

PRIVATE TEMPORARY TABLE.

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

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

Почему бы не делать обычный SELECT?
...
Рейтинг: 0 / 0
15.10.2021, 13:13
    #40104718
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос возвращающий таблицу с произвольным количеством столбцов
Алымов Анатолий, напишите пример, каким образом это возможно?
...
Рейтинг: 0 / 0
15.10.2021, 13:23
    #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
15.10.2021, 13:45
    #40104728
Алымов Анатолий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос возвращающий таблицу с произвольным количеством столбцов
kmskmskms
Алымов Анатолий, напишите пример, каким образом это возможно?

Не понятно что вы можете сделать. Какими инструментами оперируете. И что в итоге хотите получить.
В первом приближении клиентская часть просто выполняется нужный select и получает результат какой ей надо
...
Рейтинг: 0 / 0
15.10.2021, 16:16
    #40104761
SY
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
18.10.2021, 09:45
    #40105093
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос возвращающий таблицу с произвольным количеством столбцов
SY

SY

PRIVATE TEMPORARY TABLE.

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

SY.


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

.....
stax
...
Рейтинг: 0 / 0
18.10.2021, 13:10
    #40105152
SY
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
18.10.2021, 14:26
    #40105176
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос возвращающий таблицу с произвольным количеством столбцов
SY

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

SY.

спасибо

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

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

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


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

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

Stax

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


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

SY.


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

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

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

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


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

SY.
...
Рейтинг: 0 / 0
18.10.2021, 17:15
    #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
18.10.2021, 18:19
    #40105262
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос возвращающий таблицу с произвольным количеством столбцов
SeaGate,

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

SY.
...
Рейтинг: 0 / 0
18.10.2021, 19:45
    #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
18.10.2021, 21:23
    #40105280
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос возвращающий таблицу с произвольным количеством столбцов
SeaGate,

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

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

Спасибо


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

PRIVATE TEMPORARY TABLE.

Соломон, я так и не понял, в чём преимущество подхода с PTT против классических ref cursor на динамическом sql или даже просто выдачи текста динамического sql на клиента даже при условии, что клиент в состоянии делать два вызова к серверу БД для генерации одного отчёта?
...
Рейтинг: 0 / 0
19.10.2021, 13:56
    #40105400
SY
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / запрос возвращающий таблицу с произвольным количеством столбцов / 25 сообщений из 36, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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