Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新分区表oracle_Oracle_Plsql_Partitioning - Fatal编程技术网

更新分区表oracle

更新分区表oracle,oracle,plsql,partitioning,Oracle,Plsql,Partitioning,您好,我有一个分区表,当我尝试在循环中动态传递分区名称以获取几个选定分区进行更新时,它不起作用 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\u tbl对象具有我要在其中执行此更新的所有分区 请告诉我如何在这里进行 提前感谢最好让Oracle负责分区-在声明中假装分区不存在

您好,我有一个分区表,当我尝试在循环中动态传递分区名称以获取几个选定分区进行更新时,它不起作用

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\u tbl对象具有我要在其中执行此更新的所有分区

请告诉我如何在这里进行


提前感谢

最好让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)
e、 g

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


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

最好让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)
e、 g

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


但是再次强调,不要选择分区,Oracle会这样做。

您试图解决的问题是什么?对循环中的每个分区运行单独的
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;
用于1中的i。。
环
更新cdr_数据cdt
设置a='B'
其中ab='c'
和分区_key=+i;
端环;

使用
分区()
语法绝对是最后的选择。如果你真的决定走这条路,你需要使用动态SQL,在循环中构造SQL语句,并使用
executeimmediate
dbms\u SQL
来执行它。

你试图解决的问题是什么?对循环中的每个分区运行单独的
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;
用于1中的i。。
环
更新cdr_数据cdt
设置a='B'
其中ab='c'
和分区_key=+i;
端环;

使用
分区()
语法绝对是最后的选择。如果你真的决定走这条路,你需要使用动态SQL,在循环中构造SQL语句,并使用
executeimmediate
dbms\u SQL
来执行它。

我同意。。。出于好奇,你能想出一个有意义的情况来使用这种语法吗?@MichalPravda-找出插入了哪些分区行是很有用的(当人们使用多列分区键而不真正了解它们如何操作时,会定期出现这种情况)或者确定散列分区策略是在分区之间大致相等地分布数据,还是在使用系统分区。不过,只有系统分区才会涉及应用程序代码使用
partition()
语法的情况。我遇到的分区(…)语法的一个有意义的情况是以直接路径模式将并发会话加载到同一个表中(每个正在运行的会话在其自己的分区中)。分区语法有助于避免会话相互阻塞。。。出于好奇,你能想出一个有意义的情况来使用这种语法吗?@MichalPravda-找出插入了哪些分区行是很有用的(当人们使用多列分区键而不真正了解它们如何操作时,会定期出现这种情况)或者确定散列分区策略是在分区之间大致相等地分布数据,还是在使用系统分区。不过,只有系统分区才会涉及应用程序代码使用
partition()
语法的情况。我遇到的分区(…)语法的一个有意义的情况是以直接路径模式将并发会话加载到同一个表中(每个正在运行的会话在其自己的分区中)。分区语法有助于避免会话相互阻塞。感谢您的建议,我不知道oracle是否会隐式处理它。现在我们将使用parallel,看看它是如何运行的。谢谢你的建议,我不知道甲骨文是否会暗中处理它。现在我们将使用parallel,看看它是如何运行的。将向您更新结果