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.
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
.
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;
/
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 (....);
CREATE OR REPLACE
ne peut être utilisé que sur des fonctions, procédures, types, vues ou packages - cela 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;
-- 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;
/
Ne fonctionne pas avec les tables, seulement les fonctions, etc.
Voici un site avec quelques exemples .
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;
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.
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.
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
'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;