IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

[PL/SQL] Type d'une colonne défini par une variable dynamique


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut [PL/SQL] Table dynamique
    Bonjour, je ne sait pas si je poste au bon endroit ...

    J'ai besoin d'une fonction qui utilise un nom de table dynamique et donc avec des ROWtype different.

    J'utilise pour obtenir la description de ma table une variable défini comme suit :

    v_typtable matable%ROWTYPE;

    Ca marche bien quand matable est connu et qu'il s'agit du nom en dur de la table dans la base.

    Par contre dès que j'utilise une variable contenant le nom de table, ca ne marche plus :
    v_matable = "matable";
    v_typtable v_matable%ROWTYPE;


    Si quelqu'un peut m'aider pour faire une telle déclaration !

    Merci d'avance

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    A mon avis, impossible à faire sauf si on génére dynamiquement l'ensemble du code PL/SQL et qu'on essaie de l'exécuter avec EXECUTE IMMEDIATE

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Merci, mais j'ai finalement trouvé en détournant la solution en passant par un curseur

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Désolé de pas avoir donné ma réponse plus tot, voici ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    P_enreg.nomtable = "matable"
    -- "matable" étant un paramètre de ma fonction
     
    --Déclaration du curseur :
    cursor listetable  is
    SELECT    *
    FROM	  p_enreg.nomtable
     
    --Déclaration de la structure en fonction du retour du curseur !
    desctable listetable%ROWTYPE;
     
    --Cela fonctionne très bien !!

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Personnellement, je suis surpris.
    Pour utiliser un nom de table dynamique, j'ai toujours été contraint de passer par du SQL dynamique : EXEC_SQL ou EXECUTE IMMEDIATE.

    Peut-on en savoir plus sur le type de :
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Voici la définition qui est passé en paramètre de ma procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    p_enreg in TA_PARAM_SUIVI%ROWTYPE
    et nomtable est donc un champs de la table TA_PARAM_SUIVI.

  7. #7
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Je suis aussi surpris, je n'arrive pas à faire fonctionner l'exemple suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    > select * from v$version;
     
    BANNER
    ----------------------------------------------------------------
    Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
    PL/SQL Release 9.2.0.6.0 - Production
    CORE    9.2.0.6.0       Production
     
    TNS for HPUX: Version 9.2.0.6.0 - Production
    NLSRTL Version 9.2.0.6.0 - Production
     
    > --
    > drop table t;
     
    Table dropped.
     
    > drop table t1;
     
    Table dropped.
     
    > create table t(x int);
     
    Table created.
     
    > create table t1(nt varchar2(30));
     
    Table created.
     
    >
    > insert into t1 values('T');
     
    1 row created.
     
    > commit;
     
    Commit complete.
     
    > --
    > create or replace procedure p(p_r in t1%rowtype)
      2  is
      3  cursor listetable is
      4  select * from p_r.nt;
      5  begin
      6  null;
      7  end;
      8  /
     
    Warning: Procedure created with compilation errors.
     
    > show errors
    Errors for PROCEDURE P:
     
    LINE/COL
    --------------------------------------------------------------------------------
    ERROR
    --------------------------------------------------------------------------------
    4/1
    PL/SQL: SQL Statement ignored
     
    4/19
    PL/SQL: ORA-00942: table or view does not exist
    Est-ce que vous pouvez nous donner un exemple complet ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Je crains que vous n'ayez raison !

    je viens de retesté et la compilation plante !!
    Ce que je n'arrive pas a comprendre c'est que ca a déjà marché

    peut-être une mauvaise gestion du versionning ...
    bref je n'ai donc pas résolu mon pb

    du coup je me demande comment fonctionne EXEC_SQL ou EXECUTE IMMEDIATE que signale Magnus ?
    peyt-être est-ce ma solution !

  9. #9
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Quand je vous disais de partager votre solution, vous avez la preuve que c'est AUSSI dans votre intérêt
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  11. #11
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Je vois pas trop en quoi le EXECUTE IMMEDIATE va servir, moi j'utiliserais plutot les curseur génériques.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    SQL> create or replace package pkg_typ as
      2  type curgen is ref cursor;
      3  end;
      4  /
     
    Package créé.
     
    SQL> CREATE TABLE t(x int);
     
    Table créée.
     
    SQL> CREATE TABLE t1(nt varchar2(30));
     
    Table créée.
     
    SQL> insert into T values (4);
     
    1 ligne créée.
     
    SQL> insert into T values (12);
     
    1 ligne créée.
     
    SQL> insert into t1 values('TOTO');
     
    1 ligne créée.
     
    SQL> insert into t1 values('TATA');
     
    1 ligne créée.
     
    SQL> create or replace function select_gen (in_table in varchar2) return pkg_typ.curgen is
      2  l_curgen pkg_typ.curgen;
      3  BEGIN
      4  OPEN l_curgen for 'SELECT * from '||in_table;
      5  RETURN l_curgen;
      6  END;
      7  /
     
    Fonction créée.
     
    SQL> var cur refcursor;
    SQL> BEGIN
      2  :cur := select_gen('t');
      3  END;
      4  /
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> print cur
     
             X
    ----------
             4
            12
     
    SQL> BEGIN
      2  :cur := select_gen('t1');
      3  END;
      4  /
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> print cur
     
    NT
    ------------------------------
    TOTO
    TATA
     
    SQL>
    Dans mon exemple je passe par un package car je n'ai qu'un oracle 8i sous la main mais dans les versions supérieures (enfin 10g sûr, 9i je sais pas...) , ce n'est pas la peine car il y a le type "sysrefcursor"

    Dans mon exemple je suis en sqlplus mais c'est aussi possible d'utiliser ce genre de fonctions avec java.

Discussions similaires

  1. créer une liste à partir d'une suite définie par récurence
    Par carryPAR dans le forum Général Python
    Réponses: 5
    Dernier message: 02/03/2015, 10h33
  2. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  3. Réponses: 3
    Dernier message: 29/03/2011, 20h38
  4. Réponses: 1
    Dernier message: 22/08/2008, 10h06
  5. colonne définie par une requête imbriquée
    Par lper dans le forum Langage SQL
    Réponses: 10
    Dernier message: 02/09/2005, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo