UDFs JavaScript scalaires

Cette chapitre traite des UDFs JavaScript scalaires (fonctions définies par l’utilisateur).

Dans ce chapitre :

Introduction

Une UDF JavaScript renvoie une ligne de sortie pour chaque ligne d’entrée. La ligne de sortie ne doit contenir qu’une seule colonne/valeur.

Un exemple de base se trouve dans Présentation des UDFs JavaScript. D’autres exemples sont présentés ci-dessous.

Exemples

Cette section contient des exemples d” UDFs JavaScript scalaires.

Cet exemple montre qu’une UDF JavaScript peut s’appeler elle-même (c’est-à-dire qu’elle peut utiliser la récursivité) :

Créez un UDF récursif :

CREATE OR REPLACE FUNCTION RECURSION_TEST (STR VARCHAR)
  RETURNS VARCHAR
  LANGUAGE JAVASCRIPT
  AS $$
  return (STR.length <= 1 ? STR : STR.substring(0,1) + '_' + RECURSION_TEST(STR.substring(1)));
  $$
  ;

Appelez l’UDF récursif :

SELECT RECURSION_TEST('ABC');
+-----------------------+
| RECURSION_TEST('ABC') |
|-----------------------|
| A_B_C                 |
+-----------------------+

Cet exemple montre un UDF JavaScript qui lève une exception personnalisée :

Créez la fonction :

CREATE FUNCTION validate_ID(ID FLOAT)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS $$
    try {
        if (ID < 0) {
            throw "ID cannot be negative!";
        } else {
            return "ID validated.";
        }
    } catch (err) {
        return "Error: " + err;
    }
$$;

Créez une table avec des valeurs valides et non valides :

CREATE TABLE employees (ID INTEGER);
INSERT INTO employees (ID) VALUES 
    (1),
    (-1);

Appelez la fonction :

SELECT ID, validate_ID(ID) FROM employees ORDER BY ID;
+----+-------------------------------+
| ID | VALIDATE_ID(ID)               |
|----+-------------------------------|
| -1 | Error: ID cannot be negative! |
|  1 | ID validated.                 |
+----+-------------------------------+

Dépannage

Message d’erreur : Variable is not defined

Cause

Dans certains cas, ce message d’erreur peut être causé par une esperluette (&) à l’intérieur d’une commande CREATE FUNCTION parce que l’esperluette est le caractère de substitution de la variable. Par exemple :

create function mask_bits(...)
    ...
    as
    $$
    var masked = (x & y);
    ...
    $$;

L’erreur se produit au moment de la création de la fonction et non au moment de l’appel de la fonction.

Solution

Si vous n’avez pas l’intention d’utiliser de substitution de variable, vous pouvez explicitement la désactiver. Par exemple, dans SnowSQL, vous pouvez désactiver la substitution de variable en exécutant la commande suivante :

!set variable_substitution=false;

Pour plus d’informations sur la substitution de variables, voir Utilisation de variables.