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
- 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
- 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 :
ouSELECT applyop('+', 3, 5);
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
- 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é. - 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
$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
$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
SELECT applyop_fortran('+', 4, 10);
APPLYOP
---------
14
(1 row)
nzaeHandleRequest()
, vous appelez " nzaeUserError()
pour envoyer une erreur. L'exemple suivant déclenche une erreur :SELECT applyop_fortran('-',1,2);
ERROR: Unhandled operator.