Répétez apres moi :J'aime PBAdonf. J'aime PBAdonf. J'aime PBAdonf.

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.
  • Index
  •  » Base de données
  •  » [RESOLU] Appel à fonction Oracle asynchrone ou comment ignorer le return ?

#1 11-11-2010 20:22:48

elfeliz  
Bienfaiteur du site
Award: bf
Lieu: Liège, BE
Date d'inscription: 23-06-2009
Messages: 94
Pépites: 471
Banque: 0

[RESOLU] Appel à fonction Oracle asynchrone ou comment ignorer le return ?

Bonjour !

Je cherche à lancer une procédure stockée sur un serveur Oracle 10g depuis un appli PB 10.5.

Le hic est que cette procédure prends deux heures à finir et que pendant ce temps l'appli est bloquée.
J'aurais aimer savoir comment vous faites dans ce cas pour forcer l'appli à continuer sans attendre la fin du processus DB ?
Typiquement, ne pas attendre de return, travailler en asynchrone.

C'est un cas si classique que j'aurais penser que PB gérait ça facilement.
Or, je n'arrive pas à mettre la main sur un exemple correspondant.

J'ai tenté :
- une procédure sans return sur le serveur DB
- une fonction encapsulant l'appel à la fonction initiale sur le serveur DB
- une fonction allias en local external sur SQLCA
- la même en remote RPC

Sans succès...
J'en suis résigné à créer un Job Oracle sur la DB qui se chargera de lancer la procédure...
Puis l'encapsuler dans un package qui sera appelé par PB.
Un peu lourd quand même : il doit y avoir un autre moyen, non ???

Merci d'avance pour toute suggestion...


Bybye !

El Feliz



Win XP
PB 10.5
Oracle 10g

Dernière modification par elfeliz (02-12-2010 15:06:32)


No prob, just Pb !

Hors ligne

 

#2 12-11-2010 07:53:19

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [RESOLU] Appel à fonction Oracle asynchrone ou comment ignorer le return ?

Bonjour, regarde du coté de la fonction Yield.


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#3 12-11-2010 09:46:32

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [RESOLU] Appel à fonction Oracle asynchrone ou comment ignorer le return ?

Bonjour,

Il faut que tu lances ta procédure dans un thread différent. Pour cela, tu as à ta disposition les fonctions SharedObject.... (SharedObjectRegister, ...).

Il existe plusieurs exemples de mise en oeuvre sur codexchange (multithread).

Hors ligne

 

#4 13-11-2010 16:48:45

elfeliz  
Bienfaiteur du site
Award: bf
Lieu: Liège, BE
Date d'inscription: 23-06-2009
Messages: 94
Pépites: 471
Banque: 0

Re: [RESOLU] Appel à fonction Oracle asynchrone ou comment ignorer le return ?

Un grand merci pour vos réponses !
je vais creuser ces directions et je reviens vers vous ;-)

Bybye,

El Feliz


No prob, just Pb !

Hors ligne

 

#5 16-11-2010 09:17:44

elfeliz  
Bienfaiteur du site
Award: bf
Lieu: Liège, BE
Date d'inscription: 23-06-2009
Messages: 94
Pépites: 471
Banque: 0

Re: [RESOLU] Appel à fonction Oracle asynchrone ou comment ignorer le return ?

Bonjour,

Je reviens avec mon problème :-)
En fait, je pense que j'ai mal posé ma question.

En effet, mon but est de pouvoir lancer un process sur une DB ORACLE - quel qu'il soit : fonction, procédure, job, autre - sans que l'application ne reste en attente soit de la valeur de return, soit de la fin du process DB en question.
L'exemple classique, c'est de lancer un traitement lourd - genre calcul - sur la DB et puis de fermer l'appli PB qui l'aurait lancé (les erreurs et autres étant gérées par le DBMS).

