[SQL Oracle] CREATE TABLE IF NOT EXISTS

Je cherche a faire quelques chose de tout simple sous Oracle :
CREATE TABLE IF NOT EXISTS
mais ça ne passe pas et après une recherche sous google, je ne suis pas plus avancé.

Est-ce que quelqu’un connait l’astuce pour faire passer cette commande sans exécuter 20 lignes de code ?

est-ce que ca pose un problème si tu fais un CREATE TABLE et que tu ignores le message d’erreur lancé par oracle si la table existe ?

Hmm, j’avais fait un truc dans le style. Si tu veux je peux t’envoyer la solution en 20 lignes de codes pour faire un [INSTRUCTION SQL] IF EXISTS que tu pourras sans doute facilement adapter pour faire du IF NOT EXISTS.
Apres en moins de 20 lignes je sais pas faire :slight_smile:

Je crois que tu ne peux tout simplement pas utiliser le IF NOT EXISTS avec Oracle.
A la limite pourquoi pas un CREATE OR REPLACE ?

EDIT : Comme le dit domdoum, il semblerait que le seul moyen c’est de passer par un script qui va regarder dans les tables systèmes si la table existe ou pas.

Et pourquoi ne pas dropper juste avant de créer ? De mémoire on a juste un warning quand on droppe une table qui n’existe pas.

heu, si il veut garder la table existante il va pas drop ni replace ^^

je crois qu’effectivement, la seule solution c’est réellement d’aller d’abord voir si la table en question existe.

Ah ouais effectivement :slight_smile: on est un peu bourrins par chez nous !

Si je me souviens bien, je n’ai pas oracle sous la main, on utilise WHENEVER SQLERROR CONTINUE sous SQL*Plus:
[sql]WHENEVER SQLERROR CONTINUE
DROP TABLE
WHENEVER SQLERROR EXIT SQL.SQLCODE[/sql]
sinon tu peux utiliser cette solution.

[quote=« phili_b, post:8, topic: 46769 »]Si je me souviens bien, je n’ai pas oracle sous la main, on utilise WHENEVER SQLERROR CONTINUE sous SQL*Plus:
[sql]WHENEVER SQLERROR CONTINUE
DROP TABLE
WHENEVER SQLERROR EXIT SQL.SQLCODE[/sql]
sinon tu peux utiliser cette solution.[/quote]

lis le message de Rabban (2 post plus haut) :slight_smile: . Je vois pas de solution en sql pur la…

En TSQL et de maniere optimizée/concurente/ blabla (avec un nolock/tablockx) on fait un truc comme:

IF NOT EXISTS (SELECT name FROM sysobjects WITH (NOLOCK) WHERE name = 'NomDeTable' AND type = 'U') IF NOT EXISTS (SELECT name FROM sysobjects WITH (TABLOCKX) WHERE name = 'NomDeTable' AND type = 'U') CREATE TABLE 'NomDeTable' ...

Ca reste assez simple et loin de 20 lignes, la meme chose en Oracle ca doit pas etre bien plus compliqué…

Le probleme c’est que le IF EXISTS n’existe pas sous oracle (sous cette forme)

j’ai check vite fait mes favori sur oracle, et j’ai rien trouve de ressemblant.

En general je trouve toutes mes reponses sur un de ces sites (Si je trouve pas je viens ici :)) :

http://www.techonthenet.com/sql/index.php

http://www.ss64.com/index.html

http://www.lifeaftercoffee.com/

En PLSQL, c’est super simple, en SQL, je vois vraiment pas…

[quote=« GloP, post:10, topic: 46769 »]En TSQL et de maniere optimizée/concurente/ blabla (avec un nolock/tablockx) on fait un truc comme:
[…]
Ca reste assez simple et loin de 20 lignes, la meme chose en Oracle ca doit pas etre bien plus compliqué…[/quote]ben non. :slight_smile:
J’ai cherché en long et en large et ça confirme mes dires : Reponse à la question « Re: How to drop an nonexist table without the error message? »

