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 :

Requête SELECT multibases


Sujet :

Firebird

  1. #1
    Membre averti Avatar de cantador
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mars 2006
    Messages : 569
    Points : 430
    Points
    430
    Par défaut Requête SELECT multibases
    Bonjour,

    jamais fait et j'ai l'occasion de faire ce truc qui ne semble pas facile à coder..

    donc, j'ai deux bases :
    base1 avec table1 qui contient chp1,chp2, chp3
    et base2, qui contient chp1, chp2

    je souhaite faire un SELECT entre ces deux tables et récupérer le chp3

    j'ai tenté ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    with QFusion.SQL do
    begin
    QFusion.Close;
    Clear;
    Add('SELECT base1.table1.chp3');
    Add('WHERE (base2.table2.chp1 = base1.table1.chp1) ');
    Add('AND (base2.table2.chp2 = base1.table1.chp2) ');
    QFusion.Open;
    end;
    les deux bases sont connectées et le QFusion est lié à la première base avant L'OPEN.

    mais sur l'Open, j'ai une erreur sur la première ligne
    ?
    merci

    @bientôt

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 812
    Points : 34 629
    Points
    34 629
    Billets dans le blog
    54
    Par défaut
    Bonsoir,

    ce n'est pas possible ainsi. Mais via une procédure oui http://www.firebirdfaq.org/faq16/
    j'ai déjà du donner des exemples dans ce forum

    Si ce n'est pas ça qui est recherché, c'est que la question n'est pas posé dans le bon forum là on a affaire à un code Delphi pas a du SQL
    il existe une possibilité Delphi+Firedac de faire des requêtes dite locales.
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    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
    5 006
    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 : 5 006
    Points : 14 127
    Points
    14 127
    Par défaut
    Salut à tous.

    Voici un exemple fortement inspiré de celui donné par SergioMaster.
    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
    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...
    J'ai une table "test" contenant le numéro de l'employé et je désire renseigner la colonne "lib" avec son nom et son prénom.
    La table "employee" est extérieur à ma base. Je vais récupérer la colonne "full_name" afin de mettre à jour la colonne "lib" de la table "test".
    En espérant que cela illustre ce que tu veux faire cantador.

    P.S.: dans ton exemple, il y a une petite erreur sur le passage du paramètre (:id).
    Tu as englober le "on external data source ..." entre les parenthèse alors que ceci se met après le paramètre.
    --> http://www.firebirdsql.org/refdocs/l...-execstat.html

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

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 812
    Points : 34 629
    Points
    34 629
    Billets dans le blog
    54
    Par défaut
    Bonjour,
    Citation Envoyé par Artemus24 Voir le message
    P.S.: dans ton exemple, il y a une petite erreur sur le passage du paramètre (:id).
    Tu as englober le "on external data source ..." entre les parenthèse alors que ceci se met après le paramètre.
    j'ai eu du mal à comprendre le PS, pour m’apercevoir qu'il s'agissait non pas d'un exemple mais d'un code plus générique au problème posé post #7
    Citation Envoyé par SergioMaster post#7
    comme c'est très schématique, un exemple de ce que vous voulez serait nécessaire pour écrire quelque chose de concret
    et pour te répondre, je dirais que ,comme il est non testable tel quel, je pense que cette syntaxe passe aussi
    comme larbuisson n'a pas répondu ...............
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  5. #5
    Membre averti Avatar de cantador
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mars 2006
    Messages : 569
    Points : 430
    Points
    430
    Par défaut
    ce n'est pas possible ainsi. Mais via une procédure oui http://www.firebirdfaq.org/faq16/
    j'ai déjà du donner des exemples dans ce forum

    Si ce n'est pas ça qui est recherché, c'est que la question n'est pas posé dans le bon forum là on a affaire à un code Delphi pas a du SQL
    il existe une possibilité Delphi+Firedac de faire des requêtes dite locales.
    j'ai besoin d'exécuter cette opération des milliers de fois et sur des bases en réseau.

    J'abandonne donc cette solution au profit d'une lecture d'un fichier CSV et d'une requête paramétrée qui intégrera
    les données dudit fichier.
    Comme, ce programme tournera sur un serveur la nuit, cela ne devrait pas poser de soucis..

    j'ai néanmoins pris bonne note que c'est possible à travers une procédure stockée et en LOCAL.

    merci SergioMaster et Artemus24 toujours fidèles au poste !

    @bientôt

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 812
    Points : 34 629
    Points
    34 629
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par cantador Voir le message
    j'ai besoin d'exécuter cette opération des milliers de fois et sur des bases en réseau.

    J'abandonne donc cette solution au profit d'une lecture d'un fichier CSV et d'une requête paramétrée qui intégrera
    les données dudit fichier.
    Comme, ce programme tournera sur un serveur la nuit, cela ne devrait pas poser de soucis..

    j'ai néanmoins pris bonne note que c'est possible à travers une procédure stockée et en LOCAL.
    Je ne comprends pas bien. Le fait d'avoir à faire ça "des milliers de fois" devrait au contraire te conforter dans la rédaction d'une procédure stockée
    Maintenant tout dépend si tu as une base "Principale" ou "Référence" (base1) et que tes autres bases (base2) ne sont que des bases "annexes"

    mais comme on n'a pas toutes les clés en main difficile de dire ce qui l'en est
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  7. #7
    Membre averti Avatar de cantador
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mars 2006
    Messages : 569
    Points : 430
    Points
    430
    Par défaut @SergioMaster
    je n'ai effectivement pas toutes les billes à cet instant..
    la réflexion est en cours..

    Pour faire simple, un fichier CSV va être stocké de temps en temps sur un serveur
    et à partir de ce dernier, j'ai besoin de construire un algorithme (assez complexe..) de filiation de parcelles cadastrales (je n'entre pas dans les détails)
    ce programme doit être capable de stocker des informations dans une table venant en relation 1-N d'une autre table d'une base de données annuelle sur le serveur et partagée.

    j'ai plusieurs choix possibles..
    si je crée une table à partir du fichier CSV dans une autre base, là je dois entrer dans le système ->> procédure stockée multibases
    l'autre choix est de lire le fichier et de lancer des requêtes SQL paramétrées.

    Bien sûr, la première solution semble meilleure, à priori, mais ne l'ayant jamais fait..
    je me tâte..

    Je me demande même si je ne devrais pas répéter le stockage de la table issue du CSV dans chaque base annuelle, ce qui me simplifierait
    le codage..
    mais je n'aime pas aussi les redondances..

    autre précision: les tables sont énormes (plus de 1 million de données..)

    @bientôt

  8. #8
    Membre averti Avatar de cantador
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mars 2006
    Messages : 569
    Points : 430
    Points
    430
    Par défaut suite..
    En revanche la table qui pourrait être créée à partir
    du fichier CSV serait elle petite (quelques centaines d'enregistrements)

    merci

    @bientôt

  9. #9
    Membre averti Avatar de cantador
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mars 2006
    Messages : 569
    Points : 430
    Points
    430
    Par défaut doc firebird
    La doc indique qu'il n'est pas possible dans une procédure stockée multi-bases
    de mettre en place des jointures.

    or, j'en ai deux à manipuler..

    @bientôt

  10. #10
    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
    5 006
    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 : 5 006
    Points : 14 127
    Points
    14 127
    Par défaut
    Salut à tous.

    @ SergioMaster : désolé ! J'aurai dû être plus précis dans mon Post Scriptum.
    C'était bien la remarque concernant ton post #7 de l'autre sujet.

    Citation Envoyé par Cantador
    J'abandonne donc cette solution au profit d'une lecture d'un fichier CSV et d'une requête paramétrée qui intégrera
    les données dudit fichier.
    Pourquoi cette solution ne te convient pas ?
    Je suppose que si la base de données est distante, il suffit de remplacer le localhost par le nom de ton site.
    As-tu peur que le traitement soit trop long ?

    Citation Envoyé par Cantador
    Bien sûr, la première solution semble meilleure, à priori, mais ne l'ayant jamais fait.. je me tâte..
    Est-ce plus une question de faisabilité ou de complexité ?

    Citation Envoyé par Cantador
    autre précision: les tables sont énormes (plus de 1 million de données..)
    1 million, c'est pas énorme. C'est pas la volumétrie qui est importante mais le temps nécessaire à son traitement.

    Citation Envoyé par Cantador
    La doc indique qu'il n'est pas possible dans une procédure stockée multi-bases de mettre en place des jointures.
    Dans mon exemple, par l'intermédiaire des "for select" en cascade, il y a bien une jointure entre deux tables.

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

  11. #11
    Membre averti Avatar de cantador
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mars 2006
    Messages : 569
    Points : 430
    Points
    430
    Par défaut @Artemus24
    il y a un peu de tout dans ce que tu as écrit..
    pour les jointures, peut-être qu'elles sont permises avec la version FB 3.0 ?
    moi, je suis en 2.5.

    la solution la plus simple me semble de recopier la petite table dans toutes les base
    la première fois
    d'autant qu'ensuite je n'aurai que celles construites dans la base la plus récente à mettre à jour.
    et du coup, je peux faire des select en direct puisque de ce fait les tables sont dans la même base.
    mais c'est vrai que j'aimerai quand même savoir faire le truc en multi bases..

    j'ai quand même essayé d'exécuter sur la table employee
    la procédure suivante : exemple fourni par firebird..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    execute block returns (emp_no smallint) as
    begin
    FOR EXECUTE STATEMENT 'select emp_no from employee'
    ON EXTERNAL DATA SOURCE 'localhost:employee' AS USER 'sysdba' PASSWORD 'masterkey'
    INTO :emp_no
    DO SUSPEND;
    end
    mais rien ne marche..
    j'ai une erreur champ emp_no inconnu alors qu'il est dans la table
    ?

    @+

  12. #12
    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
    5 006
    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 : 5 006
    Points : 14 127
    Points
    14 127
    Par défaut @catador
    Salut Cantador.

    Tu n'obtiens pas ce résultat :
    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
    SET TERM $;
     
    execute block returns (emp_no smallint) as
    begin
    FOR EXECUTE STATEMENT 'select emp_no from employee'
    ON EXTERNAL DATA SOURCE 'localhost:employee' AS USER 'sysdba' PASSWORD 'masterkey'
    INTO :emp_no
    DO
      SUSPEND;
    end$
     
     EMP_NO
    =======
          2
          4
          5
          8
          9
         11
         12
         14
         15
         20
         24
         28
         29
         34
         36
         37
         44
         45
         46
         52
     
     EMP_NO
    =======
         61
         65
         71
         72
         83
         85
         94
        105
        107
        109
        110
        113
        114
        118
        121
        127
        134
        136
        138
        141
     
     EMP_NO
    =======
        144
        145
     
     
    SET TERM ;$
     
    exit;
     
    Appuyez sur une touche pour continuer...
    Car il ne faut pas oublier de mettre avant "set term $;" et après "set term ;$".

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

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 812
    Points : 34 629
    Points
    34 629
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par Cantador
    pour les jointures, peut-être qu'elles sont permises
    Qu'à cela ne tienne, les CTE te sortiront de la panade. Rien ne t'empêche d'écrire une procédure (renvoyant des résultats) pour récupérer les enregistrements d'une base externe puis d'utiliser celle-ci dans une CTE.

    mais rien ne marche..
    j'ai une erreur champ emp_no inconnu alors qu'il est dans la table
    ?
    je plussoie Artemus24, en utilisant les SET TERM, même avec la version 2.5 ça fonctionne

    petit détail marrant pour ce faire, j'ai du créer mon alias. Pour vérifier que c'était bon j'ai ensuite enregistrer cette dernière dans flamerobin et me suis connecté dessus. J'ai alors écrit le code test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET TERM ^;
    execute block returns (emp_no smallint) as
    begin
    FOR EXECUTE STATEMENT 'select emp_no from employee'
    ON EXTERNAL DATA SOURCE 'localhost:employee' AS USER 'sysdba' PASSWORD 'masterkey'
    INTO :emp_no
    DO SUSPEND;
    end^
    SET TERM ;^
    pas de soucis, les données sont bien fournies, sauf que j'étais connecté à cette même base !!!! et donc un simple select emp_no from employee aurait suffit
    bref, un déconnexion de cette base et une connexion sur une autre plus tard, le fonctionnement est bien le même

    pour te démontrer qu'une jointure est alors possible, j'ai simplement transformé le EXECUTE STATEMENT en PROCEDURE
    et Hop, une CTE avec Jointure (totalement bidon mais ça fonctionne)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SET TERM ^;
    CREATE PROCEDURE EXTERNVALUES returns (emp_no smallint,fullname varchar(37)) as
    begin
    FOR EXECUTE STATEMENT 'select emp_no,full_name from employee'
    ON EXTERNAL DATA SOURCE 'localhost:employee' AS USER 'sysdba' PASSWORD 'masterkey'
    INTO :emp_no,:fullname
    DO SUSPEND;
    end^
    SET TERM ;^
    -- Employés qui sont également clients dans cette base de données
    WITH E AS (SELECT EMP_NO,FULLNAME FROM EXTERNVALUES)
    SELECT E.EMP_NO,E.FULLNAME FROM E LEFT JOIN CLIENTS C ON C.ID=E.EMP_NO
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  14. #14
    Membre averti Avatar de cantador
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mars 2006
    Messages : 569
    Points : 430
    Points
    430
    Par défaut suite..
    @Artemus24

    tes ^ se transforme en $ !
    remarque c'est quand mieux d'avoir des dollards.. que des chapeaux !

    Pour revenir à nos moutons l'exécution du script avec la bonne syntaxe ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    SET TERM ^;
    execute block returns (emp_no smallint) as
    begin
    FOR EXECUTE STATEMENT 'select emp_no from employee'
    ON EXTERNAL DATA SOURCE 'localhost:employee' AS USER 'sysdba' PASSWORD 'masterkey'
    INTO :emp_no
    DO SUSPEND;
    end^
    SET TERM ;^
    voilà le message d'erreur :
    Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
    Execute statement error at attach :
    335544344 : I/O error during "CreateFile (open)" operation for file "employee"
    335544734 : Error while trying to open file
    3486973 : Le fichier spécifié est introuvable.
    Data source : Firebird::localhost:employee.

    mon alias est :
    EMPLOYEE on localhost = C:\Program Files\Firebird\Firebird_2_5\examples\empbuild\EMPLOYEE.FDB

    une explication pourrait être le contenu d'un fichier sql placé juste à côté de Employee.fdb :

    * The contents of this file are subject to the Interbase Public
    * License Version 1.0 (the "License"); you may not use this file
    * except in compliance with the License. You may obtain a copy
    * of the License at http://www.Inprise.com/IPL.html

    mais ce serait vraiment tordu..
    j'utilise actuellement la dernière version de EMS en Shareware limitée à 30 jours.

    Bref il y a un truc..

    il faudrait déjà que ça fonctionne avec cet exemple avant
    de construire la fameuse procédure qui me faudrait en considérant la base 2 comme externe (les deux bases étant sur le même serveur) soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT base1.table1.chp3
    WHERE (base2.table2.chp1 = base1.table1.chp1)
    AND (base2.table2.chp2 = base1.table1.chp2)
    bien que vous m'avez déjà bien mâché le travail..
    et pour les jointures, vous devez certainement avoir raison puisque vos tests sont bons.

    en tout cas merci pour le coup de main

    @bientôt

  15. #15
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 812
    Points : 34 629
    Points
    34 629
    Billets dans le blog
    54
    Par défaut
    on a le même chemin, la différence viendrait peut être du nom de ton alias
    Citation Envoyé par mon alias.conf
    employee = C:\Program Files\Firebird\Firebird_2_5\examples\empbuild\employee.fdb
    Citation Envoyé par le tien
    EMPLOYEE on localhost = C:\Program Files\Firebird\Firebird_2_5\examples\empbuild\EMPLOYEE.FDB
    pourquoi avoir mis le "on localhost" ? de toute façon l'alias est toujours local au poste
    selon ton alias il aurait fallu mettre ON EXTERNAL DATA SOURCE 'localhost:employee on localhost' AS USER 'sysdba' PASSWORD 'masterkey'et je ne suis pas sur que ce soit une bonne politique de mettre des noms d'alias si complexe (avec des espaces)
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  16. #16
    Membre averti Avatar de cantador
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mars 2006
    Messages : 569
    Points : 430
    Points
    430
    Par défaut Nom de l'alias
    oui SergioMaster, moi aussi je mets des noms d'alias le plus court possible.
    C'est EMS qui place cette syntaxe automatiquement lors du Register..
    et comme il s'agissait de l'exemple fournit par Firebird, je n'ai rien voulu toucher.

    la base est reconnue dans les deux cas (avec ou sans on localhost.

    Mais en l'enlevant, le script s'exécute sans erreur ! (on avance)

    sauf que je n'ai aucune procédure de créée, ni aucun résultat

    ?

    @+

  17. #17
    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
    5 006
    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 : 5 006
    Points : 14 127
    Points
    14 127
    Par défaut
    Salut à tous.

    @ SergioMaster : dans ton post #13, et dans ton dernier exemple, tu passes par une procédure stockée pour pouvoir utiliser la jointure dans un CTE.
    Dans mon exemple post #3, je fais un "execute block" et j'utilise en cascade le "for select". Quel est selon toi la façon de faire la plus performante ?

    Citation Envoyé par Cantador
    tes ^ se transforme en $ !
    Ce ne sont pas mes ^. Je n'utilise pas ce caractère, mais celui que j'utilise sous MySql est "$$". Sauf qu'ici en FireBird, je ne prends que un seul "$". Voilà l'explication !

    Citation Envoyé par Cantador
    mon alias est :
    EMPLOYEE on localhost = C:\Program Files\Firebird\Firebird_2_5\examples\empbuild\EMPLOYEE.FDB
    Je rappelle que je suis sous FireBird 3.0.0 RC2. Dans le fichier databases.conf, j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    employee = $(dir_sampleDb)/employee.fdb
    Il est inutile, chez moi, de créer un nouvel alias car il existe déjà par défaut.
    Je pense que la syntaxe de ton alias "employee" est fausse ou inutilement complexe. Je mettrais plutôt son écriture en minuscule, comme ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    employee = C:\Program Files\Firebird\Firebird_2_5\examples\empbuild\employee.fdb
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  18. #18
    Membre averti Avatar de cantador
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mars 2006
    Messages : 569
    Points : 430
    Points
    430
    Par défaut alias sur table employee
    Je continue cette discussion pour mon information car en ce qui concerne le programme que j'ai à écrire, les avancée de l'audit
    montrent que je vais devoir traiter chaque enregistrement sur plusieurs années.
    Ce qui me fait changer mon fusil d'épaule :

    Dans ces conditions, il est préférable de boucler directement sur le fichier CSV de lancer les algorithmes
    puis stocker les résultats dans une table
    Et dans cette optique, cela m'évite de créer une table supplémentaire.

    et une requête simple avec jointures ou une requête multi-bases avec jointures permettrait de traiter un ensemble de d'enregistrements
    or, c'est juste ce qu'il ne me faut pas !

    et il faut aussi que j'avance..

    Il est inutile, chez moi, de créer un nouvel alias car il existe déjà par défaut.
    Je pense que la syntaxe de ton alias "employee" est fausse ou inutilement complexe. Je mettrais plutôt son écriture en minuscule, comme ci-après :
    j'ai remplacé l'écriture mais
    cela ne change rien Artemus24..

    il faudrait plutôt remplacer le EXECUTE BLOCK par un CREATE PROCEDURE
    car je n'ai plus d'erreur mais je ne vois rien sortir..

    merci

  19. #19
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 812
    Points : 34 629
    Points
    34 629
    Billets dans le blog
    54
    Par défaut
    Bonjour,

    Citation Envoyé par cantador Voir le message
    Je continue cette discussion pour mon information car en ce qui concerne le programme que j'ai à écrire, les avancée de l'audit
    montrent que je vais devoir traiter chaque enregistrement sur plusieurs années.
    Ce qui me fait changer mon fusil d'épaule :
    Dans ces conditions, il est préférable de boucler directement sur le fichier CSV de lancer les algorithmes
    puis stocker les résultats dans une table
    je ne suis pas à ta place, mais la solution CSV me parait tellement "old school"

    j'ai remplacé l'écriture mais
    cela ne change rien Artemus24..

    il faudrait plutôt remplacer le EXECUTE BLOCK par un CREATE PROCEDURE
    car je n'ai plus d'erreur mais je ne vois rien sortir..
    j'ai la même version que toi, et toutes les informations sortent. Remplacer EXECUTE BLOCK par CREATE PROCEDURE ne change rien à l'affaire
    EXECUTE BLOCK permet simplement de ne pas enregistrer une procédure dans la base de données
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  20. #20
    Membre averti Avatar de cantador
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mars 2006
    Messages : 569
    Points : 430
    Points
    430
    Par défaut
    @SergioMaster

    oui, le CSV fait vieux jeu, mais comme je suis âgé, ça colle avec mon profil.
    je ne me vois pas intégrer mes algorithmes dans une telle procédure..
    Quelquefois, il faut savoir abandonner la théorie qui me compliquerait énormément mon programme au profit
    d'une programmation plus simple, plus facile à maintenir et livrée dans les temps.

    EXECUTE BLOCK permet simplement de ne pas enregistrer une procédure dans la base de données
    oui, j'avais bien compris ce point, mais je ne comprends pas pourquoi dans SQL Manager rien ne sort..
    que je place le code dans
    l'éditeur SQL ou l'éditeur de script

    fais le test, avec la version Lite (gratuite) si tu le souhaites.

    je mets un point supplémentaire à toi et Artemus24
    pour votre dévouement.

    @+

Discussions similaires

  1. Résultat commençant par un chiffre avec requête SELECT
    Par nicolas.pissard dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/04/2010, 13h31
  2. Requête SELECT Multibase possible ?
    Par asenaici dans le forum Connexion aux bases de données
    Réponses: 5
    Dernier message: 07/04/2009, 08h41
  3. Insertion multiple à base de sous requête SELECT
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/04/2005, 16h34
  4. SQL Server 7.0 - Requête Select
    Par sangokus dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 23/03/2004, 10h32
  5. Optimisations mysql sur les requêtes SELECT: index
    Par leo'z dans le forum Débuter
    Réponses: 2
    Dernier message: 29/11/2003, 13h23

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