GaussDB データベース SQL シリーズ - カスタム関数

目次

I.はじめに

2. カスタム関数(関数)の概要

3. 利用シーン

4. メリットとデメリット

1. データベースで関数を使用する利点

2. データベースで Function を使用するデメリット

5. GaussDBの関数例と解析

1. 例 1: 関数を SQL クエリとして定義する

2. 例 2: 複数の出力パラメータを含むレコードを返す

3. 例 3: RECORD タイプの結果セットを返す

6. まとめ

I.はじめに

Huawei Cloud GaussDB データベースは、高性能、高セキュリティのクラウドネイティブ データベースであり、GaussDB ではカスタム関数が無視できない重要な機能です。この記事では、GaussDB のカスタム関数の使用シナリオ、その利点と欠点、例とサンプル分析などを簡単に紹介し、読者へのガイダンスと支援を提供します。

2. カスタム関数(関数)の概要

SQL では、カスタム関数 (Function) は、特定のタスクを実行して結果を返す再利用可能なコード ブロックです。関数はパラメータを受け入れ、指定された結果などを返すことができます。GaussDB では、Function はデータベース管理者と開発者にとって重要な「ツール」です。Function を使用すると、複雑なロジックをカプセル化してデータ処理プロセスを簡素化し、作業効率を向上させることができます。

3. 利用シーン

データベース内の Function の使用シナリオには次のものが含まれますが、これらに限定されません。

  • データ処理: 文字列の分割、マージ、置換、変換などのデータの処理、日付と時刻のフォーマット、時差の計算など、計算、四捨五入、四捨五入などのデータ処理に使用できます。ブール値など
  • 集計操作:平均、合計、最大値、最小値などの計算など、データに対して集計操作を実行するために使用できます。
  • 条件判定:値が特定の条件を満たすかどうかを判定し、対応する結果を返すなどの条件判定を行うことができます。
  • コードの再利用と抽象化を実装する:コードの再利用を実装するために使用できるため、重複コードを記述するプログラマの作業負荷が軽減されます。また、コードの抽象化を実装するためにも使用できます。

4. メリットとデメリット

1.データベースで関数を使用する利点

  • 高速な実行速度:作成時にのみコンパイルされ、実行するたびに再コンパイルする必要はありません。一般に、SQL ステートメントは実行するたびにコンパイルする必要があるため、関数を使用すると SQL ステートメントの実行速度を向上させることができます。データベース。
  • 操作が簡単:複雑なデータベース操作をカプセル化でき、対応する操作を完了するために必要な関数呼び出しは 1 つだけなので、データベース操作が簡素化されます。
  • 高い再利用性:繰り返し利用できるため、データベース開発者の負担を軽減します。
  • システムのセキュリティの向上:特定のユーザーのみが指定された機能を使用する権限を持つように設定でき、データベースのセキュリティが強化されます。

2.データベースで Function を使用するデメリット

  • デバッグの難しさ: SQL ステートメントと比較して、関数のデバッグはより困難です。
  • 移植性が低い: データベース システムが異なると、関数の使用法や構文が異なる場合があるため、関数の移植性が低くなります。

5. GaussDBの関数例と解析

共通機能の操作(作成、呼び出し、削除など)

1.例 1: 関数を SQL クエリとして定義する

--定义函数为SQL查询
CREATE FUNCTION func_add_sql(integer, integer) RETURNS integer
    AS 'select $1 + $2;'
    LANGUAGE SQL
    IMMUTABLE
RETURNS NULL ON NULL INPUT;

--调用
SELECT func_add_sql(1,9);

--DROP
DROP FUNCTION func_add_sql;

通話結果:

分析の説明:

このコードは「func_add_sql」という SQL 関数を作成しています。この関数は 2 つの整数を入力パラメータとして受け取り、その合計を返します。

  • 「CREATE FUNCTION」: これは、新しい関数を作成するために使用される SQL コマンドです。
  • "func_add_sql": 作成した関数の名前です。
  • 「RETURNS integer」: 関数の戻り値の型が整数であることを指定します。
  • 「IMMUTABLE」: これは、この関数が同じ入力を与えられた場合に常に同じ結果を返すことを示す機能です。つまり、この関数は外部の状態やデータに依存せず、その結果は変わりません。
  • 「RETURNS NULL ON NULL INPUT」: いずれかの入力パラメータが NULL の場合、関数は NULL を返すことを示します。
  • 「LANGUAGE SQL」: 関数が SQL 言語で記述されることを指定します。
  • "'select $1 + $2;'": これは関数の本体です。$1 と $2 はパラメーター参照で、それぞれ 2 つの入力パラメーターを表します。

