Fonction scalaire en langage Fortran

L'exemple suivant montre une fonction scalaire simple qui additionne un ensemble de nombres. Cet exemple commence par la construction d'un AE simple. Il utilise le nom de fichier suivant : " applyop.f

Coder

  1. Créer le programme et l'appeler " nzaeRun(). Cet appel met en place l'AE, puis effectue un rappel vers " nzaeHandleRequest(), nécessaire pour l'implémentation en Fortran. Ceci peut être réalisé en utilisant :
    program applyopProgram
    call nzaeRun()
    stop
    end
    subroutine nzaeHandleRequest(handle)
    c Our custom Fortran code will go here.
    return
    end
  2. Compléter le code Fortran personnalisé. Dans cet UDF, vous transmettez un opérateur de chaîne, qui est soit un "+" (ajouter), soit un "*" (multiplier), ainsi que deux nombres entiers. Le code renvoie soit le produit, soit la somme des nombres entiers. En SQL, une version simple de cette fonction peut être appelée par l'une ou l'autre des méthodes suivantes :
    SELECT applyop('+', 3, 5);
    ou
    SELECT applyop('*', 3, 5);
    Bien que l'exemple mentionné ne comporte qu'une seule entrée, le système NPS traite des flux d'entrées. Par conséquent, le système NPS est plus susceptible d'être utilisé :
    SELECT applyop(mytable.operator, mytable.value1, mytable.value2) FROM mytable;

    Dans le premier exemple, le système NPS prend les constantes "+", 3 et 5 et les transforme en un flux de longueur 1 contenant trois éléments. En interne, tous les cas mentionnés sont traités de la même manière et l'on peut supposer qu'il y a plusieurs entrées dans l'AE " applyop

  3. Une entrée de traitement de boucle est nécessaire, ce qui, en Fortran 77, peut être réalisé avec une instruction " if et une instruction " goto. Par exemple :
    program applyopProgram
    call nzaeRun()
    stop
    end
    subroutine nzaeHandleRequest(handle)
    integer hasNext, leftInput, rightInput, result
    character operator
    hasNext = -1
    10 call nzaeGetNext(handle, hasNext)
    if (hasNext .eq. 0) then
    goto 20
    endif
    c Our loop work will go here.
    goto 10
    20 return
    end

    Notez l'initialisation de la variable " hasNext Cela est nécessaire pour les variables "out" qui font appel à l'interface sous-jacente. Sans cela, le pointeur " hasNext reste non alloué et ne peut pas recevoir de données de l'appel sous-jacent. La fonction " nzaeGetNext() attribue à la variable " hasNext la valeur 1 (VRAI) s'il y a un autre élément dans le flux, et la valeur 0 (FAUX) si le flux est terminé.

  4. Ajouter la logique :
    program applyOpProgram
    call nzaeRun()
    stop
    end
    subroutine nzaeHandleRequest(handle)
    integer hasNext, leftInput, rightInput, isNull, result
    character operator
    hasNext = -1
    leftInput = 0
    rightInput = 0
    operator = 'f'
    isNull = 0
    10 call nzaeGetNext(handle, hasNext)
    if (hasNext .eq. 0) then
    goto 20
    endif
    c GET OUR INPUT.
    call nzaeGetInputString(handle, 0, operator, isNull)
    call nzaeGetInputInt32(handle, 1, leftInput, isNull)
    call nzaeGetInputInt32(handle, 2, rightInput, isNull)
    c OPERATE.
    if (operator .eq. '+') then
    result = leftInput + rightInput
    else if (operator .eq. '*') then
    result = leftInput * rightInput
    else
    call nzaeUserError(handle, 'Unhandled operator.')
    endif
    c OUTPUT.
    call nzaeSetOutputInt32(handle, 0, result)
    call nzaeOutputResult(handle)
    goto 10
    20 return
    end

    Chaque entrée de la boucle contient les trois éléments qui sont transmis à la fonction. La fonction " nzaeGetInputX() prend la poignée qui représente une demande d'utilisateur, un indice de colonne qui, dans ce cas, spécifie 0 pour l'opérateur, 1 pour l'entrée gauche et 2 pour l'entrée droite, et la variable de sortie. La fonction 'nzaeUserError() signale une erreur à l'utilisateur SQL. La fonction " nzaeSetOutputX() produit le résultat. Comme il s'agit d'un UDF, le résultat ne peut comporter qu'une seule colonne. Un exemple ultérieur montre comment utiliser les UDTF pour éditer plusieurs colonnes. Lorsque le code est complet, il doit être compilé et enregistré.

Compilation

Compiler le code :
$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language fortran --version 3 \
--template compile --exe applyopFortran applyop.f

Les exécutables de sortie, un pour l'hôte et un pour le SPU, sont placés dans les répertoires " host et " spu dans " /nz/export/ae/applications/$NZ_USER/$NZ_DATABASE

Enregistrement

Enregistrer les exécutables :
$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language fortran --version 3 \
--template udf --exe applyopFortran \
--sig "applyop_fortran(varchar(1), int4, int4)" --return int4

En cours d'exécution

Vous pouvez maintenant exécuter l'AE dans SQL :
SELECT applyop_fortran('+', 4, 10);
APPLYOP
---------
14
(1 row)
Notez que dans le code, lorsque vous validez les types dans " nzaeHandleRequest(), vous appelez " nzaeUserError() pour envoyer une erreur. L'exemple suivant déclenche une erreur :
SELECT applyop_fortran('-',1,2);
ERROR: Unhandled operator.