パラメーター化ビュー機能を使用すると、テーブルまたは変数をインポートしてビューをカスタマイズできます。 このトピックでは、MaxCompute SQLエンジンでサポートされているパラメーター化ビュー機能について説明します。
背景情報
MaxComputeの従来のビューでは、複雑なSQLスクリプトが下層にカプセル化されています。 標準のテーブルを読むようなビューを呼び出すことができますが、下のレイヤーの実装メカニズムを理解する必要はありません。 従来のビューは、コードのカプセル化と再利用を実装するため、広く使用されています。 ただし、従来のビューはパラメーターをサポートしていません。 たとえば、フィルター条件を渡して、ビューの基になるテーブルのデータをフィルター処理したり、ビューに他のパラメーターを渡したりすることはできません。 これは、コード再利用効率を低くする。 MaxCompute SQLエンジンは、パラメーター化されたビューをサポートし、テーブルまたは変数をインポートしてビューをカスタマイズできます。
構文
CREATE [OR REPLACE] [IF NOT EXISTS] <view_name> (<variable_name><variable_type> [, <variable_name> <variable_type> ...])
[RETURNS <return_variable> TABLE (<col_name> <col_type> comment <col_comment> [,<col_name> <col_type> comment <col_comment>])]
[comment <view_comment>]
AS
{<select_statement> | BEGIN <statements> END}view_name: 必須です。 このパラメータには、ビューの名前を指定します。
variable_name: 必須です。 このパラメータは、ビュー変数の名前を指定します。
variable_type: 必須です。 このパラメーターは、ビュー変数の型を指定します。
return_variable: オプション。 このパラメーターには、ビューによって返される変数の名前を指定します。
col_name: オプション。 このパラメーターには、ビューによって返される列の名前を指定します。
col_type: オプション。 このパラメータは、ビューによって返される列のタイプを指定します。
col_comment: オプション。 このパラメーターには、ビューによって返される列のコメントを指定します。
view_comment: オプション。 このパラメータは、ビューのコメントを指定します。
select_statement:
SELECT句。 この句またはステートメント句を指定する必要があります。statements: ビューのスクリプト。 この句またはselect_statement句を指定する必要があります。
パラメータ化されたビューの定義
パラメーター化されたビューを作成するには、次の構文を使用します。
-- prerequisite for defining a view SQL: create tables(ignore if it already exists)
CREATE TABLE srcp (key STRING, value BIGINT, p STRING);
-- view with parameters
-- param @a -a table parameter
-- param @b -a string parameter
-- returns a table with schema (key string, value string)
CREATE VIEW IF NOT EXISTS pv1(@a TABLE (k STRING, v BIGINT), @b STRING)
AS
SELECT srcp.key,srcp.value FROM srcp JOIN @a ON srcp.key=a.k AND srcp.p=@b;説明:
パラメータが定義されています。 したがって、Script Mode SQLを使用してパラメーター化されたビューを定義する必要があります。
作成されたpv1ビューには、tableとstringの2つのパラメーターがあります。 tableパラメーターをテーブル名に、stringパラメーターを基本データ型に設定できます。
SELECT * FROM view_name( (SELECT 1 FROM src WHERE a > 0), 1);などのサブクエリをパラメーター値として使用することもできます。ビューを作成するときに、パラメーターを任意のデータ型を示すanyに設定できます。 たとえば、
CREATE VIEW paramed_view (@ a any) AS SELECT * FROM src WHEREケースWHEN @ aはnull、key1 else key2 end = key3;を使用してビューを定義します。 この例では、ビューの最初のパラメーターは、任意のデータ型の値にすることができます。ただし、
+やANDなど、特定のデータ型を必要とする演算では、この値を使用することはできません。 any型のフィールドは、tableパラメーターで指定されたテーブルのPassThrough列としてよく使用されます。 例:-- prerequisite for defining a view SQL: create tables(ignore if it already exists) CREATE TABLE students (name STRING, id BIGINT, age BIGINT); -- define a view CREATE VIEW paramed_view (@a TABLE (name STRING, id ANY, age BIGINT)) AS SELECT * FROM @a WHERE name = 'foo' AND age< 25; -- example SELECT * FROM paramed_view ((SELECT name, id, age FROM students));説明CREATE VIEWステートメントを実行してビューを作成した後、DESCステートメントを実行してビューの説明を取得できます。 説明には、ビューの戻り値の型が含まれます。ビューの戻り値の型は、ビューが呼び出されると再計算されます。 戻り値の型は、ビューの作成時に指定した戻り値の型とは異なる場合があります。
ビューを作成するときに、テーブルパラメーターでアスタリスク (*) を使用して任意の列を取得できます。 アスタリスク (*) を使用して列を示す場合は、列に特定のデータ型を指定するか、または値を使用できます。 例:
-- prerequisite for defining a view SQL: create tables(ignore if it already exists) CREATE TABLE school(name STRING, address STRING); CREATE TABLE student(name STRING, school STRING, age STRING, address STRING); -- define a view CREATE VIEW paramed_view1 (@a TABLE(key STRING, * ANY), @b TABLE(key STRING, * STRING)) AS SELECT a.* FROM @a JOIN @b ON a.key = b.key; -- example SELECT name, address FROM paramed_view1 ((SELECT school, name, age, address FROM student), school) WHERE age < 20;この例では、ビューは2つのテーブルパラメーターを使用します。 最初のtableパラメーターで指定されたテーブルでは、最初の列はSTRING型で、その後に任意のデータ型の任意の列が続きます。 2番目のテーブルパラメーターで指定されたテーブルでは、最初の列はSTRING型で、その後にSTRING型の任意の列が続きます。 以下の点に注意する必要があります。
可変長パーツは、tableパラメーターで指定されたテーブルの最後に配置する必要があります。 これは、アスタリスク (*) で示される列の後に他の列が続くことができないことを意味します。 したがって、tableパラメーターで指定されたテーブルには、可変長リストを1つだけ含めることができます。
可変長パーツは、tableパラメーターで指定されたテーブルの最後に配置する必要があります。 しかし、入力テーブルの列は、この順序で配置されなくてもよい。 この場合、列を再配置する必要があります。 サブクエリはパラメーター値として使用でき、括弧 () のペアで囲む必要があります。
tableパラメーターで指定されたテーブルの可変長部分には名前が指定されていません。 その結果、ビューを定義するときに、可変長パーツ内のデータを参照または計算することはできません。
可変長部分は計算できませんが、
SELECT *文を使用して、可変長部分のデータをテーブルから転送できます。tableパラメーターで指定されるテーブルの列は、ビューを定義するときに指定する固定長の列とは異なる場合があります。 列名が異なる場合、コンパイラは自動的にそれらの名前を変更します。 データ型が異なる場合、コンパイラは暗黙の変換を実行します。 暗黙的な変換が失敗すると、エラーが発生します。
パラメータ化されたビューを呼び出す
次のステートメントを実行して、定義したpv1ビューを呼び出すことができます。
-- prerequisite for calling a view SQL: create tables(ignore if it already exists)
CREATE TABLE src (key STRING, value BIGINT);
CREATE TABLE src2 (key STRING, value BIGINT);
CREATE TABLE src3 (key STRING, value BIGINT);
-- example
@a := SELECT * FROM src WHERE value > 0;
-- call view with table variable and scalar
@b := SELECT * FROM pv1(@a,'20170101');
@another_day := '20170102';
-- call view with table name and scalar variable
@c := SELECT * FROM pv1(src2, @another_day);
@d := SELECT * FROM @c UNION ALL SELECT * FROM @b;
WITH
t AS (SELECT * FROM src3)
SELECT * FROM @c
UNION ALL
SELECT * FROM @d
UNION ALL
SELECT * FROM pv1(t, @another_day);さまざまなパラメーターを使用して、pv1ビューを呼び出すことができます。
tableパラメーターの値には、物理テーブル、ビュー、またはテーブル変数の名前を指定できます。 テーブルパラメーターを共通テーブル式 (CTE) のテーブルエイリアスに設定することもできます。
共通パラメータの値は、変数または定数とすることができる。
使用上の注意
パラメーター化されたビューでは、スクリプトで使用できるのはDML文のみです。 出力
INSERTまたはCREATE TABLEを直接返すSELECTステートメントは使用できません。パラメータ化ビューには複数のSQL文を含めることができます。
-- view with parameters -- param @a -a table parameter -- param @b -a string parameter -- returns a table with schema (key string, value string) CREATE VIEW IF NOT EXISTS pv2(@a TABLE (k STRING, v BIGINT), @b STRING) AS BEGIN @srcp := SELECT * FROM srcp WHERE p = @b; @pv2 := SELECT srcp.key, srcp.value FROM @srcp JOIN @a ON srcp.key = a.k; END;説明BEGINとENDの間のコンテンツは、このビューのスクリプトです。@ pv2 :=...は、他のプログラミング言語のRETURN文に似ています。 @ pv2は、ビューと同じ名前を持つ暗黙のテーブル変数に値を割り当てるために使用されます。実際のビューパラメータと正式なビューパラメータの一致ルールは、一般的な弱型言語で指定されているものと同じです。 ビューパラメーターを暗黙的に変換できる場合は、定義されたパラメーターと一致します。 例えば、BIGINT型の値は、DOUBLE型のパラメータと一致することができる。 テーブル変数の場合、テーブルaのスキーマをテーブルbに挿入できる場合、テーブルaを使用して、テーブルbと同じスキーマを持つテーブルタイプのパラメーターを一致させることができます。
コードを読みやすくするために、戻り値の型を明示的に宣言できます。
CREATE VIEW IF NOT EXISTS pv3(@a TABLE (k STRING, v BIGINT), @b STRING) RETURNS @ret TABLE (x STRING COMMENT 'This is the x', y STRING COMMENT 'This is the y') COMMENT 'This is view pv3' AS BEGIN @srcp := SELECT * FROM srcp WHERE p=@b; @ret := SELECT srcp.key,srcp.value FROM @srcp JOIN @a ON srcp.key=a.k; END;説明RETURNS @ ret TABLE (x STRING, y STRING)は、次の情報を定義します。戻り値の型は
TABLE (x STRING, y STRING)で、呼び出し元に返される型を示します。 このパラメーターを使用して、テーブルスキーマをカスタマイズできます。応答パラメーターは
@ retです。 ビュースクリプトでは、パラメーターに値が割り当てられます。 このパラメーターは、レスポンスパラメーターの名前を定義します。
BEGIN/ENDを含まないビュー、または変数を返すビューは、簡略化されたパラメータ化ビューと見なすことができます。