【问题标题】:ORA-14108: illegal partition-extended table name syntaxORA-14108: 非法的分区扩展表名语法
【发布时间】:2018-02-11 07:15:50
【问题描述】:

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

但它给了

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;

/

【问题讨论】:

    标签: database oracle plsql oracle11g partitioning


    【解决方案1】:

    您必须连接分区名称并使用动态 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 语句时,绑定变量用于将任何 PL/SQL 表达式的值传递给 SQL 引擎。特别是,绑定参数将用于curr_partition(i)。但是,此类查询和语句的 PARTITION 子句似乎不支持绑定参数。我猜这是因为 Oracle 尝试在查询或语句具有绑定参数值之前为其创建执行计划,但如果查询或语句指定分区,则该信息是计划的关键部分,因此无法提供在绑定参数中。

    【讨论】:

    • 这也解决了执行EXECUTE IMMEDIATE 'ALTER TABLE table DROP PARTITION :partition_name' USING 'some_partition_name' 时的相同错误。我们怎么知道我们不能在这个特定的查询中使用绑定变量...谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2015-07-15
    • 2018-08-30
    • 2010-10-20
    • 1970-01-01
    • 2014-01-15
    • 2012-11-21
    相关资源
    最近更新 更多