更新分区表oracle

问题描述 投票:1回答:2

嗨我有一个分区表,当我试图更新在循环中的几个选定的分区动态传递分区名称,它不起作用。

for i in 1..partition_tbl.count Loop

UPDATE cdr_data PARTITION(partition_tbl(i)) cdt
SET A='B'
WHERE
cdt.ab='c'

End Loop;

partition_tbl对象具有我要在其中执行此更新的所有分区。

请建议我如何继续这里。

提前致谢

oracle plsql partitioning
2个回答
3
投票

你试图解决的问题是什么?对循环中的每个分区运行单独的UPDATE语句没有意义。如果你真的想更新ab = 'c'表中的每一行,只需发出一个UPDATE语句

UPDATE cdr_data cdt
   SET a = 'B'
 WHERE ab = 'c'

可能有一个PARALLEL提示,允许Oracle并行更新多个分区。

如果您确实想要独立更新每个分区,那么基于分区键这样做会更有意义。例如,如果您的表具有基于日期的每日分区

FOR i IN 1 .. <<number of daily partitions>>
LOOP
  UPDATE cdr_data cdt
     SET a = 'B'
   WHERE ab = 'c'
     AND partition_key = <<minimum date>> + i;
END LOOP;

使用partition( <<partition name>> )语法是绝对的最后手段。如果您真的决定沿着这条路走下去,那么您需要使用动态SQL,在循环中构造SQL语句并使用EXECUTE IMMEDIATEdbms_sql来执行它。


2
投票

最好让Oracle关注分区 - 假装在你的语句中它们不存在

UPDATE cdr_data  cdt SET A='B' WHERE cdt.ab='c'

它将从where条件和您的分区定义中选择要应用命令的正确分区。

当您需要分区有界DML时,可能会有罕见的事件,但肯定不是显示的示例。在这种情况下,您无法动态提供分区名称,例如您通常无法动态提供表名称,例如你不能

select * from _variable_containing_table_name

如果你真的坚持分区有界命令那么它就是

select * from table_name partition (partition_Name)

EG

select * from bills partition (p201403)

要使用动态分区名称,必须通过execute immediate或dbms_sql动态执行整个语句。

但是再一次,不要选择分区,Oracle会。

© www.soinside.com 2019 - 2024. All rights reserved.