2017-09-02 1134 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試圖在查詢或語句具有綁定參數值之前創建執行計劃,但如果查詢或語句指定了分區,則該信息是計劃的關鍵部分,因此無法提供在綁定參數中。