Partage
  • Partager sur Facebook
  • Partager sur Twitter

Curseur dynamique

fonction plsql

25 octobre 2012 à 17:19:38

Bonjour,

J'ai un problème de variable :( .
Je fais du plSql et je suis sous oracle.
Je souhaite variabiliser le nom des tables et les utiliser via des curseurs.
Quelque chose du style :
FUNCTION MA_FONCTION( tableName In varchar2) RETURN VARCHAR2
  Is    
  
  Cursor Curs Is
  Select * From tableName ;    
  L_Curs Curs%Rowtype;

Begin     
   
   Open Curs;
   LOOP 
      Begin
        Fetch Curs Into L_Curs;
        Exit When Curs%Notfound;     
        Dbms_Output.Put_Line(L_Curs.monChamp1);        
      End;
   End Loop;
   Close Curs;

End MA_FONCTION;


Mais je bloque.
Il ne reconnait pas 'tableName' dans mon curseur.
Auriez-vous une méthode ?
Merci d'avance :)
  • Partager sur Facebook
  • Partager sur Twitter
11 juillet 2013 à 16:56:56

Salut!

Désolé pour la réponse un peu tardive, mais je pense que ça pourrait aider les autres un jour!

Merci de faire un tour sur ce lien : Passing table name into a Cursor - PL/SQL

http://www.dbforums.com/oracle/1634244-passing-table-name-into-cursor-pl-sql.html

Thnx!

  • Partager sur Facebook
  • Partager sur Twitter
11 septembre 2013 à 11:21:37

D'un point de vue général, un curseur est un sous-programme qui permet de retourner des enregistrements plus rapidement qu'une simple itération dans une boucle. Il va plus vite car Oracle le 'compile' et il s'utilise ensuite comme un programme externe, donc le fait d'utiliser une table en paramètre ne permet pas à Oracle d'optimiser son fonctionnement, dans ce cas une boucle imbriquée devrait être plus simple à programmer.

A tord de nombreux programmeur imaginent que ta demande est ce qu'on appelle un curseur dynamique, mais c'est faux, un curseur est appellé dynamique quand il reçoit des paramètres lors de son ouverture (comme les paramètres d'une fonction), exemple :

CURSOR MonCurseur(MaValeur Number) IS
SELECT * FROM MaTable WHERE MonChamp = MaValeur;

Quand on utilise celui-ci :

OPEN MonCurseur(1000);

Dans ce cas, Oracle optimise le curseur les objets (Tables, vues, procédure, fonctions, champs) sont connus, il peut même utiliser un MonCurseur%ROWTYPE pour faire le FETCH

-
Edité par OpenAlbux 11 septembre 2013 à 11:25:26

  • Partager sur Facebook
  • Partager sur Twitter
19 janvier 2020 à 15:54:13

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter