首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新分区表oracle

问更新分区表oracle
EN

Stack Overflow用户
提问于 2014-04-04 03:53:35
回答 2查看 9.5K关注 0票数 1

您好,我有一个分区表,当我试图更新在循环中使用少量选定分区并动态传递分区名称时,它不起作用。

代码语言:javascript
复制
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对象包含我要在其中执行此更新的所有分区。

请建议我如何在这里进行。

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2014-04-04 04:06:50

您正在尝试解决的问题是什么?对循环中的每个分区运行单独的UPDATE语句是没有意义的。如果您确实想更新表中ab = 'c'所在位置的每一行,只需发出一条UPDATE语句

代码语言:javascript
复制
UPDATE cdr_data cdt
   SET a = 'B'
 WHERE ab = 'c'

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

如果你真的,真的想独立地更新每个分区,那么基于分区键进行更新会更有意义。例如,如果您的表具有基于日期的每日分区

代码语言:javascript
复制
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 IMMEDIATE或dbms_sql来执行它。

票数 3
EN

Stack Overflow用户

发布于 2014-04-04 04:05:12

最好让Oracle负责分区-在语句中假装它们不存在

代码语言:javascript
复制
UPDATE cdr_data  cdt SET A='B' WHERE cdt.ab='c'

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

当你需要一个有分区限制的DML时,可能很少发生这种情况,但它肯定不是所示的例子。在这种情况下,您不能动态提供分区名称,就像您通常不能动态提供表名一样,例如您不能

代码语言:javascript
复制
select * from _variable_containing_table_name

如果您真的坚持使用分区有界命令,那么它将是

代码语言:javascript
复制
select * from table_name partition (partition_Name)

例如:

代码语言:javascript
复制
select * from bills partition (p201403)

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

但同样,不要选择分区,Oracle将选择分区。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22847652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档