Question

Ai-je raison de comprendre que CRÉER OU REMPLACER signifie fondamentalement "si l'objet existe, supprimez-le, puis créez-le dans un sens ou dans l'autre?"

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

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

Et ce n'est pas le cas (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.

Était-ce utile?

La solution

Ceci 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:

  

Ceci 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 .

Autres conseils

L’un des avantages de la syntaxe est que vous pouvez être sûr qu’un CRÉER OU REMPLACER ne vous fera jamais perdre de données (le maximum que vous perdrez est le code, qui, espérons-le, vous ont 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.

MODIFIER: Soit dit en passant, si vous avez besoin de faire DROP + CREATE dans un script et que vous ne vous souciez pas du faux objet, l’objet n’existe pas " erreurs (lorsque DROP ne trouve pas la table), vous pouvez le faire:

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

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

Vous devez:

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

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

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;

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

Voici un site contenant des exemples .

-- 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;
/

Une procédure utile pour les bases de données Oracle sans utilisation 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;

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

si un enregistrement est trouvé, alors tronquez la table, sinon créez la table

Travaillez comme créer ou remplacer.

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

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

Il préserve les données.

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 aide Aussi référence: Erreur PLS-00103 dans le développeur PL / SQL

'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 (...). Parce que 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: dans la ligne 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 société, il est uniquement autorisé à 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;

Si c'est pour MS SQL .. Le code suivant sera toujours exécuté, 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 (...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top