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 07/01/2008, 15h02   #1
Futur Membre du Club
 
Inscription : mai 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 65
Points : 17
Points : 17
Par défaut truncate et pl/sql

Bonjour à tous,

j'ai un petit pb avec pl/sql.
En effet, lorsque je lance la procédure pl/sql suivante avec DELETE, tout fonctionne normalement, alors que si je cherche à optimiser mon code et que j'utilise TRUNCATE, j'ai un message d'erreur.

Pouvez-vous m'aider à résoudre ce problème ?

Par ailleurs, si vous avez des suggestions pour améliorer ce genre de requêtes, elles sont les bienvenues
-copie partielle d'une table d'un schéma dans un autre schéma, de façon régulière (c'est à dire tous les mois)
- création d'un fichier de "log" qui sauvegarde automatiquement les données affichées par le dbms_output.


Merci à tous

MarieO

Le message d'erreur est le suivant:
Citation:
Error report:
ORA-06550: Ligne 7, colonne 10 :
PLS-00103: Symbole "TABLE" rencontré à la place d'un des symboles suivants :
:= . ( @ % ;
Symbole ":= inséré avant "TABLE" pour continuer.
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:


Voici le code concerné:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DEFINE ValAnnee = 2007
DEFINE ValMois = 12
DEFINE ValPeriode = 200712
DECLARE
 iDateDeb VARCHAR2(25) := To_CHAR(sysdate,'DD/MM/YYYY, HH24:MI:SS');
 iDateFin VARCHAR2(25);
 iPeriode VARCHAR2(6) := &ValPeriode;
 iNb NUMBER;
BEGIN
 TRUNCATE TABLE schema1.maTable;
 INSERT INTO schema1.maTable (id_info, nom, prenom, annee, mois)
  SELECT DISTINCT id_info, nom, prenom, annee, mois
  FROM schema2.maTable
  WHERE annee=&ValAnnee AND mois<=&ValMois ;
 SELECT COUNT(*) INTO iNb FROM schema1.maTable;
 iDateFin := To_CHAR(sysdate,'DD/MM/YYYY, HH24:MI:SS');
 dbms_output.put_line('Consolidation / période ' || iPeriode || ' ---');
 dbms_output.put_line (' durée du traitement : ' || iDateDeb || ' - ' || iDateFin);
 dbms_output.put_line('Nb dans la table : ' || iNb);
END;
/
marieo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 15h07   #2
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

Informations professionnelles :
Activité : Chef de projet
Secteur : Bâtiment

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Il faut faire du sql dynamique pour du DDL
Code :
1
2
 
EXECUTE IMMEDIATE 'TRUNCATE TABLE schema1.maTable';
NB
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 15h10   #3
Membre confirmé
 
Avatar de DAB.cz
 
Inscription : octobre 2006
Messages : 221
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 221
Points : 214
Points : 214
Code :
1
2
3
4
5
...
BEGIN
  EXECUTE IMMEDIATE 'TRUNCATE TABLE schema1.maTable';
  INSERT INTO schema1.maTable (id_info, nom, prenom, annee, mois)
   .....
DAB
DAB.cz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 15h40   #4
Futur Membre du Club
 
Inscription : mai 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 65
Points : 17
Points : 17
Merci à vous deux pour cette réponse rapide.

Ca marche !!! Je ne connaissais pas le SQL dynamique...
Maintenant, j'aurais de nouvelles pistes de travail.

D'autre part, si vous avez des idées pour automatiser des copies partielles de tables d'un schéma dans un autre tous les mois et optimier le code que j'utilise, elles sont les bienvenues...

MarieO
marieo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 15h47   #5
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
regarde du coté des jobs
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 15h48   #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
Vous n’avez pas besoin du SQL dynamique. Il suffit de sortir le truncate ainsi que le insert du bloc PL/SQL.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 15h49   #7
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

Informations professionnelles :
Activité : Chef de projet
Secteur : Bâtiment

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Citation:
Envoyé par mnitu Voir le message
Vous n’avez pas besoin du SQL dynamique. Il suffit de sortir le truncate ainsi que le insert du bloc PL/SQL.
????
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 15h53   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
en effet d'ailleurs, on peut s'interroger sur l'usage du PL/SQL dans le cas présent
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 15h54   #9
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par Garuda Voir le message
????
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DEFINE ValAnnee = 2007
DEFINE ValMois = 12
DEFINE ValPeriode = 200712
COL iDateDeb new_value iDateDeb noprint
 
SELECT To_CHAR(sysdate,'DD/MM/YYYY, HH24:MI:SS') iDateDeb
FROM dual;
 
 TRUNCATE TABLE schema1.maTable;
 INSERT INTO schema1.maTable (id_info, nom, prenom, annee, mois)
  SELECT DISTINCT id_info, nom, prenom, annee, mois
  FROM schema2.maTable
  WHERE annee=&ValAnnee AND mois<=&ValMois ;
 
COL iDateFin new_value iDateFin noprint
 
SELECT To_CHAR(sysdate,'DD/MM/YYYY, HH24:MI:SS') iDateFin 
FROM dual;
 
 SELECT 'Nb dans la table : ' || COUNT(*) 
 FROM schema1.maTable;
 PROMPT Consolidation / période &ValPeriode ---
 PROMPT durée du traitement : &iDateDeb  - &iDateFin
ou un truc du style
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 15h59   #10
Futur Membre du Club
 
Inscription : mai 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 65
Points : 17
Points : 17
Est-ce que le fait de sortir mes requêtes TRUNCATE ... et INSERT INTO ... du bloc pl/sql va optimiser le traitement ?

Qu'est-ce que cela change entre le fait de le mettre DANS le bloc ou HORS du bloc ?

Est-il possible de créer un fichier .txt (sauvegardé dans un répertoire quelconque) qui contienne l'information affichée par dbms_output plutôt que de faire l'affichage à l'écran ?

Marieo
marieo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 16h01   #11
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
PROMPT dans SQL*Plus permet d'afficher du texte
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 16h11   #12
Futur Membre du Club
 
Inscription : mai 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 65
Points : 17
Points : 17
Bonjour,
Prompt affiche du texte, mais uniquement à l'écran, n'est-ce pas ?

D'autre part, je travaille avec sql developer.

MarieO
marieo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 16h16   #13
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Comme dbms_output

je ne sais pas si PROMPT fonctionne dans SQL Dev.

Ceci étant tu peux continuer en PL/SQL mais en sortant le TRUNCATE du bloc. Ca n'aura pas d'effet sur le perf (du moins, négligeable) mais c'est plus propre que le SQL dynamique qui ici est inutile
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 17h27   #14
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
Citation:
Envoyé par orafrance Voir le message
Ceci étant tu peux continuer en PL/SQL mais en sortant le TRUNCATE du bloc. Ca n'aura pas d'effet sur le perf (du moins, négligeable) mais c'est plus propre que le SQL dynamique qui ici est inutile
Merci du tuyau ! Je ne connaissais pas ce truc là !
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 17h31   #15
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
c'est mnitu qui a lever le "loup"
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h06.


 
 
 
 
Partenaires

Hébergement Web