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

时间:2017-09-02 11:57:34

标签: database oracle plsql oracle11g partitioning

我有一个要求,我需要在表的多个分区上运行更新脚本。我为它写了一个脚本如下:

但它给出了

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;

/

1 个答案:

答案 0 :(得分: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)';

每当您从PL / SQL运行SQL SELECT查询或INSERTUPDATEDELETE语句时,绑定变量都会用于传入SQL引擎任何PL / SQL表达式的值。特别是,绑定参数将用于curr_partition(i)。但是,似乎这些查询和语句的PARTITION子句不支持绑定参数。我想这是因为Oracle在它具有绑定参数值之前尝试为查询或语句创建执行计划,但如果查询或语句指定了分区,那么该信息是计划的关键部分,因此无法提供在绑定参数中。