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 18/04/2011, 15h59   #1
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Par défaut Table Temporaire Sybase vers PL/SQL

Bonjour à tous,

Je reviens une fois de plus sur un nouveau problème !
Je n'arrive pas à trouver la syntaxe pour créer une table temporaire en PL/SQL.

Voici mon code Sybase T-SQL)

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
 
CREATE procedure proc_paie_doublpaie 
AS
SELECT AGENT_PAIE_CLE,
           AGENT_DATE     ,
           IDENT_IDENT
INTO   #doublons
FROM   AGENT_PAIE 
GROUP BY AGENT_PAIE_CLE
HAVING count(*) > 1
INSERT INTO doublon_paie
SELECT.......

Je souhaite que la table temporaire se supprime des la fin de session utilisateur.
J'ai vu qu'il y avait des Global Temporary Table.

Code sql :
1
2
CREATE GLOBAL TEMPORARY TABLE today_sales
   ON COMMIT PRESERVE ROWS


Mais ça me force à créer la table dans ma procédure stockée non ?
Enfin la je suis vraiment perdu, je n'ai pas su trouver plus d'information en PL/SQL sur le sujet.

Merci de votre aide,
Amicalement,
NarbO
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 16h21   #2
Rédacteur
 
Inscription : décembre 2002
Messages : 2 385
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 385
Points : 3 261
Points : 3 261
Exact, sous Oracle, une table "temporaire" est une table permanente, dont le contenu est temporaire.

Si vous la créez à la volée (par EXECUTE IMMEDIATE) il faudra aussi faire du SQL dynamique pour tous les accès ultérieurs que fera votre procédure sur cette table.
Ca n'est pas recommandé, et il est préférable de créer votre table temporaire à l'avance, avant de créer la procédure qui y fera appel.
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 16h28   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Une subtilité néanmoins, l'optimiseur Sybase est très en dessous de celui d'Oracle, notamment avec les sous-requêtes.

Des requêtes qui peuvent s'écrire en un bloc avec Oracle doivent transiter dans des tables temporaires sous Sybase.

Écrivez d'abord vos requêtes d'un seul bloc avant de considérer les tables temporaires.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 14h17   #4
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Bonjour à vous,

J'ai beau essayer plein de chose ça fait 2 jours que je suis dessus et rien ne veut fonctionner

Actuellement j'ai ça :

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
CREATE OR REPLACE procedure proc_paie_doublpaie 
AS
BEGIN
DECLARE
tab_sql long;
 
BEGIN
 
tab_sql :=  'CREATE GLOBAL TEMPORARY TABLE DOUBLONS
  (
	AGENT_PAIE_CLE         char(6),
  AGENT_DATE             number(8,0),
  IDENT_IDENT            char(6),
  AGENT_PAIE_CIGAP       char(6),
  REFCSO_CODE            char(8),
  AGENT_PAIE_NUMSS       char(13),
  REFUP_CODE             char(2),
  AGENT_PAIE_ENTITE      char(6),
  REFGRADE_CODE          char(5),
  REFFONCTION_CODE       char(5)
  ) ON COMMIT PRESERVE ROWS ';
  EXECUTE IMMEDIATE tab_sql;
 
END;
 
BEGIN
SELECT AGENT_PAIE_IDENT,
       AGENT_PAIE_AAAAMM,
       AGENT_PAIE_ORDRE,
       AGENT_PAIE_DATE,
       AGENT_PAIE_CIGAP ,
       REFCSO_CODE,
       AGENT_PAIE_NUMSS,
       REFUP_CODE, 
       AGENT_PAIE_ENTITE,
       REFGRADE_CODE,
       REFFONCTION_CODE
INTO   DOUBLONS
FROM   AGENT_PAIE 
GROUP BY AGENT_PAIE_IDENT
HAVING count(*) > 1;
END;
 
 
   INSERT INTO  DOUBLON_PAIE (
      IDENT_NOM,     
      AGENT_PAIE_CIGAP, 
      AGENT_DATE,
      IDENTIFICATION.IDENT_IDENT,      
      AGENT_PAIE_NUMSS,      
      REFELT_CODE,      
      doublons.REFUP_CODE,      
      to_char(PAIE_MONTANT,999999999.99) AS PAIE_MONTANT,      
      REFGRADE_CODE,      
      doublons.REFCSO_CODE,      
      AGENT_PAIE_ENTITE,      
      REFBUR_LIBELLE,
      REFFONCTION_CODE  )
 
      SELECT  DISTINCT  IDENT_NOM,     
          AGENT_PAIE_CIGAP, 
          AGENT_DATE,
          IDENTIFICATION.IDENT_IDENT,      
          AGENT_PAIE_NUMSS,      
          REFELT_CODE,      
          doublons.REFUP_CODE,      
          to_char(PAIE_MONTANT,999999999.99) AS PAIE_MONTANT,      
          REFGRADE_CODE,      
          doublons.REFCSO_CODE,      
          AGENT_PAIE_ENTITE,      
          REFBUR_LIBELLE,
          REFFONCTION_CODE
      FROM  IDENTIFICATION, doublons, PAIE, REFBUR      
      WHERE  IDENTIFICATION.IDENT_IDENT = doublons.IDENT_IDENT       
      AND AGENT_PAIE_IDENT = PAIE_IDENT
      AND AGENT_PAIE_AAAAMM = PAIE_AAAAMM
      AND AGENT_PAIE_ORDRE = PAIE_ORDRE     
      AND REFBUR.REFCSO_CODE=doublons.REFCSO_CODE      
      AND REFBUR.REFBUR_CODE=AGENT_PAIE_ENTITE      
      AND PAIE_TYPE='1'        
      AND  REFELT_CODE IN ('1004','2330','2340','2730') 
      ORDER BY IDENT_NOM;
END;
END proc_paie_doublpaie;

Mais je sèche un peu.. Vous avez des idées pour faire un sous requête sans passer par une table temporaire l'idée me plait assez, mais je ne vois pas trop comment c'est possible de le mettre en place dans ce cas la.. ?

Merci encore à vous,
NarbO
NarbOni 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 05h04.


 
 
 
 
Partenaires

Hébergement Web