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 :

execute immediate 10g


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Points : 388
    Points
    388
    Par défaut execute immediate 10g
    Bonjour ,
    je suis en 10g, et j'essai de faire un insert en execute immediate en utilisant
    une variable de type %rowtype (enregistrement)
    A la compilation dans sqlplus il me dit que ma variable et de type incorrect
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    execute immediate 'insert into t_article'||p_link||' values (:bb)' using enrg;
     
    avec 
    type art_enrg is record (aa t_article%rowtype);
    enrg art_enrg;
     
    a la compile
     PLS-00597: l'expression 'ENRG' dans la liste INTO est de type
     incorrect
    est-ce que le %rowtype est utilisable en sql dynamique ou dois-je créer un type reprennant l'ensemble des colonnes.

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    il te faut employer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    execute immediate 'insert into t_article'||p_link||'(col1,col2,col3) values (:bb1,:bb2,:bb3)' USING enrg.col1,enrg.col2,enrg.col3;
    il n'est pas possible à ma connaissance de faire un insert avec un record en employant execute immediate

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Points : 388
    Points
    388
    Par défaut
    Merci pour la reponse
    ça ne m'arrange pas mais tant pis

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Points : 388
    Points
    388
    Par défaut
    J'etait persuadé que c'etait possible
    en fouillant un peu, il faut transformer la requete sql en bloc PL/SQL
    et il faut que la variable enregistrement soit defini dans l'entete du package.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute immediate 	'begin insert into t_article'||p_link||' values p_inter_site.enrg;end;';

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    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 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Je pense ce que Laurent a voulu dire c'est qu'il n'est pas possible d'utiliser un record dans la clause using d'un execute immediate. Oracle n'accepte en effet que des "types simples".

    Attention, avec ta solution, je pense que ton instruction insert sera parsée à chaque exécution, ce qui peut être dommageable pour les perfs.

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    L'exemple de C. avec execute immediate est éventuellement possible si l'on a le record déclaré au niveau du package.

    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
     
    SQL> create or replace package p is
      2    emprec emp%ROWTYPE;
      3    procedure p;
      4  end;
      5  /
     
    Package created.
     
    SQL> create or replace package body p is
      2    procedure p is
      3    BEGIN
      4      emprec.empno := 1000;
      5      emprec.ename := 'JO';
      6      execute immediate 'begin insert into emp values p.emprec;end;';
      7    end p;
      8  end;
      9  /
     
    Package body created.
     
    SQL> 
    SQL> execute p.p;
     
    PL/SQL procedure successfully completed.
     
    SQL> 
    SQL> select ename from emp where empno=1000;
     
    ENAME
    ----------
    JO
     
    SQL> 
    SQL> rollback;
     
    Rollback complete.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Points : 388
    Points
    388
    Par défaut
    pour les perf je me doute que ce n'est pas la panacé
    Le but et de mettre créer les enrg inexistant de certaine table entre un site maitre et des site distant (10 a 15 enrg tout au plus).
    Et je ne me voyez pas donnez dans l'ordre insert le détail des colonnes surtout que j'ai une variable enregistrement a disposition.

    Merci pour vos remarques .

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

Discussions similaires

  1. forms 10g et execute immediate
    Par nono592303 dans le forum Forms
    Réponses: 1
    Dernier message: 24/11/2010, 17h16
  2. Réponses: 4
    Dernier message: 29/10/2009, 14h25
  3. Equivalents de EXECUTE IMMEDIATE ... RETURNING INTO ... ?
    Par swirtel dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/05/2005, 10h21
  4. [pl/sql] execute immediate
    Par Nadine dans le forum Oracle
    Réponses: 16
    Dernier message: 23/02/2005, 17h37
  5. Execute immediate et nom reserves
    Par nuke_y dans le forum Oracle
    Réponses: 3
    Dernier message: 22/11/2004, 18h17

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