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 ?
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
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.
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) . 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é…
[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.
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 …bien qu’il semble que c’est censé être prévu dans les normes SQL 99 d’après mes recherches par google.
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
[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]
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…
[quote=« ZGoblin, post:19, topic: 46769 »]Beaucoup de réponse depuis vendredi !
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.