スカラー JavaScript UDFs

このトピックでは、スカラー JavaScript UDFs (ユーザー定義関数)について説明します。

このトピックの内容:

紹介

スカラー JavaScript UDF 関数は、入力行ごとに1つの出力行を返します。出力行には、1つの列/値のみを含める必要があります。

基本的な例は JavaScript UDFs の紹介 にあります。追加の例を以下に示します。

このセクションには、スカラー JavaScript UDFs の例が含まれています。

この例は、 JavaScript UDF が自分自身を呼び出すことができることを示しています(つまり、再帰の使用可能)。

再帰的な UDFを作成します。

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)));
  $$
  ;

再帰的な UDFを呼び出します。

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

この例は、カスタム例外をスローする JavaScript UDF を示しています。

関数を作成します。

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;
    }
$$;

有効な値と無効な値を持つテーブルを作成します。

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

関数を呼び出すには、

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

トラブルシューティング

エラーメッセージ: Variable is not defined

原因

場合によっては、アンパサンドは変数置換文字であるため、このエラーメッセージは CREATE FUNCTION コマンド内のアンパサンド(&)によって発生する場合があります。例:

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

エラーは、関数が呼び出されたときではなく、関数が作成されたときに発生します。

解決策

変数置換を使用しない場合は、明示的に無効にできます。例えば、 SnowSQLでは、次のコマンドを実行して変数置換を無効にできます。

!set variable_substitution=false;

変数置換の詳細については、 変数の使用 をご参照ください。