D'après les tests que j'ai effectué, Yield ou le partage d'objet "sharés" ne résoud pas complétement mon problème :
Ces logiques permettent effectivement l'intervention sur un process en cours (yield ) ou l'ouverture d'autres fenêtres et objets PB pendant qu'un autre process tourne ( SharObject)... mais au sein de l'application initiale...
Ce qui fait que si je lance le process dans une fenêtre 1, je peux effectivement ouvrir une fenêtre 2, etc.
Mais je ne peux quitter l'application : le process ouvert en fenêtre 1 étant toujours en attente d'une réponse....

Peut-être qqchose m'a-t-il échappé ?

Ce qui m'étonne aussi c'est que sous ASE le problème ne se semble pas se poser.
Par exemple, j'ai testé une fonction en TL-SQL avec un wait , renvoyant un seul caractère,  appelée par un client  PB.
Dans ce cas, le client fait son job sans soucis du return : à savoir que si je mets le Wait en commentaire, il ramasse effectivement le caractère, mais que si je mets le wait à un délai de 2 sec., il continue sa route avec une valeur à null sans états d'âme et sans rester fixé sur l'attente d'une réponse.
C'est troublant et c'est peut-être une piste : où se cache la différence entre ASE et Oracle 10g sur ce point bien précis ????

Par ailleurs, j'ai également testé la propriété "Async"  de l'objet de transaction, mais ça n'a rien changé...


J'ai l'impression de passer à côté d'un truc gros comme une maison ...

Avez-vous une idée ??

Merci d'avance,

Bybye

El Feliz


No prob, just Pb !

Hors ligne

 

#6 16-11-2010 09:26:11

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2486
Pépites: 85
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] Appel à fonction Oracle asynchrone ou comment ignorer le return ?

Bonjour,

As-tu regardé du côté de $Universe sous Oracle?


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#7 16-11-2010 09:43:16

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [RESOLU] Appel à fonction Oracle asynchrone ou comment ignorer le return ?

Pour un DW.retrieve en asynchrone il faut mettre une ligne commentée dans RetrieveRow (équivalent d'un Yield).

Sinon tu peux aussi lancer un job dans Oracle avec dbms_job.submit(...).


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#8 18-11-2010 14:33:25

Thorben  
Membre Geek
Lieu: Luxembourg
Date d'inscription: 18-05-2010
Messages: 36
Pépites: 241
Banque: 0

Re: [RESOLU] Appel à fonction Oracle asynchrone ou comment ignorer le return ?

Bonjour,

Quand tu essaye de le faire en utilisant les fonctions SharedObject.... (SharedObjectRegister, ...),
est-ce que tu as bien créer une nouvelle connection dans ton nouveau thread ?
Il me semble que ce soit nécessaire.

Par contre, je ne sais pas si il laissera fermer l'application ou pas.

Hors ligne

 

#9 30-11-2010 15:05:59

erfindel  
Membre
Date d'inscription: 31-10-2008
Messages: 4
Pépites: 19
Banque: 0

Re: [RESOLU] Appel à fonction Oracle asynchrone ou comment ignorer le return ?

Je suis confronté à un problème similaire que celui de elfeliz

Pour ma part, j'ai une procédure stockée qui a traitement extrêmement long pour l'utilisateur.

Je met donc :
SQLCA.dbParm = "Async = 1, DBGetTime = 2"

Mais lorsque j’exécute ma PS, pour l'exemple j'ai fait une petite procédure stockée qui attend un nombre de seconde passé en paramètre :

DECLARE sp_wait PROCEDURE FOR Ma_Procédure_Stockée
    @sec = 10
USING SQLCA;

EXECUTE sp_wait;
   
IF SQLCA.sqlcode < 0 THEN

    MessageBox(gAppNom, "Erreur lors de la génération du fichier routeur !~r" + SQLCA.Sqlerrtext, StopSign!, Ok!)
    Return -1
END IF

CLOSE sp_wait;


Mais je n'arrive pas à récupérer la main avant la fin du traitement de la PS.

Je ne crois pas que dans le cas de @elfeliz ni du miens le Yield() correspond au problème.

En utilisant les "SharedObject", le programme va quand même se bloqué en attendant la fin du traitement, il me semble

Je suis donc aussi coincé

Hors ligne

 

#10 30-11-2010 20:11:55

JCZ  
Builder Power
Award: bf
Lieu: 75019 paris
Date d'inscription: 21-05-2007
Messages: 1724
Pépites: 496,453,703,213
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] Appel à fonction Oracle asynchrone ou comment ignorer le return ?

