Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Outils > Forms
Forms Forum d'entraide sur Oracle Forms
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 27/08/2004, 11h55   #1
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Par défaut [forms] ref cursor associé à un bloc de données

Bonjour,

Je travaille avec forms 6i et Oracle 8i.

Mon problème est le suivant : j'ai le résultat d'une requête dynamique à visualiser sous forms.

J'avais donc pensé faire une procédure dans un package du style :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
CREATE OR REPLACE package monpack IS
  type mon_cur IS ref cursor;
  procedure result (block_data IN out mon_cur, <liste_parametres>);
end;
 
CREATE OR REPLACE package body monpack IS
   procedure result (block_data IN out mon_cur, <liste_parametres>) IS
      v_requete varchar2(5000);
   begin
      v_requete := 'select .....';
      open block_data FOR v_requete;
   end;
end;
OK, mon package se compile bien.

Le problème est lorsque que je veux associer ma procédure à mon bloc (via l'assistant de création de bloc), j'ai aucune colonne qui apparait dans la liste des colonnes disponibles, et quand j'appuie sur le bouton suivant, j'ai le message d'erreur : "Veuillez sélectionner au moins une colonne".

1. J'ai déjà utilisé les ref cursor de manière non dynamique et cela ne posait pas de problème puisque les colonnes étaient identifiées via un record.

2. Les colonnes ramenées par select sont toujours les mêmes, seule la clause where est dynamique. Au départ j'avais donc pensé déclarer mon curseur de la manière suivante :
Code :
1
2
3
 
type col_req IS record (col1 number(8), col2...);
type mon_cur IS ref cursor RETURN col_req;
Mais dans ce cas je n'arrive pas à compiler mon package, j'ai l'erreur suivante :
Code :
PLS-00455: cursor 'BLOCK_DATA' cannot be used IN dynamic SQL OPEN statement
Quelqu'un a-t-il déjà eu ce problème ? Comment peut-on le contourner sans passer par des tables de travail.
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2004, 13h44   #2
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
Plutôt que de passer un curseur à votre procédure, passez plutôt une collection (table de records)
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2004, 14h31   #3
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Il me semblait que cela n'était pas possible en forms 6i ?
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2004, 15h47   #4
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
Citation:
Envoyé par PlaineR
Il me semblait que cela n'était pas possible en forms 6i ?
la version 6 est trop louin dans ma mémoire...
je crois tout de même qu'elle pouvait gérer des blocs basés sur une interrogation (CLAUSE FROM) ??
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2004, 16h06   #5
Membre habitué

 
Avatar de Nounoursonne
 
Inscription : mai 2002
Messages : 257
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 257
Points : 145
Points : 145
Oui en Forms6i c'est tout à fait possible
Nounoursonne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2004, 16h13   #6
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
Reste à savoir si le bloc est en visu seulement (OK) ou en modif (KO avec le bloc basé sur clause FROM)

Mais il ne faut pas abandonner la solution REF CURSOR ou voir si la version 6 accepte une procédure stockée qui accepte de gérer une collection.
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2004, 16h45   #7
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
Je vois dans la doc en ligne Forms6i que pour créer un bloc basé sur une procédure stockée qui utilise un REF CURSOR, il faut créer le bloc manuellement et renseigner les champs à la mano
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2004, 17h46   #8
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Merci pour toutes ces informations.

J'ai opté pour la clause from qui correspond en fait le mieux à mes besoins (simple visualisation), car j'ai une fonction qui me renvoie la requête à partir de paramètres, je n'ai plus qu'à faire un :
Code :
1
2
3
4
5
 
v_requete := '(' || mafonction (...) || ')';
clear_block;
set_block_property ('BLOCK1', QUERY_DATA_SOURCE_NAME, v_requete);
execute_query;
L'avantage me semble-t-il par rapport au ref curseur (sauf erreur de ma part) c'est que l'utilisateur peut faire des recherches via ENTER_QUERY.

Pour information, j'ai fait un test avec des collections, cela avait l'air de passer au niveau de la création du block, je n'ai pas été jusqu'à renseigner ma collection en pl, car la clause from répondait mieux à mes besoins.
Citation:
Envoyé par SheikYerbouti
Je vois dans la doc en ligne Forms6i que pour créer un bloc basé sur une procédure stockée qui utilise un REF CURSOR, il faut créer le bloc manuellement et renseigner les champs à la mano
Pas tout à fait vrai : si le ref cursor est du type :
Code :
1
2
3
 
type col_req IS record (col1 number(8), col2...); 
type mon_cur IS ref cursor RETURN col_req;
la création du bloc via l'assistant se fait sans problème. Mais à force d'être assisté, on oublie que quand cela ne fonctionne pas automatiquement, on peut le faire manuellement ! Je vais donc de ce pas regarder la solution proposée par Sheik pour créer manuellement mon bloc basé sur un ref curseur dynamique.

Dernière question, avez-vous une idée de laquelle des 3 solutions (clause from, ref cursor, collection) est la plus performante ? Vu que la requête est assez costaud, c'est une notion à ne pas négliger...
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2004, 18h03   #9
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
Je pense pouvoir affirmer (pour l'avoir testé en 9i) que la clause FROM est plus performante qu'une collection. pourquoi ? personne ne peut me donner la moindre bonne raison...
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2004, 18h26   #10
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Merci Sheik pour votre sempiternelle disponibilité pour venir en aide aux développeurs en détresse...
...et pour toutes ces réponses qui m'ont permis d'avancer.
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR 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 13h19.


 
 
 
 
Partenaires

Hébergement Web