Usando linguagem SQL para geração de relatórios - Parte 1
Usando linguagem SQL para geração de relatórios - Parte 2
Usando linguagem SQL para geração de relatórios - Parte 4
Usando linguagem SQL para geração de relatórios - Parte 5
Uso de linguagem SQL para criação de relatórios, desde recursos básicos até os mais avançados. Esta é terceira parte de uma série de artigos e trata do uso de funções criadas pelo usuário, as UDFs. Sendo assim, este artigo ensina recursos de SQL para leitores iniciantes e avançados, como a criação de funções customizadas.
Em que situação o tema é útil?
Criação de relatórios usando funções customizadas criadas pelo usuário.
Resumo DevMan
Este artigo trata da criação e uso de funções SQL criadas pelo usuário (UDF). São apresentados os dois principais tipos de UDF segundo o padrão ANSI-SQL, que são as funções escalares e as tabulares, que são suportadas pela maioria dos SGBDs. O artigo inclui exemplos simples de UDFs criadas em diferentes SGBDs. Ao final, são apresentados exemplos de estimativa de performance de execução de consultas usando UDFs escalares e tabulares.
Voltamos com mais um artigo desta série. Como já havia mencionado nos artigos anteriores, esta série se propõe a ajudar tanto o leitor iniciante quanto o leitor mais avançado a trabalhar com a linguagem SQL para geração de relatórios.
Nos dois artigos anteriores, vimos o uso de recursos básicos da linguagem SQL, como cláusulas e operadores especiais, e também o uso de visões e consultas aninhadas. Mais especificamente:
· Parte 1: apresenta recursos básicos da linguagem SQL, como principais cláusulas, funções e alguns operadores. Operadores são os elementos que você utiliza dentro de expressões para definir como você quer restringir os dados retornados por uma busca. De uma forma geral, os operadores são divididos em seis grupos: aritméticos, comparação, caractere, lógico, conjunto e outros.
· Parte 2: apresenta recursos da linguagem SQL para geração de objetos especiais para manipulação dos dados, como visões e consultas aninhadas. O leitor com alguma familiaridade com SQL já deve ter visto tais recursos, por isso acrescentou-se um estudo de performance para auxiliá-lo a explorar estas técnicas de forma otimizada.
Nesta terceira parte, iremos falar de funções definidas pelo usuário (conhecidas como UDFs, sigla do inglês User Defined Functions). Elas permitem que o programador crie funções de diferentes tipos que retornem à informação desejada e que possam ser usadas dentro de declarações SQL. Apenas para ilustrar, o programador pode, por exemplo, criar uma função que exiba os nomes dos dias da semana em português e usar esta função para preparar um relatório.
UDFs são recursos criados através de uma linguagem de “programação” que é uma extensão do SQL. Outros objetos que são criados da mesma forma são os procedimentos armazenados e gatilhos (ou, se preferir, stored procedures e triggers, respectivamente).
Por se tratar de uma extensão da linguagem SQL, cada fornecedor de sistemas gerenciadores de bancos de dados (SGBDs) cria a sua própria linguagem particular. Assim, temos vários “dialetos” em matéria de linguagem procedural: a Oracle inclui no seu produto o PL/SQL, o SQL Server da Microsoft traz o T/SQL e a IBM usa no DB2 o SQL/PL. Todas elas são parecidas em sua estrutura, mas é preciso cuidado na conversão dos códigos, porque as sintaxes acabam apresentando diferenças marcantes.
Havíamos mencionado nos artigos anteriores que a série foi criada a partir de uma palestra que apresentei aos meus colegas de trabalho sobre o uso do DB2. Portanto, neste texto usaremos o SQL/PL para criação da maioria das funções e para fins ilustrativos mostrarei apenas um exemplo de UDF sendo criada em outros SGBDs.
Tópicos discutidos neste artigo
Neste artigo apresentaremos os seguintes tópicos:
· tipos de UDFs;
· criação de UDFs escalares;
· como usar UDFs escalares;
· considerações sobre performance das UDFs escalares;
· criação de UDFs tabulares;
· como usar UDFs tabulares;
· considerações sobre performance das UDFs tabulares.
Base de dados e considerações
Para situarmos os recursos SQL que vamos estudar, é preciso ter uma base de dados como amostra. Usaremos nestes artigos uma base com dados fictícios de demanda de produtos farmacêuticos. A Figura 1 mostra o modelo desta base.
Figura 1. Modelo de dados da base de exemplo
Assumiremos neste artigo que o leitor já está familiarizado com conceitos básicos de programação, além de já dominar os conceitos da linguagem SQL apresentados nos artigos anteriores desta série.
Tipos de UDFs
As UDFs são bastante versáteis e existem diferentes tipos de funções para atender as mais variadas necessidades. Definimos o tipo de cada função conforme o resultado que esta função retorna ao ser executada.
O padrão SQL reconhece dois tipos principais, que são suportados pela maioria dos SGBDs relacionais:
· as funções escalares, que retornam um único valor de um tipo de dados qualquer (números, cadeia de caracteres, datas, etc);
· as funções tabulares, que retornam uma tabela, cuja estrutura (campos e tipos de dados) é definida dentro da própria função e que não tem um limite de registros a serem retornados.
Em geral, as UDFs podem ser criadas em SQL ou mesmo em uma linguagem externa ao SGBD, como C, C++, C#, JAVA, PHP, etc. Neste artigo, nos limitaremos a descrever as UDFs criadas via SQL. O leitor interessado em outras possibilidades deve pesquisar informações sobre a criação de UDFs externas suportadas pelo seu SGBD específico.
Criação de UDFs escalares
Como o próprio nome diz, as UDFs escalares retornam um único valor de um tipo de dados predefinido, ou um escalar, como se diz em matemática. Elas são muito úteis quando precisamos encapsular uma lógica de cálculo que é usada com frequência.
O uso de UDFs escalares oferece vantagens até mesmo para o caso de manutenção de aplicações. Por exemplo, se a lógica de cálculo precisa mudar por uma razão qualquer, o DBA altera apenas o corpo da própria função. E não precisa se preocupar com todas as consultas que invocam esta função.
Mas você pode estar se perguntando: “Se um procedimento armazenado também pode receber parâmetros de entrada e retornar um parâmetro de saída, qual é a vantagem da UDF escalar?”.
...