web-dev-qa-db-fra.com

Comment utiliser CREATE OR REPLACE?

Ai-je raison de comprendre que CREATE OR REPLACE 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 ceci non plus (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.

90
Jason Baker

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

Mise à jour:

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

Cela ne fonctionne pas sur les tables :)

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

145
Quassnoi

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 (tout ce que vous perdrez, c’est le code, que nous espérons avoir stocké quelque part dans le contrôle de source).

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

EDIT: Soit dit en passant, si vous devez créer une erreur DROP + CREATE dans un script et que vous ne vous souciez pas de la fausse erreur "l'objet n'existe pas" (lorsque DROP ne trouve pas 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;
/
33
Jeffrey Kemp

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

Vous devez:

 TABLEAU DE DÉPANNAGE foo; 
 CRÉER LE TABLEAU foo (....); 
20
RC.

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

8
Andy Mikula

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;
4
Kavan
-- 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;
/
3
grokster

Ne fonctionne pas avec les tables, seulement les fonctions, etc.

Voici un site avec quelques exemples .

3
northpole

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 l'espace de table 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;
3
XorNegative

Vous pouvez utiliser CORT ( www.softcraftltd.co.uk/cort ). Cet outil permet de CREER OR REMPLACER une table dans Oracle. Cela ressemble à:

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

Il préserve les données.

1
Rusty

Si vous utilisez du code, commencez par rechercher une table dans la base de données à l'aide de la requête SELECT nom_table FROM nom_tables FROM nom_table WHERE = nom_table = 'XYZ'

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

Travailler comme créer ou remplacer.

1
Pradip Gavali

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

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 vous aidera aussi Référence: Erreur PLS-00103 dans le développeur PL/SQL

0
BGDev

'Créer ou remplacer une table' n'est pas possible. Comme d'autres l'ont dit, vous pouvez écrire une procédure et/ou utiliser begin execute immédiatement (...). Comme je ne vois pas de réponse à la manière de (re) créer la table, j'ai mis un script comme réponse.

PS: conformément à ce que jeffrey-kemp a mentionné: ce script ci-dessous NE sauvegardera PAS les données déjà présentes dans le tableau que vous allez supprimer. En raison du risque de perte de données, dans notre société, il est uniquement autorisé de modifier les tables existantes sur l'environnement de production et il n'est pas autorisé de supprimer des tables. En utilisant la déclaration de la table de dépôt, vous aurez tôt ou tard la police de la société à 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;
0
cybork