2017-09-02 1137 views
0

我有一个需求,我需要在表的多个分区上运行更新脚本。我写它的脚本如下:ORA-14108:非法分区扩展表名的语法

但它给

ORA-14108:非法的分区扩展表名语法

原因:要访问只能指定分区使用它的名字。用户试图使用分区号或绑定变量。

操作:修改声明指使用其名称

任何想法,我怎么能绕过这个误差的分区?

DECLARE 

TYPE partition_names IS varray(1) OF varchar2(20); 

curr_partition partition_names; 

LENGTH integer; 

BEGIN 

curr_partition :=partition_names('SM_20090731'); 

LENGTH := curr_partition.count; 


FOR i IN 1 .. LENGTH LOOP 

dbms_output.put_line('Current Partition name is: '||curr_partition(i)); 

UPDATE TABLE_Y PARTITION (curr_partition(i)) 
SET PARTITION_KEY=TO_DATE('2017-08-21','YYYY-MM-DD') 
WHERE ORDER_ID IN 
    (SELECT ORDER_ID 
    FROM TABLE_X); 

END LOOP; 

END; 

/

回答

3

您将在以连接分区名称,并使用动态SQL,即

EXECUTE IMMEDIATE 
    'UPDATE TABLE_Y PARTITION (' || curr_partition(i) || ') 
    SET PARTITION_KEY=TO_DATE(''2017-08-21'',''YYYY-MM-DD'') 
    WHERE ORDER_ID IN 
     (SELECT ORDER_ID 
     FROM TABLE_X)'; 

只要运行SQL SELECT查询或INSERT,从PL/SQL,绑定UPDATEDELETE声明变量用于将任何PL/SQL表达式的值传递给SQL引擎。特别是,绑定参数将用于curr_partition(i)。但是,看起来这样的查询和语句的PARTITION子句不支持绑定参数。我猜这是因为Oracle试图在查询或语句具有绑定参数值之前创建执行计划,但如果查询或语句指定了分区,则该信息是计划的关键部分,因此无法提供在绑定参数中。