2016-12-27 2 views
1

J'ai une transformation complexe où une étape de recherche spécifie l'une des 30 opérations de chaîne différentes/spécifiques qui doivent être effectuées sur une ligne. Je me demande comment le faire efficacement dans DataStage?IBM DataStage: évaluation d'une chaîne en tant que code/expression

L'exigence est quelque chose comme ceci:

If 
     col_a = 1 
    Then 
     col_b := some_string_function(col_c) 
    Else If 
     col_a = 2 
    Then 
     col_b := some_other_string_function(col_d) 
    Else If 
     col_a = 3 
    Then 
     col_b := yet_another_string_function(col_c & col_d) 
    Else If ... 

... et ainsi de suite.

Ce que j'ai exploré jusqu'à présent:

Ma première impulsion était d'inclure le code (nom du champ (s) et de chaîne) en tant que chaîne/champ dans la table de consultation et utiliser ce code après la recherche dans un expression de l'étage du transformateur. Cependant, il ne semble y avoir aucun moyen d'évaluer une chaîne comme code dans une expression de transformateur? Une autre solution que j'ai trouvée est de mettre le code dans beaucoup d'instructions de contrôle imbriquées à l'intérieur d'une étape de transformation, ce qui semble terriblement inefficace, surtout que DataStage ne semble pas offrir une instruction de contrôle équivalente à "CASE "/"COMMUTATEUR". Ou est-ce? Substituer (une partie de) les énoncés de contrôle avec une étape de transition alimentant différents stades de recherche/transfomtrie semblerait plus efficace puisqu'ils pourraient être faits en parallèle mais seraient difficiles à concevoir.

Je n'ai pas encore essayé les routines de serveur.

Répondre

0

Je connais Datastage 8.5. Avoir une longue déclaration If/Then/Else dans la transformation fonctionnerait, mais oui, c'est désordonné et inefficace.

Mon premier réflexe est d'utiliser une routine Serveur, de type Transformation.

La fonction pourrait fonctionner comme ceci:

Transform function  
Arguments: col_A, col_C, col_D 

    FUNCTION CALC_B(col_A,col_C,col_D) 
    Begin Case 
     Case colA = 1 
      Ans = StringFunc(colC) 

     Case colA = 2 
      Ans = OtherStringFunc(colC,colD) 

     Case colA = 3 OR colA = 4 
      Ans = YetOtherStringFunc(colC,colD) 
    End Case 

Ensuite, dans votre transformez, vous pouvez utiliser la fonction pour définir la valeur de votre col_B.

CALC_B(myrow.colA,myrow.colC,myrow.colD) 

Je pense que le plus gros problème avec ceci est de savoir si BASIC a les opérations de chaîne dont vous avez besoin. Voici un lien vers leur page de programmation.

IBM - Working with Routines

IBM - Basic Programming Language