|
|
|
Составное имя партиции ???
|
|||
|---|---|---|---|
|
#18+
--Здравствуйте. Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production PL/SQL Release 11.2.0.2.0 - Production --Подскажите, как можно обойти ограничение указывания конкретного имени партиции? --Какая есть возможность select/update/delete/exchange данные из/в секцию таблицы измменяя имя секции делая его составным --не используя CASE, IF, ELSIF : --ТИПА select * from pro_partition_names partition('P'||'201706'); select * from pro_partition_names partition(concat('P','201707')); select * from pro_partition_names partition(concat('P',to_char(sysdate,'YYYY.MM'))); SELECT * FROM pro_partition_names PARTITION FOR (to_char(sysdate,'DD.MM.YYYY')); --Стандартное все конечно работает: --Создаем таблицу: CREATE TABLE pro_partition_names ( num_id int, oper_date date, docnum number ) PARTITION BY RANGE(oper_date) (partition p201705 values less than (to_date('01.06.2017','DD.MM.YYYY')) tablespace TBLSP1, partition p201706 values less than (to_date('01.07.2017','DD.MM.YYYY')) tablespace TBLSP1, partition p201707 values less than (to_date('01.08.2017','DD.MM.YYYY')) tablespace TBLSP1, partition p201708 values less than (to_date('01.09.2017','DD.MM.YYYY')) tablespace TBLSP1, partition p_max values less than (maxvalue) tablespace TBLSP1 ); --создаем временную таблицу: CREATE GLOBAL TEMPORARY TABLE pro_partition_names_tmp ( num_id int, oper_date date, docnum number ); -- Это все работает: insert into pro_partition_names partition for ('23.06.2017') values (1, to_date('11.05.2017', 'dd.mm.yyyy'), 25); insert into pro_partition_names partition (p201705) values (2, to_date('21.05.2017', 'dd.mm.yyyy'), 12); insert into pro_partition_names partition for ('23.07.2017') values (3, to_date('16.06.2017', 'dd.mm.yyyy'), 15); insert into pro_partition_names partition (p201706) values (5, to_date('22.06.2017', 'dd.mm.yyyy'), 33); insert into pro_partition_names partition for ('23.08.2017') values (3, to_date('16.07.2017', 'dd.mm.yyyy'), 15); insert into pro_partition_names partition (p201707) values (5, to_date('22.07.2017', 'dd.mm.yyyy'), 33); select * from pro_partition_names partition (p201706); select * from pro_partition_names partition for ('15.06.2017'); select * from pro_partition_names partition for ('01.07.2017'); alter table pro_partition_names exchange partition p201707 with table pro_partition_names_tmp without validation ; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 00:27 |
|
||
|
Составное имя партиции ???
|
|||
|---|---|---|---|
|
#18+
gsvg, в статичном SQL имена всех объектов должны быть известны до компиляции кода. если есть необходимость динамически подставлять значения имен таблиц, секций, полей, то и запрос должен быть - динамическим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 06:54 |
|
||
|
Составное имя партиции ???
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эх, Ответ понял. Можете привести простой пример динамического Iinsert в секцию, Delete секции или Exchange секция таблица на моих таблицах? Заранее благодарен. Начало понимаю запроса понимаю, а далее ...... Может Так ? EXECUTE IMMEDIATE 'insert into pro_partition_names partition (P' ||to_char(t.oper_date,'YYYY.MM') || ') SELECT num_id , oper_date , docnum number FROM pro_partition_names_tmp t; ' ; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 12:52 |
|
||
|
Составное имя партиции ???
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эх, Ответ понял. Можете привести простой пример динамического Iinsert в секцию, Delete секции или Exchange секция таблица на моих таблицах? Заранее благодарен. Начало понимаю запроса понимаю, а далее ...... Может Так ? EXECUTE IMMEDIATE INSERT INTO pro_partition_names PARTITION (P' || TO_CHAR(t.oper_date,'YYYY.MM') || ') SELECT num_id , oper_date , docnum number FROM pro_partition_names_tmp t; ' ; EXECUTE IMMEDIATE 'ALTER TABLE pro_partition_names EXCHANGE PARTITION P' || TO_CHAR(SYSDATE,'YYYY.MM') || ') WITH TABLE pro_partition_names_tmp WITHOUT VALIDATION' ; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 13:00 |
|
||
|
Составное имя партиции ???
|
|||
|---|---|---|---|
|
#18+
gsvg--Здравствуйте. Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production PL/SQL Release 11.2.0.2.0 - Production --Подскажите, как можно обойти ограничение указывания конкретного имени партиции? .. select * from pro_partition_names partition for ('01.07.2017'); .. дык сам же и спросил и .. ответил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 13:31 |
|
||
|
Составное имя партиции ???
|
|||
|---|---|---|---|
|
#18+
orawishgsvg select * from pro_partition_names partition for ('01.07.2017'); .. дык сам же и спросил и .. ответил Объясните кто-нибудь коллеге gsvg что такое nls-зависимость и для чего нужны date literal... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 14:08 |
|
||
|
Составное имя партиции ???
|
|||
|---|---|---|---|
|
#18+
Всем спасибо. Разобрался. Вопрос только остался один. Таблицы TMP похоже нельзя использовать в обмене: EXECUTE IMMEDIATE 'ALTER TABLE pro_partition_names EXCHANGE PARTITION (p'||TO_CHAR(coalesce(l_oper_date,TRUNC(SYSDATE)),'YYYYMM')||') WITH TABLE pro_partition_names_tmp WITHOUT VALIDATION'; Выдает ошибку: ORA-14132 "table cannot be used in EXCHANGE" . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 16:03 |
|
||
|
Составное имя партиции ???
|
|||
|---|---|---|---|
|
#18+
gsvgРазобрался. Вопрос только остался один. Таблицы TMP похоже нельзя использовать в обмене: А говорил - "разобрался"... TMP-таблицы они как и где хранятся? А exchange что с чем меняет? Так понятнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 16:09 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39487427&tid=1885616]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
154ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 418ms |

| 0 / 0 |
