124 votes

Comment utiliser CREATE OR REPLACE?

Ai-je raison de comprendre que CRÉER OU REMPLACER signifie fondamentalement "si l'objet existe, supprimez-le, puis créez-le de toute façon?"

Si oui, qu'est-ce que je fais mal? Cela marche:

 CREATE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')
 

Et cela ne veut pas (ORA-00922: option manquante ou non valide):

 CREATE OR REPLACE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')
 

Est-ce que je fais quelque chose de stupide? Je ne semble pas pouvoir trouver beaucoup de documentation sur cette syntaxe.

183voto

Quassnoi Points 191041

Cela fonctionne sur des fonctions, des procédures, des packages, des types, des synonymes, de déclenchement et de points de vue.

Mise à jour:

Après la mise à jour du post pour la troisième fois, je vais reformuler ce:

Cela ne fonctionne pas sur les tables :)

Et oui, il y a de la documentation sur cette syntaxe, et il n'y a aucun REPLACE option pour CREATE TABLE.

35voto

Jeffrey Kemp Points 26050

Une des belles choses au sujet de la syntaxe, c'est que vous pouvez être sûr qu'un CREATE OR REPLACE ne sera jamais vous faire perdre des données (le plus vous perdrez du code, qui nous l'espérons vous aurez stocké dans le contrôle de source quelque part).

L'équivalent de la syntaxe pour les tables à changer, ce qui signifie que vous devez explicitement énumérer les modifications qui sont nécessaires.

EDIT: Par ailleurs, si vous avez besoin de faire un DROP + CRÉER dans un script, et vous ne vous souciez pas pour le fallacieux de "l'objet n'existe pas" d'erreurs (lorsque la CHUTE n'a pas trouver la table), vous pouvez faire ceci:

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE owner.mytable';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; END IF;
END;
/

30voto

RC. Points 15804

Il n'y a pas de table de création ou de remplacement dans Oracle.

Vous devez:

DROP TABLE foo;
CREATE TABLE foo (....);

15voto

ajm Points 10000

CREATE OR REPLACE ne peuvent être utilisés que sur des fonctions, procédures, types, vues ou packages - cela ne fonctionnera pas sur les tables.

5voto

Kavan Points 49

Le script suivant devrait faire l'affaire sur Oracle:

 BEGIN
  EXECUTE IMMEDIATE 'drop TABLE tablename';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; 
    END IF;
END;
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X