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

DB2 Discussion :

Function: Requete SQL avec variable


Sujet :

DB2

  1. #1
    Candidat au Club
    Function: Requete SQL avec variable
    Bonjours à tous,

    Je découvre petit à petit DB2 sur AS400 et je m'essaye aux fonctions utilisateurs (UDF).
    Mais j'ai bien sur un premier "gros" problème:
    Nous travaillons avec 2 bibliothèques: une de développement et une de production.
    En phase de développement, on écrit nos requetes ainsi: "SELECT * FROM LIBDEV/MYTABLE..." et bien sur lorsque l'on bascule en Prod, il faut changer partout le nom de la bibliothèque.
    Je trouve cela un peu contraignant et en créant mes premières fonctions, je me dis que je pourrais passer un paramètre à la fonction qui indiquerait quelle bibliothèque utiliser.
    Voici ce que j'aimerais faire:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE FUNCTION MYBIB/MYFONCTION (            
         BIBLIO     CHAR(10) DEFAULT 'LIBDEV' 
    ) 
     
    BEGIN
         CASE WHEN BIBLIO = 'P' THEN SET BIBLIO = 'LIBPROD' ELSE SET BIBLIO ='LIBDEV' END CASE;
         SELECT * FROM BIBLIO/MYTABLE
    END


    L'idée c'est que dans la requete "SELECT * FROM BIBLIO/MYTABLE", BIBLIO soit remplacé par 'LIBPROD' ou 'LIBDEV' suivant le paramètre transmis.
    Mais cela ne marche pas.
    Avant j'ai essayé d'ajouter la commande "USE BIBLIO", mais cela n'existe pas en DB2.

    Est ce que vous auriez des idées à me proposer pour régler ce problème. Peut être que j'utilise mal l'envirronement AS400<>DB2 et qu'il faut revoir tout notre organisation de bibliothèque.
    Merci pour votre aide et vos retours d'expérience.

    Marc

  2. #2
    Membre actif
    Bonjour.
    Je suis sur IBM i et nous sommes dans le même cas : des bibliothèques différentes.

    Lorsque nous faisons des fonctions ou des procédures SQL, nous ne qualifions jamais rien (ni la fonction elle-même, ni les tables lues).
    C'est lorsqu'elle est créée qu'on se met en mode *SYS (sur IBM i, c'est un paramètre du RUNSQL ou RUNSQLSTM) pour permettre l'utilisation de la liste de bibliothèques et nom une bibliothèque courante. N'oublions pas qu'une fonction ou qu'une procédure se copie ou se restaure d'une bibliothèque à une autre ou d'un système à un autre, c'est aussi ce qui permet de se passer de la qualification).

    Et pareil lors de l'exécution : elle tient compte de la liste de bibliothèques si on reste en mode *SYS (option naming = *SYS).

  3. #3
    Candidat au Club
    Merci pour ta réponse.

    C'est ce que j'avais commencé à faire, mais c'est un tel bazar dans les bibliothèques avec les profils de développement (en prod, c'est mieux), qu'il y a toujours un risque d'utiliser un mauvais fichier.
    Mais, je suis d'accord avec toi, je vais préconiser cette solution.

    Sinon, il n'y a vraiment pas d'équivalent à USE, qui pemet d'indiquer la base de données par défaut dans un script SQL ?
    J'ai regardé la notion de SCHEMA.
    En tapant "values current schema" j'obtiens *LIBL, mais je ne sais pas comment créer un nouveau schema avec une liste de bibliothèque différente


    Encore Merci

    Marc

  4. #4
    Expert éminent sénior
    il y a fort longtemps que je ne suis pas intervenu chez un client AS400 (system i) mais sur DB2 for Z/OS le schema est LA solution
    On ne code jamais en dur le schéma des requêtes ainsi la requête reste identique quelque soit l'environnement et la plate forme dans lequel elle est exécutée.
    Le schema est mis une fois pour toutes à l'exécution, soit par un "set current schema" avant d'exécuter les requêtes, soit grâce aux paramètres de lancement du job

  5. #5
    Candidat au Club
    Merci beaucoup pour ton retour d'expérience, je vais creuser cela sérieusement.

    Marc

  6. #6
    Expert éminent
    Bonjour comme dit plus haut, la solution c'est le schema. Donc bien gérer la liste des bibliothèques entre environnements. Je ne qualifie dès lors jamais le schéma de mes tables et les livraisons sont fluides entre environnements.

  7. #7
    Expert éminent
    Citation Envoyé par bolm2 Voir le message

    Mais j'ai bien sur un premier "gros" problème:
    Nous travaillons avec 2 bibliothèques: une de développement et une de production.
    En phase de développement, on écrit nos requetes ainsi: "SELECT * FROM LIBDEV/MYTABLE..." et bien sur lorsque l'on bascule en Prod, il faut changer partout le nom de la bibliothèque.
    Marc
    Pour faire du SQL dynamique avec tes environnements (peu élégant avec une gestion pénible des quote) il faudrait une instruction "prepare" (dans une chaîne de caractère tu créées ton instruction) et ensuite l'exécution de l'ordre.

  8. #8
    Membre actif
    Sur l'IBM i, il n'y a qu'une base de donnée et on s'y connecte automatiquement.
    Et la notion de schéma correspond pratiquement à une notion "bibliothèque". Donc le set current schema met la bibliothèque en *CURLIB sur le travail. Ca fonctionne si les données sont dans une seule bibliothèque. Par exemple dans mon cas, on trouve des données dans au moins 6 bibliothèques en ligne, donc il faut forcément que je passe par la *LIBL et non par un current schema.

  9. #9
    Expert éminent
    En fait il n'y a rien à préciser si l'ordre des LIB est correctement paramétré dans l'environnement. Il faut pouvoir faire un select * from table dans n'importe quel environnement.

  10. #10
    Expert éminent sénior
    Citation Envoyé par pwrdwnsys Voir le message
    Sur l'IBM i, il n'y a qu'une base de donnée et on s'y connecte automatiquement.
    Et la notion de schéma correspond pratiquement à une notion "bibliothèque". Donc le set current schema met la bibliothèque en *CURLIB sur le travail. Ca fonctionne si les données sont dans une seule bibliothèque. Par exemple dans mon cas, on trouve des données dans au moins 6 bibliothèques en ligne, donc il faut forcément que je passe par la *LIBL et non par un current schema.
    Là encore, je ne me prononcerai pas sur la solution DB2i pour ne l'avoir plus fréquenté depuis bien longtemps.
    Sur Z/OS, ceci n'est pas un problème, il suffit de créer autant d'alias que nécessaire pour ne voir qu'un seul schéma

  11. #11
    Candidat au Club
    Merci à vous pour vos conseils.

    Je suis d'accord avec la plupart d'entre vous, il faut éviter le nom des biblios dans les scripts et utiliser le schema et dans mon cas, l'ordre des bibliothèques dans *LIBL.

    et dans mon cas, il s'agit plus de mauvaises habitudes de travail qu'il faudrait changer.

    Cordialement,

    Marc