edit: Ceci s’explique car à l’origine Oracle était sous Unix, et l’est encore d’ailleurs, et tout se fait alors en script sqlplus encapsulé dans du script shell unix. Mais bon en passant par SQLPlus (qui est l’équivalent de MS Query Analyzer) ou en PL/SQL on résoud le problème.

edit2:
azacreel2: ah je vois que tu as cherché dans tes favoris :crying: Tu vois: pas possible en SQL « pur ». Mais bon je ne vois pas pourquoi le IF EXISTS en T-SQL serait acceptable et pas son équivalent avec gestion d’exception en PL-SQL.

C’est sûr que c’est plus intuitif le IF EXISTS mais c’est comme ça n’est-ce pas :cry: …bien qu’il semble que c’est censé être prévu dans les normes SQL 99 d’après mes recherches par google.

Entre les normes SQL et leurs implémentations par les SGBD, y a comme un énorme océan de vide…

Et créer un trigger qui vérifie l’existence avant d’autoriser sa création ? A moins que ça soit su PL/SQL, je me mélange un peu les pinceaux :).

Ha oui… le plus propre a l’air d’etre un truc du genre:

SQL> DECLARE 2 E_TAB_EXISTS EXCEPTION; 3 PRAGMA EXCEPTION_INIT(E_TAB_EXISTS,-955); 4 BEGIN 5 execute immediate 'CREATE TABLE EMPLOYEES(ID NUMBER)'; 6 EXCEPTION 7 WHEN E_TAB_EXISTS THEN 8 dbms_output.put_line('Table already exists'); 9 end;

Huuumm…

euh, si vous en êtes à faire du plsql, un count sur user_all_tables ou nombreux consorts au lieu d’une exception, c’est + cool :slight_smile:

Bon ben, voici une soluce PL/SQL pour ceux que ça interesse. Comme disait azacreel, le principe est pas compliqué, on regarde dans all_objects si la table en question existe. Il y a peut etre plus simple, j’avoue humblement que je suis pas un gourou oracle :slight_smile:

[code] – fn_if_exists.sql
– Description
– Une procedure qui execute une intruction SQL en cas d’existence d’un objet Oracle

create or replace procedure if_exists_then(Object_to_Check_for in varchar2, statement_to_process in varchar2) is
Offset number := instr(Object_to_Check_for, ‹ . ›);
FoundObject varchar2(30);
begin
select decode(max(OBJECT_NAME),null,‹ NO ›,‹ YES ›)
into FoundObject from all_objects
where object_name = upper(substr(Object_to_Check_for, Offset +1)) and
owner = decode(Offset, 0, user,
upper(substr(Object_to_Check_for, 1, Offset - 1)));
if FoundObject = ‹ YES › then
execute immediate statement_to_process;
end if;
end;
/[/code]

L’utilisation:

[code] –
– test.sql

– chargement procedure if_exists
@@fn_if_exists.sql;

– hop
execute if_exists_then(‹ SCHEMA.TABLE ›, ‹ DROP TABLE SCHEMA.TABLE ›);[/code]

il semble en effet que pour une raison mysterieuse, on doit oublier le IT EXISTS en sql sur oracle.

Bah d’apres le mega gourou PL/SQL (ces gens etranges qui se font payer pour faire du PLSQL, les fous!) les exceptions c’est « comme ca qu’il faut faire » :crying: apres moi j’en sais rien… Maintenant les DBA oracle c’est comme les protestants… y a plusieurs eglises…

Beaucoup de réponse depuis vendredi ! :slight_smile:

Pour moi les codes pl/sql de 20 lignes non merci, j’ai préféré ne pas tenir compte du message d’erreur à l’aide d’un try…catch.

[quote=« ZGoblin, post:19, topic: 46769 »]Beaucoup de réponse depuis vendredi ! :slight_smile:

Pour moi les codes pl/sql de 20 lignes non merci, j’ai préféré ne pas tenir compte du message d’erreur à l’aide d’un try…catch.[/quote]

Peuh, petit joueur! :crying:
Si tu mets la procedure dans un fichier à part, il te faut 1 ligne pour la charger et apres 1 ligne pour l’utiliser, c’est carrement un truc de feignant.