Comment utiliser CREATE OR REPLACE?

98

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

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

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

Et ce n'est pas le cas (ORA-00922: option manquante ou invalide):

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.

Jason Baker
la source

Réponses:

154

Cela fonctionne sur les fonctions, procédures, packages, types, synonymes, déclencheurs et vues.

Mettre à jour:

Après avoir mis à jour le message pour la troisième fois, je reformulerai ceci:

Cela ne fonctionne pas sur les tables :)

Et oui, il existe une documentation sur cette syntaxe, et il n'y a pas d' REPLACEoption pour CREATE TABLE.

Quassnoi
la source
33

L'un des avantages de la syntaxe est que vous pouvez être sûr qu'un CREATE OR REPLACE ne vous fera jamais perdre de données (le plus que vous perdrez est le code, que vous aurez, espérons-le, stocké quelque part dans le contrôle de code source).

La syntaxe équivalente pour les tables est ALTER, ce qui signifie que vous devez énumérer explicitement les modifications exactes requises.

EDIT: Au fait, si vous devez faire un DROP + CREATE dans un script, et que vous ne vous souciez pas des erreurs "objet n'existe pas" (lorsque DROP ne trouve pas la table), vous pouvez faire ce:

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

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

Vous devez:

DROP TABLE foo;
CREATE TABLE foo (....);
RC.
la source
10

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

Andy Mikula
la source
1
CREATE OR REPLACEfonctionne également pour les synonymes et les déclencheurs
Richard Mitchell
4

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;
Kavan
la source
3

Ne fonctionne pas avec les tableaux, uniquement les fonctions, etc.

Voici un site avec quelques exemples .

pôle Nord
la source
3

Une procédure utile pour les bases de données oracle sans utiliser d'exceptions (dans certaines circonstances, vous devez remplacer user_tables par dba_tables et / ou contraindre le tablespace dans la requête):

create or replace procedure NG_DROP_TABLE(tableName varchar2)
is
   c int;
begin
   select count(*) into c from user_tables where table_name = upper(tableName);
   if c = 1 then
      execute immediate 'drop table '||tableName;
   end if;
end;
XorNégatif
la source
3
-- To Create or Replace a Table we must first silently Drop a Table that may not exist
DECLARE
  table_not_exist EXCEPTION;
  PRAGMA EXCEPTION_INIT (table_not_exist , -00942);
BEGIN
   EXECUTE IMMEDIATE('DROP TABLE <SCHEMA>.<TABLE NAME> CASCADE CONSTRAINTS');
   EXCEPTION WHEN table_not_exist THEN NULL;
END;
/
grokster
la source
Un peu plus de code que d'autres exemples mais aussi un peu plus clair dans son objectif
grokster
1

Si vous le faites dans le code, vérifiez d'abord la table dans la base de données en utilisant la requête SELECT table_name FROM user_tables WHERE table_name = 'XYZ'

si enregistrement trouvé, tronquer la table sinon créer une table

Travaillez comme Créer ou Remplacer.

Pradip Gavali
la source
1

Vous pouvez utiliser CORT ( www.softcraftltd.co.uk/cort ). Cet outil permet de CRÉER OU REMPLACER une table dans Oracle. On dirait:

create /*# or replace */ table MyTable(
  ... -- standard table definition
);

Il préserve les données.

Rouillé
la source
1

Donc, je l'utilise et cela a très bien fonctionné: - cela fonctionne plus comme un DROP IF EXISTS mais fait le travail

DECLARE
       VE_TABLENOTEXISTS EXCEPTION;
PRAGMA EXCEPTION_INIT(VE_TABLENOTEXISTS, -942);


    PROCEDURE DROPTABLE(PIS_TABLENAME IN VARCHAR2) IS
              VS_DYNAMICDROPTABLESQL VARCHAR2(1024);
                    BEGIN
                       VS_DYNAMICDROPTABLESQL := 'DROP TABLE ' || PIS_TABLENAME;  
                    EXECUTE IMMEDIATE VS_DYNAMICDROPTABLESQL;

                    EXCEPTION
                        WHEN VE_TABLENOTEXISTS THEN
                             DBMS_OUTPUT.PUT_LINE(PIS_TABLENAME || ' NOT EXIST, SKIPPING....');
                        WHEN OTHERS THEN
                             DBMS_OUTPUT.PUT_LINE(SQLERRM);
                    RAISE;
                    END DROPTABLE;

    BEGIN
      DROPTABLE('YOUR_TABLE_HERE');
END DROPTABLE;
/   

J'espère que cela aide également Référence: Erreur PLS-00103 dans PL / SQL Developer

BGDev
la source
1

«Créer ou remplacer une table» n'est pas possible. Comme d'autres l'ont indiqué, vous pouvez écrire une procédure et / ou utiliser begin execute immédiatement (...). Parce que je ne vois pas de réponse sur la façon de (re) créer le tableau, j'ai mis un script comme réponse.

PS: dans la lignée de ce que jeffrey-kemp a mentionné: ce script ci-dessous ne sauvegardera PAS les données déjà présentes dans la table que vous allez supprimer. En raison du risque de perte de données, dans notre entreprise, il est uniquement autorisé de modifier les tables existantes sur l'environnement de production, et il n'est pas autorisé à supprimer des tables. En utilisant la déclaration de la table de dépôt, tôt ou tard, vous obtiendrez la police de l'entreprise à votre bureau.

--Create the table 'A_TABLE_X', and drop the table in case it already is present
BEGIN
EXECUTE IMMEDIATE 
'
CREATE TABLE A_TABLE_X
(
COLUMN1 NUMBER(15,0),
COLUMN2  VARCHAR2(255 CHAR),
COLUMN3  VARCHAR2(255 CHAR)
)';

EXCEPTION
WHEN OTHERS THEN
  IF SQLCODE != -955 THEN -- ORA-00955: object name already used
     EXECUTE IMMEDIATE 'DROP TABLE A_TABLE_X';
  END IF;
END;
cybork
la source
Avez-vous besoin d'être cohérent avec A_TABLE_EXAMPLE et A_TABLE_X?
Jonathan Leffler
0

Je ferais quelque chose comme ça

  begin
     for i in (select table_name from user_tables where table_name = 'FOO') loop
        execute immediate 'drop table '||i.table_name;
     end loop;
  end;

  execute immediate 'CREATE TABLE FOO (id NUMBER,
                                       title VARCHAR2(4000)) ';
ljupcecar
la source
-4

Si c'est pour MS SQL .. Le code suivant s'exécutera toujours, que la table existe déjà ou non.

if object_id('mytablename') is not null //has the table been created already in the db
Begin
     drop table mytablename
End

Create table mytablename (...
JuniorFlip
la source
1
Désolé, mais c'est Oracle. :-)
Jason Baker
Le commentaire "// y a-t-il des données dans le tableau" est-il exact?
Jeffrey Kemp
désolé un peu mieux, le object_id vérifie si la table existe dans la base de données. il devrait dire // la table a-t-elle déjà été créée dans la base de données
JuniorFlip