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

Oracle Discussion :

[PL/SQL] Insertion en SQL dynamique : problème de types


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Points : 7
    Points
    7
    Par défaut [PL/SQL] Insertion en SQL dynamique : problème de types
    bonjour à tous

    je veut faire une insertion paramétrie ( sans connaitre la table , ni ces champs) pour cela j'utilise une procedure d'insertion

    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
    CREATE OR REPLACE PROCEDURE INSERTION ( table_nom VARCHAR(30), valeurs RECORD)
     
    IS
       Requête VARCHAR (200);
     
    BEGIN
     
    If table_nom not exists in ( SELECT table_name FROM user_tales)
                         then RAISE_application_error( 'la table n'existe pas ');
     
     
     
    Requête :='INSERT INTO ' || table_nom || ' values ';
     
    EXECUTE IMMEDIATE Requête; 
     
    END;
    mais le problème: comment on peut récupèrer les valeurs de RECORD pour les inserés??.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    La variable transmise sera alors de type la_table%ROWTYPE.

    USER_TAB_COLUMNS donne la liste des colonnes d'une table.
    Ensuite il faudra construire l'ordre d'insertion de façon totalement dynamique.

    c'est un exercice interressant.
    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

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    bonjour

    mais je vais inserer les valeurs et leurs types dans un tableau ( RECORD)
    et je doit les insérer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         Requête :='INSERT INTO ' || table_nom || ' values ';
    ma question comment je vais récupèrer les valeurs (a partir du tableau) pour les inserer dans la table ( qui correspond)????

    Merci

  4. #4
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Je viens de vous indiquer la piste.

    votre procédure reçoit un record de type la_table%rowtype.
    pour connaitre le nom des colonnes de cet enregistrement vous devez interroger la vue USER_TAB_COLUMNS ( faites un DESC USER_TAB_COLUMNS).

    La vue vous donne entre-autre le nom des colonnes de la table ( COLUMN_NAME) donc le nom des champs de votre enregistrement.

    Avec cela, vous pouvez construire votre ordre dynamique d'insertion.

    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
    Declare
     LC$Req  VARCHAR2(4000);
     Cursor C_TABLE IS
     SELECT COLUMN_NAME
     FROM USER_TAB_COLUMNS
     WHERE TABLE_NAME = la_table ;
    Begin
      LC$Req := 'INSERT INTO ' || la_table|| ' (' ;
       -- Champs de la clause VALUE --
       For i IN C_TABLE Loop
        If i> 1 Then LC$Req := LC$Req || ',' ; End if ;  
        LC$Req := LC$Req || i.COLUMN_NAME ;
       End loop ;
      LC$Req := LC$Req || ) VALUES(' ;
       -- Valeurs --
       For i IN C_TABLE Loop
        If i> 1 Then LC$Req := LC$Req || ',' ; End if ;  
        LC$Req := LC$Req || 'Record.' || i.COLUMN_NAME ;
       End loop ;
    LC$Req := LC$Req || ') ' ;
     
    EXECUTE IMMEDIATE LC$Req ;
    End ;
    Ceci n'est qu'un base de travail.
    A vous de l'ajuster.
    pensez à afficher la chaîne LC$Req (DBMS_OUTPUT.PUT_LINE) pour vérifier le contenu avant d'envoyer a execute immediate.

    Bon travail.
    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

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Merciiiii et bon courage à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] insert into sql session
    Par bernard26000 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 23/12/2007, 11h56
  2. Problème d'insert en SQL dynamique
    Par greg75 dans le forum SQL
    Réponses: 8
    Dernier message: 23/08/2007, 10h46
  3. Problème d'une requête SQL INSERT
    Par bejaad dans le forum VBA Access
    Réponses: 1
    Dernier message: 02/07/2007, 12h53
  4. Réponses: 14
    Dernier message: 10/01/2007, 10h12
  5. [SQL] Recupération Requete SQL dans un tableau dynamique PHP
    Par victor.jbju dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 13/09/2006, 16h48

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