2017-09-02 2 views
0

J'ai une exigence où j'ai besoin d'exécuter un script de mise à jour sur plusieurs partitions d'une table. Je l'ai écrit un script pour comme ci-dessous:ORA-14108: syntaxe de nom de table étendue étendue-partition interdite

mais il donne

ORA-14108: nom de la table partition étendue illégale syntaxe

Cause: partition à accès ne peut être spécifiée en utilisant son nom. L'utilisateur a tenté d'utiliser un numéro de partition ou une variable de liaison.

Action: Modifier déclaration vers une autre partition en utilisant son nom

Toute idée comment puis-je contourner cette erreur?

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; 

/

Répondre

3

Vous devrez concaténer le nom de la partition et utiliser SQL dynamique, à savoir

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

Chaque fois que vous exécutez une requête SQL SELECT ou une déclaration INSERT, UPDATE ou DELETE de PL/SQL, bind les variables sont utilisées pour transmettre au moteur SQL les valeurs de toutes les expressions PL/SQL. En particulier, un paramètre de liaison sera utilisé pour curr_partition(i). Cependant, il semble que la clause PARTITION de telles requêtes et instructions ne prenne pas en charge les paramètres de liaison. Je suppose que c'est parce qu'Oracle essaye de créer un plan d'exécution pour la requête ou l'instruction avant d'avoir les valeurs du paramètre bind, mais si la requête ou l'instruction spécifie une partition, cette information est une partie critique du plan et ne peut donc pas être fournie dans un paramètre de liaison.