Updating partitioned table oracle

匆匆过客 提交于 2019-12-11 10:34:29

问题


Hi I have a partitioned table and when I am trying to update taking few selected partition in a loop with passing partition name dynamically, it s not working.

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;

The partition_tbl object has all the partition in which I want to perform this update.

Please suggest me how to proceed here.

Thanks in advance


回答1:


What is the problem that you are trying to solve? It doesn't make sense to run separate UPDATE statements against each partition in a loop. If you really want to update every row in the table where ab = 'c', just issue a single UPDATE statement

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

potentially with a PARALLEL hint that would allow Oracle to update multiple partitions in parallel.

If you really, really want to update each partition independently, it would make much more sense to do so based on the partition keys. For example, if your table has daily partitions based on a date

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;

Using the partition( <<partition name>> ) syntax is an absolute last resort. If you're really determined to go down that path, you'd need to use dynamic SQL, constructing the SQL statement in the loop and using EXECUTE IMMEDIATE or dbms_sql to execute it.




回答2:


Preferably let Oracle take care about partitions - pretend in your statement they do not exist

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

it will from the where conditions and your partitions definitions choose the right partition(s) to apply the command on.

There may be rare event when you need a partition bounded DML, but certainly it is not the example shown. In such situation you can't provide partition name dynamically, like you can't normally provide table name dynamically e.g. you can't

select * from _variable_containing_table_name

If you really insist on partition bounded command then it would be

select * from table_name partition (partition_Name)

e.g.

select * from bills partition (p201403)

To use dynamic partition name the whole statement would have to be dynamically executed via execute immediate or dbms_sql.

But once again, do not choose partition, Oracle will.



来源:https://stackoverflow.com/questions/22847652/updating-partitioned-table-oracle

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!