salut
vous avez essaye les job oracle ?


Face à l'agression, la puissance de l'intelligence

Hors ligne

 

#11 01-12-2010 09:08:33

erfindel  
Membre
Date d'inscription: 31-10-2008
Messages: 4
Pépites: 19
Banque: 0

Re: [RESOLU] Appel à fonction Oracle asynchrone ou comment ignorer le return ?

Pour ma part je suis sur SQL Server, et si on lance une tache, l'appli est bloqué le temps du traitement de cette tache...

Hors ligne

 

#12 01-12-2010 10:07:01

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [RESOLU] Appel à fonction Oracle asynchrone ou comment ignorer le return ?

JCZ a écrit:

vous avez essaye les job oracle ?



erasorz a écrit:

Sinon tu peux aussi lancer un job dans Oracle avec dbms_job.submit(...).


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#13 01-12-2010 10:59:07

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [RESOLU] Appel à fonction Oracle asynchrone ou comment ignorer le return ?

Bonjour,

En utilisant les "SharedObject", le programme va quand même se bloqué en attendant la fin du traitement, il me semble

Non, uniquement le thread que tu as lancé. Tu peux continuer à travailler avec le programme normalement.

Mais, si à l'issue de l'exécution de la procédure stockée, vous ne procédez pas à une quelconque exploitation des résultats/données de la procédure, un job devait suffire ou votre programme doit procéder à un traitement à l'issue de l'exécution de la procédure ?

Hors ligne

 

#14 02-12-2010 15:04:53

elfeliz  
Bienfaiteur du site
Award: bf
Lieu: Liège, BE
Date d'inscription: 23-06-2009
Messages: 94
Pépites: 471
Banque: 0

Re: [RESOLU] Appel à fonction Oracle asynchrone ou comment ignorer le return ?

Bonjour Tout le monde !

Merci pour vos réponses.

En résumé :

- Je cherche à lancer un traitement long sur une db. Je voudrais que l'utilisateur puisse lancer le traitement, fermer l'appli, son pc et rentrer chez lui pendant que ça tourne en DB :-)
- C'est sur Oracle, avec un client PB, deux tiers.

Les essais :

- Yield et sharedobjects me laissent le problème de ne pas pouvoir fermer l'application (ok, on peut passer à un autre écran, lancer d'autres process, etc. mais l'appli reste toujours en attente sur un objet... certes "parallèle", mais bloquant la fermeture).
- L'option Async = 1 ne m'a pas donné de modification de comportement.

Solution adoptée :

- Une procédure Oracle en charge de créer un job --> utilise DBMS_SCHEDULER.CREATE_JOB ()
- Le job en question est chargé de lancer la fonction Oracle initialement demandée.
- J'appelle la procédure de création de job via mon application cliente PB : la création réussit et mon appli peut fermer.
- De son côté la fonction de calcul démarre et poursuit son job sur le serveur DB... à l'heure précisée dans le scheduler.

Conclusion :
C'est lourd mais ça marche

Remarque :
Le problème ne s'était pas posé sur des essais PB -> ASE : comportement asynchrone sans paramétrages particulier.
Aussi, j'étais convaincu qu'il y avait moyen avec Oracle aussi, mais là, je sèche ...


Merci à tous,
Et si qqun a une solution sans passer par les jobs Oracle, je suis toujours preneur !!!!


Bybye,
El Feliz


No prob, just Pb !

Hors ligne

 
  • Index
  •  » Base de données
  •  » [RESOLU] Appel à fonction Oracle asynchrone ou comment ignorer le return ?

Pied de page des forums

Propulsé par FluxBB 1.2.22