2014-05-19 15 views
2

J'ai du mal à obtenir les résultats corrects de ma procédure stockée. J'utilise une base de données db2 et j'ai 3 paramètres d'entrée division, département, projet. Ma déclaration d'appel ressemble à ceci.Procédure stockée DB2 avec paramètres

CALL schema.stored_procedure ('IT', 'MARKETING', 'ONLINE FULFILLMENT') 

J'ai besoin de produire des résultats qui affichera la ligne de données lorsque le troisième paramètre est spécifié ou a une valeur pour le nom du projet (à partir de l'exemple ci-dessus « Online_fulfillment ») et pour afficher toutes les résultats lorsque le troisième paramètre a une valeur 'ALL' pour le nom du projet (selon l'exemple ci-dessous 'ALL'). Ma requête ci-dessous ne renvoie actuellement que les noms d'en-tête de colonne sans résultat et je rencontre des problèmes pour le déboguer. Voici ma procédure stockée actuelle.

CREATE PROCEDURE schema.stored_procedure 
    (IN in_DIVISION_NAME VARCHAR(200) 
    ,IN in_DEPARTMENT_NAME VARCHAR(20) 
    ,IN in_PROJECT_NAME VARCHAR(400) 
) 
    DYNAMIC RESULT SETS 1 
BEGIN 
    IF (in_PROJECT_NAME = 'ALL') THEN 
    BEGIN 
    DECLARE GLOBAL TEMPORARY TABLE TEMP_DW_1 
     (DIM_PROJECT_ID INT 
     ,PROJECT_NAME VARCHAR (400) 
     ,DIM_DEPARTMENT_ID INT 
     ,DEPARTMENT_NAME VARCHAR(100) 
     ,DIVISION_NAME VARCHAR(100) 
    ) ON COMMIT DELETE ROWS NOT LOGGED WITH REPLACE; 
    END; 

    INSERT INTO SESSION.TEMP_DW_1 (DIM_PROJECT_ID, PROJECT_NAME, DIM_DEPARTMENT_ID, 
     DEPARTMENT_NAME,DIVISION_NAME) 
      SELECT DISTINCT DJ.DIM_PROJECT_ID 
      ,PROJECT_NAME 
      ,DIM_DEPARTMENT_ID 
      ,DEPARTMENT_NAME 
      ,DIVISION_NAME 
       FROM SCHEMA.FACT_TABLE 
       WHERE DEPARTMENT_NAME = in_DEPARTMENT_NAME 
       AND DIVISION_NAME = in_DIVISION_NAME; 

      BEGIN 
     DECLARE exitCursor CURSOR WITH RETURN FOR 
     SELECT * 
     FROM SESSION.TEMP_DW_1; 

     OPEN exitCursor; 

      END; 
END 

RESULTATS ATTENDUS: CALL schema.stored_procedure ('IT', 'marketing', 'SATISFACTION EN LIGNE) enter image description here RÉSULTATS ATTENDUS: CALL schema.stored_procedure ('IT', 'marketing',' ALL ') enter image description here

+0

Deux choses: 1) Pourquoi Dump-vous les résultats dans une table temporaire, puis ouvrez un nouveau curseur et retourner toutes les lignes de la table temporaire (par opposition juste en ouvrant un curseur sur le 'SELECT 'initial)? 2) Cette procédure semble en fait susceptible d'être créée en tant que vue, ce qui serait probablement plus à même d'utiliser l'optimiseur dans les cas où vous vous joignez aux résultats. Évidemment, vous ne pouvez pas fournir de paramètres pour la vue, mais il serait trivial de les fournir en tant que condition de jointure/dans le cadre d'une clause WHERE. –

Répondre

0

Je crois avoir résolu ce problème en ajoutant une somme supplémentaire instruction IF réglage du in_PROJECT_NAME <> « ALL » et en ajoutant un filtre supplémentaire à la deuxième requête qui définit la PROJECT_NAME = in_PROJECT_NAME. Peut-être un moyen plus facile de résoudre cela, mais il fonctionne:

IF (in_PROJECT_NAME <> 'ALL') THEN 
BEGIN 
    DECLARE GLOBAL TEMPORARY TABLE TEMP_DW_1 
    (DIM_PROJECT_ID INT 
    ,PROJECT_NAME VARCHAR (400) 
    ,DIM_DEPARTMENT_ID INT 
    ,DEPARTMENT_NAME VARCHAR(100) 
    ,DIVISION_NAME VARCHAR(100) 
    ) ON COMMIT DELETE ROWS NOT LOGGED WITH REPLACE; 
END; 

INSERT INTO SESSION.TEMP_DW_1 (DIM_PROJECT_ID, PROJECT_NAME, DIM_DEPARTMENT_ID, 
    DEPARTMENT_NAME ,DIVISION_NAME) 
    SELECT DISTINCT DJ.DIM_PROJECT_ID 
    ,PROJECT_NAME 
    ,DIM_DEPARTMENT_ID 
    ,DEPARTMENT_NAME 
    ,DIVISION_NAME 
    FROM SCHEMA.FACT_TABLE 
    WHERE DEPARTMENT_NAME = in_DEPARTMENT_NAME 
    AND DIVISION_NAME = in_DIVISION_NAME; 
    AND PROJECT_NAME = in_PROJECT_NAME 
+1

Votre solution semble bonne, mais si vous avez de nombreux cas, et chaque fois que vous avez besoin de copier la même sélection, alors le mieux est d'utiliser une requête dynamique (préparer, exécuter). – AngocA

+0

Pouvez-vous me donner un exemple? – Tone

Questions connexes