2.例 2: 複数の出力パラメータを含むレコードを返す

--返回一个包含多个输出参数的记录。
CREATE FUNCTION func_dup_sql(in int, out f1 int, out f2 text)
    AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
    LANGUAGE SQL;

--调用
SELECT * FROM func_dup_sql(10);

--DROP
DROP FUNCTION func_dup_sql;

通話結果:

分析の説明:

この関数は func_dup_sql と呼ばれ、1 つの入力パラメータ (ラベル付き) を受け入れ、2 つの出力 (ラベル f1 および f2) を生成します。

コード ブロックは関数本体内で $$ でマークされており、その中には入力パラメーター $1 の 2 つの異なる値を返す SELECT ステートメントがあります。f1 の場合、入力された整数値を直接返します。f2 の場合、入力整数値をテキスト文字列に変換し、その後に文字列「is text」を追加します。この変換は、$1 を整数値からテキスト文字列に変換する CAST 関数を使用して行われます。

この関数の言語は SQL です。つまり、SQL のコンテキストで実行されます。基本的に、この関数は入力として整数を受け取り、整数と、テキスト サフィックスが追加された整数から生成された文字列の 2 つの値を返します。

3.例 3: RECORD タイプの結果セットを返す

--返回RECORD类型
CREATE OR REPLACE FUNCTION compute(i int, out result_1 bigint, out result_2 bigint)
returns SETOF RECORD
as $$
begin
    result_1 = i + 1;
    result_2 = i * 10;
return next;
end;
$$ language plpgsql;

--调用
SELECT compute(10);

--DROP
DROP FUNCTION compute;

通話結果:

分析の説明:

これは、GaussDB データベース互換の PL/pgSQL カスタム関数の定義です。この関数は compute と呼ばれ、整数パラメータ i を受け取り、result_1 と result_2 の 2 つのフィールドを含むレコードセットを返します。これらのフィールドは両方とも大きな整数型 (bigint) です。

関数の本体では、次の操作が定義されています。

  • "result_1 = i + 1;": パラメータ i に 1 を加えた結果を result_1 に代入します。
  • "result_2 = i * 10;": パラメータ i を 10 倍した結果を result_2 に代入します。
  • "return next;": 結果セットの次の行を返します。この関数は 1 行のみを返すため、この行は最初の呼び出しで返されます。
  • "$$ language plpgsql;" :この関数のプログラミング言語が PL/pgSQL と互換性があることを宣言します。

この関数を呼び出すときに整数パラメータを渡すと、result_1 フィールド値が入力整数に 1 を加えた値、result_2 フィールド値が入力整数に 10 を乗算したレコードを含む結果セットが返されます。

6. まとめ

一般に、GaussDB では、関数はデータベース管理者や開発者がデータをより効果的に処理および操作し、作業効率を向上させ、データ クエリ、データ変換、データ フィルタリングなどを実行するのに役立つ強力かつ柔軟なツールです。シーン。

もちろん、GaussDB データベースに関しては、上記の例に加えて、パッケージ属性のオーバーロード関数の作成、構文 "ALTER FUNCTION function_name..." による関数の変更、構文 " による削除など、多くの実践方法があります。 DROP FUNCTION [ IF EXISTS ] function_name...」 関数など 公式サイトの情報も学習やテストにぜひご参照ください!

- 仕上げる

200元の罰金と100万元以上を没収 ヨウ・ユシ:高品質の中国語文書の重要性 マスク氏のコアなサーバー移行 TCP輻輳制御がインターネットを救った Apache OpenOfficeは事実上の「保守されていない」プロジェクト Googleが創立25周年を祝う Microsoftオープンソースの Windows-drivers-rs、Rust を使用して Windows ドライバを開発 Raspberry Pi 5 は 10 月末にリリースされ、価格は 60 ドルから macOS コンテナ: Docker を使用して macOS 上で macOS イメージを実行 IntelliJ IDEA 2023.3 EAP がリリース
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/gaussdb/blog/10114789