2017-09-02 1 views
0

Ich habe eine Anforderung, wo ich ein Update-Skript über mehrere Partitionen einer Tabelle ausführen muss. Ich habe ein Skript, denn es steht geschrieben, wie unten:ORA-14108: ungültige Partition erweiterte Tabellenname Syntax

aber es gibt

ORA-14108: illegale Partitions erweiterten Tabellennamenssyntax

Ursache: Partition nur dann angegeben werden kann zugegriffen werden mit seinem Namen. Der Benutzer hat versucht, eine Partitionsnummer oder eine Bind-Variable zu verwenden.

Aktion: Anweisung Ändern einer Partition beziehen über ihren Namen

Jede Idee, wie kann ich diesen Fehler umgehen?

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; 

/

Antwort

3

Sie

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)'; 

Jedes Mal, wenn Sie eine SQL SELECT Abfrage oder ein INSERT laufen, UPDATE oder DELETE Anweisung von PL/SQL, bindet die Partitionsnamen in und verwenden dynamische SQL, also müssen verketten Variablen werden verwendet, um die Werte beliebiger PL/SQL-Ausdrücke in die SQL-Steuerkomponente zu übernehmen. Insbesondere wird ein Bindungsparameter für curr_partition(i) verwendet. Es scheint jedoch, dass die PARTITION-Klausel solcher Abfragen und Anweisungen keine Bindungsparameter unterstützt. Ich nehme an, dass dies daran liegt, dass Oracle versucht, einen Ausführungsplan für die Abfrage oder Anweisung zu erstellen, bevor es die Bindungsparameterwerte enthält. Wenn die Abfrage oder Anweisung jedoch eine Partition angibt, sind diese Informationen ein kritischer Teil des Plans und können daher nicht bereitgestellt werden in einem Bindungsparameter.