[PL/SQL] create or replace matable?

create or replace matable? [PL/SQL] - SQL/NoSQL - Programmation

Marsh Posté le 23-01-2009 à 12:05:38    

Bonjour.
 
J'ai un script a executer sur une base.
 
Je cherche une astuce pour gerer le cas ou une table existe ou non.
 
Quelque chose genre if matable exists drop matable
 
Pour le moment, ça donne ça:
 
declare
begin
 
execute immediate 'drop matable';
execute immediate 'create matable (colonnes1,2...)';
 
+ 500 lignes d'inserts into crées par un autre script lancé sur une autre base (script qui sert a créer celui-ci, d'ailleurs. - En fait: Un script unix est lancé sur la base A et appelle le fichier A.SQL. Il crée alors le fichier B.SQL qui sera lancé sur la base B - Ici, le problème concerne le contenu du script B)
 
Mais alors le problème est que je veux gérer les cas ou la table a créer existe ou non: ici, j'ai une erreur dans le "drop" si la table n'existe pas.
 
avec un  
 
exception
when other then
execute immediate 'create matable (colonnes1,2...)';
 
Je peux créer la table quoi qu'il arrive, mais j'aimerais aussi y insérer les lignes voulues dans les 2 cas de façon "propre"...
 
Je crois savoir qu'il existe une astuce, vu que le "create or replace" ne marche pas plus que le "create if not exists" en pl/SQL apparemment.
 
Merci.

Reply

Marsh Posté le 23-01-2009 à 12:05:38   

Reply

Marsh Posté le 23-01-2009 à 13:07:10    

si tu ne veux pas passer par une exception parceque tu ne trouve pas ca propre, tu peux toujours faire un truc du style
 
 

Code :
  1. select count(*) into v_table_exist
  2. from SYS.ALL_TABLES a
  3. where A.OWNER = p_ton_schema
  4. and a.TABLE_NAME = p_ta_table


 
et après tu fais ton if dessus etc

Reply

Marsh Posté le 23-01-2009 à 13:24:15    

pourquoi tu fais pas simplement un :
Create or replace table matable...


---------------
Instagram - Mon PVT en Australie.
Reply

Marsh Posté le 23-01-2009 à 14:24:36    

Citation :

pourquoi tu fais pas simplement un :
Create or replace table matable...


 
 Pasque ça marche pô! (option eronnée ou absente) :heink:  
 
@Casimimir: j'ai fait comme ça, ça marche bien, merci!  
 
En fait, le truc avec l'exception, c'est que si je veux insérer mes lignes dans tout les cas, ça me fait dupliquer les insert into qui sont assez nombreux. Ou alors 2 scripts a passer: un pour la création/drop des tables, l'autre pour le contenu (mais je préfère éviter d'avoir plusieurs scripts B). Ou un truc plus simple encore que n'importe quel type un minimum formé au SQL connaitrait.  
 
Pfff! Pourquoi c'est a moi de faire ces machins en urgence alors que j'y connais rieng?
 
En tout cas merci.

Reply

Marsh Posté le 23-01-2009 à 14:33:54    

ca ne devrait pas dupliquer si tu fais un truc du genre:
 

Code :
  1. declare
  2.    begin
  3.          begin
  4.          execute immediate 'drop matable';
  5.          exception
  6.             when other then null;
  7.          end;
  8.          execute immediate 'create matable (colonnes1,2...)';
  9.          ton insert qui va bien;
  10.    end;

Reply

Marsh Posté le 23-01-2009 à 15:58:28    

Bien vu, je n'avais même pas envisagé qu'il était possible de faire des begin-end imbriqués... Je ferais bien de trouver un bouquin sur le script.
 
Un dernier problème: Qaund la table n'est pas crée au début du script, et que je le lance sans les insert, ça marche, la table est crée, et les inserts passent ensuite.
 
Par contre, en l'état avec les insert juste a la suite du  
execute immediate 'create matable (colonnes1,2...)';
 
J'ai une erreur comme quoi la table n'existe pas!? Alors qu'en lançant juste la partie drop/création puis ensuite les insert, c'est OK, mais tout a la suite non?
 
Il ne me manquerais pas une instruction dans ce cas?


Message édité par baggers le 23-01-2009 à 15:59:16
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed