Fitur tampilan berparameter memungkinkan Anda mengimpor tabel atau variabel untuk menyesuaikan tampilan. Topik ini menjelaskan fitur tampilan berparameter yang didukung oleh mesin SQL MaxCompute.
Informasi latar belakang
Pada tampilan tradisional MaxCompute, skrip SQL yang kompleks dienkapsulasi di lapisan bawah. Anda dapat memanggil tampilan seperti membaca tabel standar tanpa perlu memahami mekanisme implementasi di lapisan bawah. Tampilan tradisional banyak digunakan karena mereka mengimplementasikan enkapsulasi dan penggunaan ulang kode. Namun, tampilan tradisional tidak mendukung parameter. Misalnya, Anda tidak dapat memberikan kondisi filter untuk menyaring data dalam tabel bawah dari sebuah tampilan atau memberikan parameter lain ke tampilan. Hal ini membuat efisiensi penggunaan ulang kode menjadi rendah. Mesin SQL MaxCompute mendukung tampilan berparameter dan memungkinkan Anda mengimpor tabel atau variabel untuk menyesuaikan tampilan.
Sintaksis
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: Wajib. Parameter ini menentukan nama tampilan.
variable_name: Wajib. Parameter ini menentukan nama variabel tampilan.
variable_type: Wajib. Parameter ini menentukan tipe variabel tampilan.
return_variable: Opsional. Parameter ini menentukan nama variabel yang dikembalikan oleh tampilan.
col_name: Opsional. Parameter ini menentukan nama kolom yang dikembalikan oleh tampilan.
col_type: Opsional. Parameter ini menentukan tipe kolom yang dikembalikan oleh tampilan.
col_comment: Opsional. Parameter ini menentukan komentar kolom yang dikembalikan oleh tampilan.
view_comment: Opsional. Parameter ini menentukan komentar tampilan.
select_statement: Klausa
SELECT. Anda harus menentukan klausa ini atau klausa statements.statements: Skrip tampilan. Anda harus menentukan klausa ini atau klausa select_statement.
Mendefinisikan tampilan berparameter
Untuk membuat tampilan berparameter, gunakan sintaksis berikut:
-- prasyarat untuk mendefinisikan SQL tampilan: buat tabel (abaikan jika sudah ada)
CREATE TABLE srcp (key STRING, value BIGINT, p STRING);
-- tampilan dengan parameter
-- param @a - parameter tabel
-- param @b - parameter string
-- mengembalikan tabel dengan skema (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;Deskripsi:
Parameter telah didefinisikan. Oleh karena itu, Anda harus menggunakan Mode Skrip SQL untuk mendefinisikan tampilan berparameter.
Tampilan pv1 yang dibuat memiliki dua parameter, tabel dan string. Anda dapat mengatur parameter tabel ke nama tabel dan parameter string ke tipe data dasar.
Anda juga dapat menggunakan subquery, seperti
SELECT * FROM view_name( (SELECT 1 FROM src WHERE a > 0), 1);, sebagai nilai parameter.Saat membuat tampilan, Anda dapat mengatur parameter ke any, yang menunjukkan tipe data apa pun. Contohnya, gunakan
CREATE VIEW paramed_view (@a any) AS SELECT * FROM src WHERE case WHEN @a is null then key1 else key2 end = key3;untuk mendefinisikan tampilan. Dalam contoh ini, parameter pertama tampilan bisa berupa nilai dari tipe data apa pun.Namun, nilai any tidak dapat digunakan dalam operasi, seperti
+atauAND, yang memerlukan tipe data tertentu. Kolom bertipe any sering digunakan sebagai kolom PassThrough dalam tabel yang ditentukan oleh parameter tabel. Contoh:-- prasyarat untuk mendefinisikan SQL tampilan: buat tabel (abaikan jika sudah ada) CREATE TABLE students (name STRING, id BIGINT, age BIGINT); -- definisikan tampilan CREATE VIEW paramed_view (@a TABLE (name STRING, id ANY, age BIGINT)) AS SELECT * FROM @a WHERE name = 'foo' AND age< 25; -- contoh SELECT * FROM paramed_view ((SELECT name, id, age FROM students));nullSetelah Anda mengeksekusi pernyataan
CREATE VIEWuntuk membuat tampilan, Anda dapat mengeksekusi pernyataanDESCuntuk mendapatkan deskripsi tampilan. Deskripsi tersebut berisi tipe pengembalian tampilan.Tipe pengembalian tampilan dihitung ulang saat tampilan dipanggil. Tipe pengembalian mungkin berbeda dari tipe pengembalian, seperti any, yang Anda tentukan saat membuat tampilan.
Saat membuat tampilan, Anda dapat menggunakan asterisk (*) dalam parameter tabel untuk mengambil kolom apa pun. Jika asterisk (*) digunakan untuk menunjukkan kolom apa pun, Anda dapat menentukan tipe data tertentu untuk kolom tersebut atau menggunakan nilai any. Contoh:
-- prasyarat untuk mendefinisikan SQL tampilan: buat tabel (abaikan jika sudah ada) CREATE TABLE school(name STRING, address STRING); CREATE TABLE student(name STRING, school STRING, age STRING, address STRING); -- definisikan tampilan 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; -- contoh SELECT name, address FROM paramed_view1 ((SELECT school, name, age, address FROM student), school) WHERE age < 20;Dalam contoh ini, tampilan menggunakan dua parameter tabel. Pada tabel yang ditentukan oleh parameter tabel pertama, kolom pertama bertipe STRING dan dapat diikuti oleh kolom apa pun dari tipe data apa pun. Pada tabel yang ditentukan oleh parameter tabel kedua, kolom pertama bertipe STRING dan dapat diikuti oleh kolom apa pun dari tipe STRING. Perhatikan poin-poin berikut:
Bagian panjang bervariasi harus ditempatkan di akhir tabel yang ditentukan oleh parameter tabel. Ini berarti kolom yang ditunjukkan oleh asterisk (*) tidak dapat diikuti oleh kolom lain. Oleh karena itu, tabel yang ditentukan oleh parameter tabel hanya dapat berisi satu daftar panjang bervariasi.
Bagian panjang bervariasi harus ditempatkan di akhir tabel yang ditentukan oleh parameter tabel. Namun, kolom tabel input mungkin tidak disusun dalam urutan ini. Dalam hal ini, kolom perlu diatur ulang. Subquery dapat digunakan sebagai nilai parameter dan harus diapit oleh sepasang tanda kurung ().
Tidak ada nama yang ditentukan untuk bagian panjang bervariasi dari tabel yang ditentukan oleh parameter tabel. Akibatnya, data dalam bagian panjang bervariasi tidak dapat dirujuk atau dihitung saat Anda mendefinisikan tampilan.
Meskipun Anda tidak dapat menghitung bagian panjang bervariasi, Anda dapat menggunakan pernyataan
SELECT *untuk mentransfer data dalam bagian panjang bervariasi keluar dari tabel.Kolom tabel yang ditentukan oleh parameter tabel mungkin berbeda dari kolom panjang tetap yang Anda tentukan saat mendefinisikan tampilan. Jika nama kolom berbeda, kompiler secara otomatis mengganti namanya. Jika tipe data berbeda, kompiler melakukan konversi implisit. Jika konversi implisit gagal, terjadi kesalahan.
Memanggil tampilan berparameter
Anda dapat mengeksekusi pernyataan berikut untuk memanggil tampilan pv1 yang Anda definisikan:
-- prasyarat untuk memanggil SQL tampilan: buat tabel (abaikan jika sudah ada)
CREATE TABLE src (key STRING, value BIGINT);
CREATE TABLE src2 (key STRING, value BIGINT);
CREATE TABLE src3 (key STRING, value BIGINT);
-- contoh
@a := SELECT * FROM src WHERE value > 0;
-- panggil tampilan dengan variabel tabel dan skalar
@b := SELECT * FROM pv1(@a,'20170101');
@another_day := '20170102';
-- panggil tampilan dengan nama tabel dan variabel skalar
@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);Anda dapat menggunakan parameter berbeda untuk memanggil tampilan pv1.
Nilai parameter tabel dapat berupa nama tabel fisik, tampilan, atau variabel tabel. Anda juga dapat mengatur parameter tabel ke alias tabel dalam ekspresi tabel umum (CTE).
Nilai parameter umum dapat berupa variabel atau konstanta.
Catatan penggunaan
Dalam tampilan berparameter, hanya pernyataan DML yang dapat digunakan dalam skrip. Pernyataan SELECT yang langsung mengembalikan output,
INSERT, atauCREATE TABLEtidak dapat digunakan.Tampilan berparameter dapat berisi beberapa pernyataan SQL.
-- tampilan dengan parameter -- param @a - parameter tabel -- param @b - parameter string -- mengembalikan tabel dengan skema (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;nullKonten antara
BEGINdan END adalah skrip tampilan ini.@pv2 :=...mirip dengan pernyataanRETURNdalam bahasa pemrograman lain. @pv2 digunakan untuk memberikan nilai pada variabel tabel implisit yang memiliki nama sama dengan tampilan.Aturan pencocokan untuk parameter tampilan aktual dan formal sama dengan yang ditentukan dalam bahasa lemah-tipe umum. Jika parameter tampilan dapat dikonversi secara implisit, ia dapat cocok dengan parameter yang didefinisikan. Misalnya, nilai tipe BIGINT dapat cocok dengan parameter tipe DOUBLE. Untuk variabel tabel, jika skema Tabel a dapat dimasukkan ke Tabel b, Tabel a dapat digunakan untuk mencocokkan parameter bertipe tabel yang memiliki skema sama dengan Tabel b.
Anda dapat secara eksplisit mendeklarasikan tipe pengembalian untuk membuat kode lebih mudah dibaca.
CREATE VIEW IF NOT EXISTS pv3(@a TABLE (k STRING, v BIGINT), @b STRING) RETURNS @ret TABLE (x STRING COMMENT 'Ini adalah x', y STRING COMMENT 'Ini adalah y') COMMENT 'Ini adalah tampilan 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;nullRETURNS @ret TABLE (x STRING, y STRING)mendefinisikan informasi berikut:Tipe pengembalian adalah
TABLE (x STRING, y STRING), yang menunjukkan tipe yang dikembalikan ke pemanggil. Anda dapat menggunakan parameter ini untuk menyesuaikan skema tabel.Parameter respons adalah
@ret. Dalam skrip tampilan, parameter ini diberi nilai. Parameter ini mendefinisikan nama parameter respons.
Anda dapat menganggap tampilan yang tidak berisi
BEGIN/ENDatau variabel pengembalian sebagai tampilan berparameter sederhana.