As views parametrizadas estendem as views padrão do MaxCompute ao aceitar tabelas e valores escalares como parâmetros. Diferentemente das views tradicionais, elas permitem passar condições de filtro, referências de tabela e outros argumentos no momento da chamada. Isso possibilita reutilizar lógica SQL complexa em diferentes conjuntos de dados sem duplicar código.
Quando usar views parametrizadas
|
Objetivo |
Abordagem recomendada |
|
Encapsular lógica SQL uma única vez e chamá-la com diferentes conjuntos de dados |
View parametrizada |
|
Aplicar a mesma lógica de junção ou filtro a várias tabelas de entrada |
View parametrizada |
|
Criar um atalho SQL simples e não parametrizado |
View tradicional |
Defina views parametrizadas obrigatoriamente usando SQL em Script Mode.
Sintaxe
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}
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
|
Sim |
Nome da view |
|
|
Sim |
Nome de um parâmetro da view |
|
|
Sim |
Tipo de dados de um parâmetro da view |
|
|
Não |
Nome da variável que armazena o valor de retorno |
|
|
Não |
Nome de uma coluna na tabela de retorno |
|
|
Não |
Tipo de dados de uma coluna na tabela de retorno |
|
|
Não |
Comentário para uma coluna na tabela de retorno |
|
|
Não |
Comentário para a view |
|
|
Sim (ou |
Cláusula |
|
|
Sim (ou |
Script com múltiplas instruções entre |
Definir e chamar uma view parametrizada
Parâmetros escalares
Parâmetros escalares aceitam um único valor, como uma constante STRING ou BIGINT.
O exemplo abaixo cria a view pv1, que junta a tabela srcp a um parâmetro de tabela @a por chaves correspondentes e filtra os resultados pelo parâmetro string @b. Em seguida, chama-se a view de três formas diferentes em uma única sessão SQL em Script Mode:
-- Create the prerequisite table (skip if it already exists)
CREATE TABLE srcp (key STRING, value BIGINT, p STRING);
-- Create a parameterized view
-- @a: a table parameter with schema (k STRING, v BIGINT)
-- @b: a string scalar parameter
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;
-- Create prerequisite tables for calling the view (skip if they already exist)
CREATE TABLE src (key STRING, value BIGINT);
CREATE TABLE src2 (key STRING, value BIGINT);
CREATE TABLE src3 (key STRING, value BIGINT);
-- Pass a table variable and a string constant
@a := SELECT * FROM src WHERE value > 0;
@b := SELECT * FROM pv1(@a, '20170101');
-- Pass a physical table name and a scalar variable
@another_day := '20170102';
@c := SELECT * FROM pv1(src2, @another_day);
-- Pass a CTE alias
@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);
O parâmetro de tabela aceita:
Nome de uma tabela física ou view (por exemplo,
src2)Variável de tabela (por exemplo,
@a)Subconsulta entre parênteses (por exemplo,
(SELECT * FROM src WHERE value > 0))Alias de CTE (por exemplo,
t)
Parâmetros escalares aceitam variáveis ou constantes.
Parâmetros de tabela
Parâmetros de tabela aceitam uma referência de tabela: tabela física, view, variável de tabela ou alias de common table expression (CTE). O esquema da tabela deve corresponder ao esquema declarado na definição do parâmetro.
Uso do tipo any
Defina o tipo de uma coluna como any quando a view parametrizada não precisar inspecionar ou calcular o valor dessa coluna. Um caso comum é repassar a coluna sem alterações com SELECT *. O tipo any não pode ser usado em operações que exigem um tipo de dados específico, como + ou AND.
CREATE TABLE students (name STRING, id BIGINT, age BIGINT);
CREATE VIEW paramed_view (@a TABLE (name STRING, id ANY, age BIGINT))
AS SELECT * FROM @a WHERE name = 'foo' AND age < 25;
-- Call the view
SELECT * FROM paramed_view ((SELECT name, id, age FROM students));
Execute DESC <view_name> para inspecionar o tipo de retorno de uma view. Esse tipo é recalculado a cada chamada, portanto pode diferir do tipo especificado na criação. Por exemplo, any no momento da definição pode resolver para um tipo concreto no momento da chamada.
**Uso de curinga (*) em parâmetro de tabela**
Use * em um parâmetro de tabela para aceitar colunas adicionais além das fixas. A seção do curinga é chamada de parte de comprimento variável.
CREATE TABLE school (name STRING, address STRING);
CREATE TABLE student (name STRING, school STRING, age STRING, address STRING);
-- @a: first column is STRING, followed by any columns of any type
-- @b: first column is STRING, followed by any columns of STRING type
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;
-- Call the view
SELECT name, address FROM paramed_view1 (
(SELECT school, name, age, address FROM student),
school
) WHERE age < 20;
A parte de comprimento variável possui as seguintes restrições:
Deve aparecer no final do esquema da tabela. Nenhuma coluna fixa pode vir após o
*.Cada parâmetro de tabela pode ter apenas uma parte de comprimento variável.
Essa parte não tem nome, portanto não é possível referenciar ou calcular suas colunas diretamente. Use
SELECT *para repassar os dados.Se os nomes das colunas diferirem entre a tabela de entrada e a definição do parâmetro, o compilador os renomeia automaticamente. Caso os tipos de dados sejam diferentes, o compilador converte-os implicitamente. Se a conversão falhar, o sistema retornará um erro.
Views com múltiplas instruções
Uma view parametrizada pode conter várias instruções SQL em um bloco BEGIN...END. A última atribuição à variável de tabela implícita — aquela com o mesmo nome da view — funciona como valor de retorno.
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;
@pv2 := ... é a atribuição de retorno. Equivale a uma instrução RETURN, pois atribui o resultado a uma variável de tabela implícita com o mesmo nome da view.
Declarar um tipo de retorno explícito
Declare a cláusula RETURNS para documentar o esquema de saída e facilitar o uso da view.
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) define dois elementos:
Esquema de retorno —
TABLE (x STRING, y STRING)é o tipo retornado ao chamador. Utilize-o para impor um esquema de saída consistente.Variável de retorno —
@reté a variável nomeada atribuída no script da view. Atribuir valores a@retfunciona como instrução de retorno desta view.
Uma view sem bloco BEGIN...END e sem cláusula RETURNS explícita é considerada uma view parametrizada simplificada.
Observações de uso
Apenas instruções DML são permitidas no script da view. O sistema não suporta instruções
SELECTque retornam saída diretamente,INSERTnemCREATE TABLE.A correspondência de parâmetros segue regras de linguagem fracamente tipada: se um parâmetro real puder ser convertido implicitamente para o tipo declarado, a correspondência ocorre. Por exemplo, BIGINT corresponde a um parâmetro DOUBLE. Para parâmetros de tabela, a correspondência acontece quando o esquema da tabela de entrada pode ser inserido no esquema declarado.
Defina o corpo da view usando uma cláusula
SELECT(forma simplificada) ou um bloco de scriptBEGIN...END(forma com múltiplas instruções).