2009-03-18 6 views
1

Je fais quelque chose comme ça dans une procédure pour effacer toutes les données de toutes les tables dans ma base de données.erreur lors de la troncature des tables à partir d'oracle db

LOOP 
    dbms_utility.exec_ddl_statement('alter table ' || c.owner || '.' || c.table_name || ' disable constraint ' || c.constraint_name); 
    END LOOP; 
. 
. 
. 

LOOP 
    EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || t.table_name ; 
    END LOOP; 

Maintenant, cela jette l'erreur suivante:

ORA-03291: Invalid truncate option - missing STORAGE keyword 
ORA-06512: at "MYSCHEMA.CLEAR_DATA", line 15 
ORA-06512: at line 2 
Process exited. 
Disconnecting from the database MYDB. 
  1. Pourquoi un mot-clé de stockage obligatoire? Je pensais que DROP STORAGE était la valeur par défaut.
  2. Même spécification de stockage à proximité, comme dans

    EXECUTE IMMEDIATE 'TRUNCATE TABLE' || t.table_name || 'DROP STORAGE';

    n'aide pas. L'erreur est la même.

  3. Je pensais que cela pourrait avoir quelque chose à voir avec des contraintes étrangères sur certaines tables. Par conséquent, la «contrainte de désactiver plus haut dans le script
+0

Vous devez essayer de changer EXECUTE IMMEDIATE 'TRUNCATE TABLE' || t.table_name || 'DROP STORAGE'; à EXECUTEZ IMMEDIATEMENT 'TRUNCATE TABLE' || t.table_name || 'DROP STORAGE'; Peut-être manquer de l'espace :) – BlackKat

Répondre

2

Je suggère que vous construisez la commande que vous exécutez dans une variable de chaîne, la sortie à l'aide DBMS_OUTPUT, puis l'exécuter. De cette façon, vous verrez exactement ce qu'il essaie d'exécuter qui génère l'erreur.

Une chose qui pourrait causer cette erreur est si vous avez un nom de table avec un espace dedans (oui, c'est possible). La solution si c'est le cas est d'enrouler le nom de la table entre guillemets.

dev> create table "dave exp" (x number); 

Table created. 

dev> truncate table dave exp; 
truncate table dave exp 
        * 
ERROR at line 1: 
ORA-03291: Invalid truncate option - missing STORAGE keyword 

dev> truncate table "dave exp"; 

Table truncated. 
+0

Va essayer de construire la commande manuellement ... Les noms de table sont tous sans espaces ... comme Emp_Details –

0

Modifier votre programme:

  1. mettre votre commande troncature dans une variable PL/SQL avant l'exécution
  2. ajouter un gestionnaire d'exception qui émet les relevés tronquées par DBMS_OUTPUT ou UTL_FILE (fflush après chaque un) lorsque vous rencontrez une exception:
LOOP 
    BEGIN 
     ... 
    v_sql := 'TRUNCATE TABLE ' || t.table_name ; 
    EXECUTE IMMEDIATE v_sql; 
    EXCEPTION 
    WHEN OTHERS THEN 
     dbms_output.put_line(SQLERRM); 
     dbms_output.put_line(v_sql); 
    END; 
END LOOP; 

Ceci devrait vous montrer l'instruction à l'origine du problème.

0

table tronquée Table_NAME drop storage;

Questions connexes