【问题标题】:Updating partitioned table oracle更新分区表 oracle
【发布时间】:2018-09-13 04:32:49
【问题描述】:

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

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


    【解决方案1】:

    您要解决的问题是什么?对循环中的每个分区运行单独的 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( &lt;&lt;partition name&gt;&gt; ) 语法绝对是最后的手段。如果你真的下定决心要走这条路,你需要使用动态 SQL,在循环中构造 SQL 语句并使用EXECUTE IMMEDIATEdbms_sql 来执行它。

    【讨论】:

    • 我同意,...只是出于好奇,您能想出一个有意义的情况来使用该语法吗?
    • @MichalPravda - 找出插入了哪些分区行(当人们使用多列分区键而不真正了解它们的操作方式时会定期出现)或确定哈希分区策略是否很有用在分区或您使用系统分区的位置大致平均分布数据。但是,只有系统分区才会涉及应用程序代码使用partition (&lt;&lt;name&gt;&gt;) 语法有意义的情况。 oracle-base.com/articles/11g/…
    • 我遇到的一个有意义的分区 (...) 语法情况是以直接路径模式将并发会话加载到同一个表中(每个正在运行的会话在其自己的分区中)。分区语法有助于避免会话相互阻塞。
    【解决方案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)
    

    例如

    select * from bills partition (p201403)
    

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

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

    【讨论】:

    • 感谢您的建议,我很困惑 oracle 是否会隐式处理它。现在将使用并行,看看它是怎么回事。将向您更新结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2019-05-11
    • 2019-03-06
    • 2017-03-22
    • 1970-01-01
    相关资源
    最近更新 更多