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

Firebird Discussion :

insert into avec 2 tables dans 2 databases


Sujet :

Firebird

  1. #1
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut insert into avec 2 tables dans 2 databases
    Bonjour,

    j'ai 2 tables totalement identiques situées dans deux bases différentes sur le même serveur.

    base1 : table1 (chp1, chp2, chp3)
    base2 : table2 (chp1, chp2, chp3)

    les deux tables n'ont pas de champ incrémenté, ni de clé primaire.

    je voudrais copier toutes les données de la table1 dans la table2 avec un SQL.
    la table2 peut-être supprimée si nécessaire..

    merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    la solution "Boucle"
    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
    SET TERM !;
    EXECUTE BLOCK
    AS
    DECLARE VARIABLE C1 ...;
    DECLARE VARIABLE C2 ...;
    DECLARE VARIABLE C3 ...;
    BEGIN
    FOR EXECUTE STATEMENT 'SELECT chp1, chp2, chp3 FROM Table2'
           ON EXTERNAL 'localhost/3050:base'
          AS USER 'SYSDBA' PASSWORD 'masterkey' 
          INTO :C1,:C2,:C3;       
    DO 
     INSERT INTO TABLE1 VALUES(:c1,:c2,:c3);
    END!
    SET TERM ;!
    une solution à tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET TERM !;
    EXECUTE BLOCK
    AS
    BEGIN
    INSERT INTO TABLE1 VALUES EXECUTE STATEMENT 'SELECT chp1, chp2, chp3 FROM Table2'
           ON EXTERNAL 'localhost/3050:base2'
          AS USER 'SYSDBA' PASSWORD 'masterkey';
    END!
    SET TERM ;!
    fait rapidement sans vérifications
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par cantador Voir le message
    j'ai 2 tables totalement identiques situées dans deux bases différentes sur le même serveur.

    base1 : table1 (chp1, chp2, chp3)
    base2 : table2 (chp1, chp2, chp3)

    les deux tables n'ont pas de champ incrémenté, ni de clé primaire.

    je voudrais copier toutes les données de la table1 dans la table2 avec un SQL.
    la table2 peut-être supprimée si nécessaire..
    Depuis la base de données base2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FOR EXECUTE STATEMENT 
       SELECT CHP1, CHP2, CHP3 FROM TABLE1
       ON EXTERNAL DATA SOURCE 'base1'  -- alias, chemin...
       AS USER 'UserName' PASSWORD 'UserPassword'
       INTO :chp1, :chp2, :chp3
    DO INSERT INTO TABLE2(CHP1, CHP2, CHP3) VALUES(:chp1, :chp2, :chp3)
    Moyennant peut être quelques ajustements...

    Mise à jour : Serge a été plus rapide ! et détaillé !
    Philippe.

  4. #4
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    @SergioMaster et Ph. B.

    aie, rien ne marche..

    le EXECUTE BLOCK ne passe pas aussi bien dans l'éditeur SQL que SQL Script de EMS

    et sur l'exemple de Ph. B. adapté à mes besoins :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FOR EXECUTE STATEMENT 
       SELECT INSEE_COM, REFERENCE_CADASTRALE, REFERENCE FROM PROCES
       ON EXTERNAL DATA SOURCE 'MyAlias'  -- alias, chemin...
       AS USER 'SYSDBA' PASSWORD 'masterkey'
       INTO :INSEE_COM, :REFERENCE_CADASTRALE, :REFERENCE
    DO INSERT INTO PROCES(INSEE_COM, REFERENCE_CADASTRALE, REFERENCE) VALUES(:INSEE_COM, :REFERENCE_CADASTRALE, :REFERENCE)
    j'ai un ? Invalid Statement

    merci

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    la partie SQL doit execute statement doit être en quotes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FOR EXECUTE STATEMENT 
       'SELECT INSEE_COM, REFERENCE_CADASTRALE, REFERENCE FROM PROCES'
       ON EXTERNAL DATA SOURCE 'MyAlias'  -- alias, chemin...
       AS USER 'SYSDBA' PASSWORD 'masterkey'
       INTO :INSEE_COM, :REFERENCE_CADASTRALE, :REFERENCE
    DO INSERT INTO PROCES(INSEE_COM, REFERENCE_CADASTRALE, REFERENCE) VALUES(:INSEE_COM, :REFERENCE_CADASTRALE, :REFERENCE)
    la data source doit être bien indiquée avec 'localhost:myalias' à minima en étant bien entendu que myalias est dans aliases.conf
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    merci SergioMaster

    mais en tenant compte des remarques,
    avec EMS et Firebird 2.5 et seven 32 bits

    dans le script ,
    j'ai toujours un Invalid Statement avec un ? pour indiquer la ligne

    et dans l'éditeur SQL, j'ai un
    Token unknow FOR

    ?
    @bientôt

  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 055
    Points
    19 055
    Par défaut
    Salut à tous.

    Désolé pour mon retard, mais je traite les sujets en fonction du "rapport périodique sur FireBird". Donc, j'ai toujours un décalage de 1 jour.

    N'avait-on pas déjà traité ce sujet par ailleurs ? Je m'en souviens et j'avais déjà fait un test que voici :
    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
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET ISO8859_1;
     
    -- =====================
    -- création table "test"
    -- =====================
     
    create table test (
    id       smallint     not null,
    emp_no   smallint     not null,
    lib      varchar(255) not null,
    constraint pk_test_id primary key (id)
    );
     
    insert into test (id,emp_no,lib) values (1,  29, '');
    insert into test (id,emp_no,lib) values (2,  65, '');
    insert into test (id,emp_no,lib) values (3, 144, '');
     
    select * from test;
     
         ID  EMP_NO LIB
    ======= ======= ===============================================================================
          1      29
          2      65
          3     144
     
     
    commit;
     
    -- =========================
    -- Extraction et remplissage
    -- =========================
     
    SET TERM $;
     
    execute block as
    declare emp_no   smallint;
    declare fullname varchar(255);
    begin
      for execute statement 'select emp_no from test' into :emp_no do
        for execute statement ('select full_name from employee where emp_no = ?')(:emp_no)
        on external data source 'localhost:employee' as user 'sysdba' PASSWORD 'masterkey'
        into :fullname do
          update test set lib = :fullname where emp_no = :emp_no;
    end$
     
    SET TERM ;$
     
    commit;
     
    -- ========
    -- Résultat
    -- ========
     
    select * from test;
     
         ID  EMP_NO LIB
    ======= ======= ===============================================================================
          1      29 De Souza, Roger
          2      65 O'Brien, Sue Anne
          3     144 Montgomery, John
     
     
    exit;
     
    Appuyez sur une touche pour continuer...
    Dans cet exemple, la base externe est la base "employee".

    Comme nous ne sommes pas dans le même environnement de travail, Cantador, tu devras adapter le code.
    Je suis sous la version FireBird 3.0.0. Il se peut, d'après les messages d'anomalies que tu as un problèmes de compatibilités.

    Sinon, c'est le même principe exposé par SergioMaster et par Ph. B.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  8. #8
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    merci Artemus24,
    j'ai bien tout noté mais
    pour l'instant, ça ne fonctionne pas..

    en attendant de pouvoir traiter cette question avec un SQL, j'ai
    mis en place une boucle selon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    MaTable.First;
    While not MaTable.EOF do
    begin
    ..............
     
    Append;
    .............
    Post;
    .............
     
    MaTable.Next;
    end;
    même si c'est pas top,
    ça tourne et comme je suis un serveur (la nuit), ça ne pose pas de soucis..
    mais je continue à chercher néanmoins !

Discussions similaires

  1. [AC-2003] INSERT INTO avec recuperation d'ID d'une autre table
    Par nougitch dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 31/01/2013, 23h42
  2. INSERT INTO avec des virgules dans un champs
    Par _developpeur_ dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 15/06/2011, 12h21
  3. INSERT INTO avec un SELECT et table vide
    Par pol2095 dans le forum Requêtes
    Réponses: 10
    Dernier message: 17/02/2011, 23h10
  4. [AC-2007] Problème de jointure dans INSERT INTO avec INNER JOIN
    Par andy331 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 16/03/2010, 15h59
  5. INSERT INTO avec une valeur numéroauto
    Par priest69 dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 08/11/2005, 15h39

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