Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/01/2008, 16h42   #1
Invité de passage
 
Inscription : janvier 2005
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 6
Points : 0
Points : 0
Par défaut Create Table en PL/SQL

Bonjour

Je dois préparer un script de migration de base, et avant de créer certaines tables je voulais vérifier qu'elles n'existaient pas déjà :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
DECLARE
 
	 table_exists INTEGER;
 
BEGIN
 
	 SELECT COUNT(table_name) INTO table_exists FROM user_tables WHERE upper(table_name)=upper('xxx');
	 IF table_exists=0 THEN
		CREATE TABLE xxx ( .... );
	end;
 
END;
Mais PS/SQL me retourne une erreur PLS-00103: Symbole "CREATE" rencontré à la place d'un des symboles suivants ....


Une idée ?
esteph est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 16h53   #2
Membre Expert
 
Avatar de alain.couthures
 
Inscription : avril 2007
Messages : 889
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : avril 2007
Messages : 889
Points : 1 061
Points : 1 061
Les commandes de création ne sont pas autorisées en PL/SQL mais on peut tout de même en exécuter en les plaçant d'abord dans une chaine de caractères !
__________________
Formulaires XForms sur tous navigateurs sans extension à installer (architecture XRX) : http://www.agencexml.com/xsltforms/
alain.couthures est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 17h00   #3
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 319
Points : 5 837
Points : 5 837
Tu devrais employer du SQL dynamique pour exécuter du DDL.
Mais t’est mal parti. Soit tu fait un Select de la table et tu intercepte l’erreur 942 et si c’est le cas tu lance le script de création donc pas besoin de PL/SQL soit tu emploi le PL/SQL et dans ton cas tu devrait utiliser que du SQL dynamique y compris pour tester l’existence des tables.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 17h01   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 319
Points : 5 837
Points : 5 837
Citation:
Envoyé par alain.couthures Voir le message
Les commandes de création ne sont pas autorisées en PL/SQL mais on peut tout de même en exécuter en les plaçant d'abord dans une chaine de caractères !
C'est une description très approximative du SQL Dynamique. Mais très approximative
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 17h36   #5
Membre Expert
 
Avatar de scheu
 
Inscription : juin 2007
Messages : 1 497
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 497
Points : 1 483
Points : 1 483
Essaie
Code :
1
2
3
4
5
6
7
8
9
10
11
12
DECLARE
 
	 table_exists INTEGER;
 
BEGIN
 
	 SELECT COUNT(table_name) INTO table_exists FROM user_tables WHERE upper(table_name)=upper('xxx');
	 IF table_exists=0 THEN
		EXECUTE IMMEDIATE 'CREATE TABLE xxx ( .... )';
	end;
 
END;
scheu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 18h46   #6
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 319
Points : 5 837
Points : 5 837
Ou employer le package DBMS_UTILITY
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
SQL> DROP TABLE xxx purge;
 
TABLE supprimÚe.
 
SQL> exec dbms_utility.exec_ddl_statement('create table xxx (c varchar2(10))');
 
ProcÚdure PL/SQL terminÚe avec succÞs.
 
SQL> DESC xxx
 Nom                                       NULL ?   Type
 ----------------------------------------- -------- ---------------------------
 
 C                                                  VARCHAR2(10)
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 22h57   #7
Membre du Club
 
Inscription : janvier 2008
Messages : 50
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 50
Points : 47
Points : 47
Et il faudra sûrement donner explicitement (pas au travers d'un rôle) le droit de créer une table.

Code :
GRANT CREATE TABLE TO <USER>;
wondersonic est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h24.


 
 
 
 
Partenaires

Hébergement Web