SQL Avançado

Propaganda
SQL Avanç
Avançado
Apresentaç
Apresentação
SQL Avanç
Avançado
Leandro Tonietto
[email protected]
www.inf.unisinos.br/~ltonietto
jan-07
SQL Avanç
Avançado
Agenda para 09/12
Introdução Transact-SQL
Elementos de sintaxe
Implementando Views
Conceitos
Criação e modificação
Otimização
SQL Avanç
Avançado
Tipos de linguagem para BD
DDL - Data Definition Language
Definição do BD: criação, alteração e remoção
de campos e tabelas, regras, índices, ...
DML - Data Manipulation Language
Manipulação de dados: consulta, inclusão,
alteração e exclusão
Transaction-SQL
Programação de funções auxiliares
Sobre o instrutor:
Professor no curso de Jogos e Entretenimento
Digital da Unisinos e do Instituto de Informática
da Unisinos
Gerente de Projetos da empresa Qualità
Informática
[email protected]
Expectativa quando ao aproveitamento do
curso
SQL Avanç
Avançado
TransactionTransaction-SQL
O Transact-SQL é uma linguagem de
definição, manipulação e controle de dados.
Padronização SQL-92
ISO e ANSI
Elementos de linguagem de programação
Diretivas, comentários, identificadores, controle
de fluxo, loops, funções, expressões, ...
SQL Avanç
Avançado
Elementos de Linguagem
Diretivas de lotes
Comentários
Identificadores
Tipos de dados
Variáveis
Funções do sistema
Operadores
Expressões
Controle de fluxo
Palavras reservadas
1
SQL Avanç
Avançado
SQL Avanç
Avançado
Diretiva de lotes
Diretiva de lotes
Lote:
GO:
Conjunto de instruções de programação
SQL Server processa um lote de instruções por
vez.
Diretivas de lote:
são instruções para envio dos lotes para
execução do SGBD
Duas instruções: GO e EXEC
SQL Avanç
Avançado
SQL Avanç
Avançado
Diretiva de lotes
Diretiva de lotes
GO:
EXEC:
“Exemplo”:
/* bloco de comandos 1 */
DECLARE @EmpID varchar(11)
GO
/* bloco de comandos 2 */
SET @EmpID = ‘Teste’
Executa comandos do usuário
O escopo da variá
variável
é lote. O lote é
conjunto instruç
instruções
separadas por GO’
GO’s
Serão executados
apenas os lotes
apó
após o comando GO
O que aconteceria se estes blocos de comandos fossem executados?
SQL Avanç
Avançado
Comentá
Comentários
São códigos não executáveis de um lote de
comandos
Geralmente utilizados para:
indicar alguma ponto importante de um código
colocar explicações curtas sobre uma função ou lote
Suprimir execução de linhas de código sem removê-las
Comentário de linha: -Comentário de bloco: /* ... */
Envia lote atual de instruções para execução
O lote atual é composto de todas as instruções
inseridas desde o último comando GO ou desde o início
da sessão ad hoc (ou script, se esse for o primeiro GO).
Os usuários devem seguir as regras referentes a lotes.
Por exemplo, algumas instruções de DDL devem ser
executadas isoladamente de outras instruções
Transact-SQL, separando-as com um comando GO.
Escopo das variáveis é definido dentro de um lote
Comandos TransacSQL
Funções
Lotes
Comandos são passados por parâmetro e o
método retorna o status da execução: sucesso
ou erro.
SQL Avanç
Avançado
Comentá
Comentários
Exemplo 1:
USE northwind
SELECT productname
, (unitsinstock-unitsonorder) -- Calcula inventário
-- , supplierid
-- indica ao interpretador de
FROM products
comando que ignore o estiver à sua
GO
direita, até
até o fim da linha
Suprimindo um linha
2
SQL Avanç
Avançado
Comentá
Comentários
Exemplo 2:
/*
Este código recupera todas as linhas da tabela
products e exibe o preço unitário, o preço unitário
aumentado em 10% e o nome do produto.
*/
USE northwind
SELECT unitprice, (unitprice * 1.1), productname
FROM products
GO
Normalmente os comentá
comentários de blocos são usados para
comentar blocos de linhas de có
código e colocar explicaç
explicações
sobre o que é executado no lote
SQL Avanç
Avançado
Identificadores
Exemplo:
DECLARE @v1 int
SQL Avanç
Avançado
Identificadores
São nomes ou identificação única para variáveis e funções
Os identificadores padrão podem conter de 1 a 128 caracteres,
inclusive letras, símbolos (_, @ ou #) e números.
Não são permitidos espaços.
Regras:
O primeiro caractere deve ser um caractere alfabético, de a-z ou A-Z.
Os identificadores podem incluir letras, números ou os símbolos @, $, #
ou _ .
Os nomes de identificadores que começam com um símbolo têm
utilizações especiais:
Um identificador que inicie com o símbolo @ indica um parâmetro ou variável
local.
Um identificador que inicie com um sinal de tralha (#) indica um procedimento
ou uma tabela temporária.
Um identificador que inicie com um sinal de tralha duplo (##) indica um objeto
temporário global.
Os nomes de objetos temporários não devem ter mais de 116 caracteres,
incluindo os sinais # ou ##, porque o SQL Server atribui um sufixo
numérico interno aos objetos temporários.
SQL Avanç
Avançado
Identificadores delimitados
Os identificadores delimitados podem ser
usados nas seguintes situações:
Quando os nomes contiverem espaços
incorporados
Quando forem utilizadas palavras reservadas
como nomes de objetos ou partes de nomes de
objetos
Os identificadores delimitados devem ser
colocados entre parênteses ou aspas
duplas.
SQL Avanç
Avançado
Convenç
Convenção de Nomes de Identificadores
Mantém um padrão de escrita
Facilita manutenção de código
Diretrizes:
Quando possível, empregue nomes significativos.
Use convenções de nomeação simples e fáceis.
Use um identificador que diferencie tipos de objeto,
principalmente para views e procedimentos
armazenados.
Mantenha a exclusividade dos nomes de objetos e
usuários. Por exemplo, evite criar uma tabela sales
(vendas) e um cargo sales dentro do mesmo banco de
dados.
SQL Avanç
Avançado
Tipos de dados
Os tipos de dados são atributos que
especificam o tipo de informação que pode
ser armazenado em uma coluna, parâmetro
ou variável
Delimita o domínio dos valores possíveis
para uma variável, parâmetro ou coluna
3
SQL Avanç
Avançado
Tipos de dados
Numéricos:
Para representação de números
Inteiros: int, tinyint, smallint e bigint
Decimais: numeric, decimal, money e
smallmoney
Ponto flutuante: float e real
SQL Avanç
Avançado
Tipos de dados
Characters
Este tipo de dados é usado para representar
seqüências ou dados de caractere e inclui tipos de
dados de seqüência de tamanho fixo, como char e
nchar, e de tamanho variável, como varchar e
nvarchar.
Binários
Este tipo de dados é muito semelhante aos tipos de
dados de caractere em termos de armazenamento e
estrutura, porém o conteúdo dos dados é tratado como
uma série de valores de bytes. Os tipos de dados
binários incluem binary e varbinary. O tipo de
dados bit indica um valor de bit único igual a zero ou
um.
SQL Avanç
Avançado
Tipos de dados
Image e Text
Estes tipos de dados são estruturas objeto binário extenso (BLOB)
que representam tipos de dados de tamanho fixo e variável para o
armazenamento de dados binários e de caractere Unicode e nãoUnicode grandes, como image, text e ntext.
Tables
Este tipo de dados pode ser usado apenas para definir variáveis
locais de tipo de tabela ou o valor de retorno de uma função
definida pelo usuário.
Cursors
Este tipo de dados é usado para programação em procedimentos
armazenados e com interfaces de cliente de baixo nível. Ele nunca
é usado como parte de uma instrução de DDL.
SQL Avanç
Avançado
Tipos de dados
Numéricos:
Para representação de números
Inteiros: int, tinyint, smallint e bigint
Decimais: numeric, decimal, money e smallmoney
Ponto flutuante: float e real
Datas:
Representa datas ou períodos de tempo. Os dois tipos
de dados de data são datetime, cuja precisão é de
3,33 milissegundos, e smalldatetime, cuja
precisão é de intervalos de 1 minuto.
SQL Avanç
Avançado
Tipos de dados
Unique Identifiers
Este tipo especial de dados é um
uniqueidentifier que representa um
identificador global exclusivo, o qual é um valor
hexadecimal de 16 bytes que deve ser sempre
exclusivo.
SQL Variantes
Este tipo de dados pode representar valores de
vários tipos de dados para os quais há suporte
no SQL Server, com exceção de text, ntext,
image, timestamp e rowversion.
SQL Avanç
Avançado
Tipos de dados
Definidos pelo usuário
Este tipo de dados é criado pelo administrador
do banco de dados e se baseia nos tipos de
dados do sistema.
Use os tipos de dados definidos pelo usuário
quando várias tabelas devem armazenar o
mesmo tipo de dados em uma coluna, e você
deve garantir que as colunas tenham
exatamente o mesmo tipo de dados, tamanho e
nulidade.
4
SQL Avanç
Avançado
Variá
Variáveis
Variável é um recurso de linguagem de
programação para definição de identificadores
que representam e armazenam um determinado
valor na memória.
Vários locais: DECLARE
Atribuição de valor é feita através do comando
SET ou da execução de uma expressão como um
SELECT
Escopo é do lote. Isto significa que?
Nome da variável deve ser precedido por @
SQL Avanç
Avançado
Variá
Variáveis
Exemplo:
USE northwind
DECLARE @EmpID varchar(11)
,@vlName char(20)
SET @vlname = 'Dodsworth'
SELECT @EmpID = employeeid
FROM employees
WHERE LastName = @vlname
SELECT @EmpID AS EmployeeID
GO
SQL Avanç
Avançado
Funç
Funções do sistema
Tipos de funções:
Retornam um valor individual que opera a partir de nenhum ou de diversos valores
escalares individuais.
As funções escalares podem ser agrupadas nas seguintes categorias:
Configuração - Retorna informações sobre a configuração atual.
Cursor - Retorna informações sobre cursores.
Data e hora - Efetua uma operação sobre um valor inserido de data e hora e retorna um
valor de seqüência, numérico ou de data e hora.
Matemática - Efetua um cálculo com base em valores inseridos como parâmetros para a
função e retorna um valor numérico.
Metadados - Retorna informações sobre o banco de dados e os objetos do banco de
dados.
Segurança - Retorna informações sobre usuários e cargos. Seqüência de caracteres
Efetua uma operação sobre um valor inserido de seqüência (char ou varchar) e retorna
um valor de seqüência de caracteres ou numérico.
Sistema - Efetua operações e retorna informações sobre valores, objetos e configurações
no SQL Server.
Estatística do sistema Retorna informações estatísticas sobre o sistema.
Texto e imagem Efetua uma operação sobre um valor inserido de texto ou imagem ou
sobre uma coluna, e retorna informações sobre o valor.
SQL Avanç
Avançado
Variá
Variáveis
Sintaxe de uso geral:
DECLARE {@<nome> <tipo_de_dados>} [,...n]
SET @nome_da_variável_local = expressão
Exemplos:
DECLARE @nome varchar(70)
DECLARE @soma int
SET @soma 0
SQL Avanç
Avançado
Funç
Funções do sistema
O Transac-SQL permite a execução de funções
pré-definidas do sistema, como:
Sum, avg, sqrt, length, ...
Consultar guia de referência para identificar todas as
funções
Tipos de funções:
Agem sobre um conjunto de dados e retornam alguma
compilação dos mesmos
USE northwind
SELECT AVG(unitprice) AS AvgPrice
FROM products
GO
AVG calcula
média
SQL Avanç
Avançado
Funç
Funções do sistema
Exemplo:
USE northwind
SELECT DB_NAME() AS 'database'
GO
5
SQL Avanç
Avançado
SQL Avanç
Avançado
Funç
Funções do sistema
Tipos de funções:
Podem ser usadas como referências de tabela
em uma instrução Transact-SQL
Exemplo:
SELECT *
FROM OPENQUERY(OracleSvr, 'SELECT name,
id FROM owner.titles')
GO
Está
Está funç
função funcionará
funcionará sempre?
Funç
Funções do sistema
Função de conversão de data:
SELECT 'ANSI:', CONVERT (varchar(30),
GETDATE(), 102) AS Style
UNION
SELECT 'Japanese:', CONVERT(varchar(30),
GETDATE(), 111)
UNION
SELECT 'European:', CONVERT(varchar(30),
GETDATE(), 113)
Repare que a instruç
instrução SELECT
GO
retorna dados que concatenados
UNION agrupa conjunto de dados
SQL Avanç
Avançado
Funç
Funções do sistema
Resultado:
Style
ANSI: 1998.11.20
Japanese: 11/20/98
European: 20 Nov 1998 16:44:12:857
SQL Avanç
Avançado
Funç
Funções do sistema
Exemplo do uso da função DATEFORMAT:
SET DATEFORMAT dmy
GO
DECLARE @vdate datetime
SET @vdate = '11/29/98'
SELECT @vdate
GO
DATEFORMAT define o formato de
data padrão atual
Repare que a data é impressa (dmy
(dmy))
de forma diferente do padrão ANSI
SQL Avanç
Avançado
Funç
Funções do sistema
Exemplo de função que interage com dados
do SGDB:
USE library
SELECT user_name(), app_name()
GO
SQL Avanç
Avançado
Funç
Funções do sistema
Exemplo de função que obtém dados sobre
o BD:
USE library
SELECT
COLUMNPROPERTY(OBJECT_ID('member'),
'firstname', 'AllowsNull')
GO
6
SQL Avanç
Avançado
Operadores
Operadores são símbolos que efetuam cálculos
matemáticos, concatenações de seqüências de
caracteres e comparações entre colunas,
constantes e variáveis.
É possível combinar e utilizar os operadores em
condições de pesquisa.
A ordem em que os operadores serão
processados baseia-se em uma precedência
predefinida.
Quatro tipos de operadores: aritméticos, de
comparação, de concatenação de seqüências de
caracteres e lógicos
SQL Avanç
Avançado
Operadores
Precedência:
Agrupamento primário: ( )
Aritmético Multiplicativo: *, / e %
Aritmético Aditivo: – e +
Concatenação de seqüências de caracteres: +
Lógico NOT: NOT
Lógico AND: AND
Lógico OR: OR
SQL Avanç
Avançado
Expressões
Exemplo:
USE northwind
SELECT OrderID, ProductID
,(UnitPrice * Quantity) as ExtendedAmount
FROM [Order Details]
WHERE (UnitPrice * Quantity) > 10000
GO
SQL Avanç
Avançado
Operadores
Aritméticos:
Aditivos: + e –
Multiplicativos: *, / e %
Comparação:
Retornam verdadeiro ou falso
=, <, >, <=, >= e <>
Concatenação:
Somente com dados String: +
Lógicos
Utilizados para conectar o resultado de mais de uma expressão
OR, AND e NOT
Usados na cláusula WHERE
SQL Avanç
Avançado
Expressões
Combinação de campos e variáveis com
operadores e funções para retornar um
resultado
Tipo de retorno depende dos elementos da
expressão
SQL Avanç
Avançado
Elementos de Controle de Fluxo
elementos de linguagem que controlam o
fluxo da lógica em uma instrução
a função CASE que permite usar uma lógica
condicional em um único registro de cada
vez, em uma instrução SELECT ou
UPDATE
7
SQL Avanç
Avançado
Elementos de Controle de Fluxo
Exemplo – nível de instrução:
USE northwind
IF EXISTS (SELECT * FROM orders WHERE customerid =
'frank')
PRINT '*** Cliente não pode ser excluído ***'
ELSE
BEGIN
DELETE customers WHERE customerid = 'frank'
PRINT '*** Cliente foi excluído ***'
END
GO
SQL Avanç
Avançado
Views
Definição:
São tabelas que representam uma visão de um
conjunto de dados de uma ou mais tabelas.
Não armazenam nenhum dado, apenas
fornecem a visualização para estes de forma
diferente.
VIEW == SELECT
SQL Avanç
Avançado
Views
Vantagens:
Visualização focalizada
Tirar a complexidade da visualização dos
dados, como por exemplo, uniões de tabelas
restrições sobre os conjuntos
Organização de dados para exportação
Permissão de acesso com restrições
Desempenho, pois o resultado fica
“armezanado”
SQL Avanç
Avançado
Elementos de Controle de Fluxo
Exemplo – nível de registro:
DECLARE @n tinyint
SET @n = 5
IF (@n BETWEEN 4 and 6)
BEGIN
WHILE (@n > 0)
BEGIN
SELECT @n AS 'Número',
CASE
WHEN (@n % 2) = 1
THEN 'ÍMPAR'
ELSE 'PAR'
END AS 'Tipo‘
SET @n = @n - 1
END
END
ELSE
PRINT 'SEM ANÁLISE'
GO
SQL Avanç
Avançado
Views
Exemplos:
Um subconjunto de registros ou colunas de uma tabela
base: subconjunto das pessoas de uma tabela de
pessoas com idade > 30 anos.
Uma união, intersecção ou associação de duas ou mais
tabelas base: Pessoas com idade > 30 e que são do
sexo masculino
Um resumo estatístico de uma tabela base: tabela que
mostra os pedidos com uma coluna totalizando o valor
dos seus itens.
Um subconjunto de outra view ou alguma combinação
de views e tabelas base.
SQL Avanç
Avançado
Views
Sintaxe:
CREATE VIEW propr.nome_da_view [(coluna [,n ])]
[WITH {ENCRYPTION | SCHEMABINDING | VIEW_METADATA}
[,n ]]
AS
instrução_select
[WITH CHECK OPTION]
8
SQL Avanç
Avançado
Views
View no Transact:
USE Northwind
GO
CREATE VIEW dbo.EmployeeView AS
SELECT LastName, Firstname
FROM Employees
SQL Avanç
Avançado
Views
Padronização:
Segue a mesma verificação dos identificadores
Nomes devem ser únicos
É fortemente recomendado fazer distinção
entre padrão de nomes de tabelas e de views:
Tabela: Pessoas
View: View_Pessoas_Masculino
GO
SELECT * from EmployeeView
GO
SQL Avanç
Avançado
Views
Só podem criar views usuários com
permissão de administradores do BD
Definir usuário dba com proprietário de todas
as tabelas
Qualquer usuário com permissões mínimas
no sistema, por padrão, consegue visualizar
os dados de uma view.
SQL Avanç
Avançado
Views
Exemplo 2:
USE Northwind
GO
CREATE VIEW dbo.OrderSubtotalsView (OrderID,
Subtotal)
AS
SELECT OD.OrderID,
SUM(CONVERT
(money,(OD.UnitPrice*Quantity*(1Discount)/100))*100)
FROM [Order Details] OD
GROUP BY OD.OrderID
GO
SQL Avanç
Avançado
Views
Restrições:
A instrução CREATE VIEW não pode incluir as
cláusulas COMPUTE ou COMPUTE BY.
A instrução CREATE VIEW não pode incluir a palavrachave INTO.
A instrução CREATE VIEW só poderá incluir a cláusula
ORDER BY se a palavra-chave TOP for usada.
As views não podem fazer referência a tabelas
temporárias.
As views não podem fazer referência a mais de 1.024
colunas.
A instrução CREATE VIEW não pode ser combinada
com outras instruções Transact-SQL em um único lote.
SQL Avanç
Avançado
Views
Views para fornecer um modo conveniente de examinar informações
de duas ou mais tabelas associadas em um local central:
Neste exemplo, ShipStatusView associa as tabelas Customers
(Clientes) e Orders (Pedidos).
USE Northwind
GO
CREATE VIEW dbo.ShipStatusView
AS
SELECT OrderID, ShippedDate, ContactName
FROM Customers c INNER JOIN Orders o
ON c.CustomerID = O.CustomerID
WHERE RequiredDate < ShippedDate
SELECT * FROM ShipStatusView
OrderID ShippedDate ContactName
GO
SELECT * FROM OrderSubtotalsView
GO
9
SQL Avanç
Avançado
Views
SQL Avanç
Avançado
Views
Encriptação:
Usar a opção WITH ENCRYPTION na criação
da view
Criptografa as entradas da tabela
syscomments, critografando a definição da view
Para descriptografar somente removendo e
criando novamente a view.
Pode ser interessante guardar uma cópia do script
de criação da view em algum lugar (arquivo) seguro
SQL Avanç
Avançado
Views
Exercício:
Crie a tabela Pessoas no transact-SQL, com os
campos nome, idade e sexo
Insira cinco registros nesta tabela; sendo 3
homens e duas mulheres. Três destas pessoas
tem idade maior que 30.
Crie uma view para representar as mulheres
com idade maior que trinta.
Altere os dados e apenas faça mais um
comando de seleção simples na view.
SQL Avanç
Avançado
Views
Atenção:
Se você definir uma view com uma instrução
SELECT * e, depois, alterar a estrutura das
tabelas subjacentes adicionando colunas, as
novas colunas não aparecerão na view.
Quando todas as colunas são selecionadas em
uma instrução CREATE VIEW, a lista de
colunas é interpretada apenas quando você
cria a view pela primeira vez. Para ver as novas
colunas na view, você deve alterá-la.
Exercício:
Criar a view: página ?? Sem a opção de
encriptação
Ver os dados da tabela syscomments
Apagar a view e criar de novo com a opção de
encriptação
Ver novamente os dados da tabela
syscomments
SQL Avanç
Avançado
Views
Alterando de definição da view
Exemplo:
USE Northwind
GO
ALTER VIEW dbo.EmployeeView
AS
SELECT LastName, FirstName, Extension
FROM Employees
SQL Avanç
Avançado
Views
Apagando uma view
DROP VIEW <nome da view>
Apague a view definida no exercício anterior
10
SQL Avanç
Avançado
Views
SQL Avanç
Avançado
Views
Atualização dos dados através das views é
possível considerando as seguintes
restrições:
Que seja proveniente de uma única tabela e
que contenha todos os seu campos não nulos
Não possua funções de agregação
Poderão ocasionar erros se afetarem colunas
às quais a view não faz referência.
SQL Avanç
Avançado
Views
Otimização de desempenho
Armazenamento de dados de consultas
completas
Joins com views é mais rápido do que com várias
tabelas
Evitar aninhamento de views.
Podem esconder problemas com resultados
Exemplo das páginas 49-50
SQL Avanç
Avançado
Procedimentos Armazenados
Práticas recomendadas:
Nomes consistentes e com um padrão que os distinguem das
tabelas; facilitando a identificação das views
Dbo como proprietário: facilita utilização, já que, por ser o usuário
default, não é necessário colocar o nome do usuário proprietário da
view no momento de usá-la.
Verifique dependências dos objetos antes de excluí-los
sp_denpends
Se for necessário esconder a definição de uma view, não apague
esta definição da tabela syscomments; use a opção WITH
ENCRYPTION nos comandos CREATE VIEW ou ALTER VIEW.
Cuidado views aninhadas, tenha certeza de sua real necessidade;
elas podem esconder problemas com resultados.
SQL Avanç
Avançado
Procedimentos Armazenados
Tipos
Armazenados no BD do sistema.
Fornecem informações das tabelas do sistema
Por padrão, precedidos por “sp_”
São funções do sistema
Usados por qualquer BD
Procedimentos de armazenamento local
Stored procedures
Coleção nomeada de instruções TransactSQL
que é armazenada no servidor.
Suporte a recursos de programação
São funções ou procedimentos, logo
encapsulam execução repetida de código
(mesmo código executado em lugares diversos)
SQL Avanç
Avançado
Procedimentos Armazenados
Características
Instruções para executar operações sobre o BD
Permite passagem de parâmetros
Retorno de status da execução
Parâmetros de saída
Uso restrito
Procedimentos temporários locais (#) ou globais (##)
Locais ao usuário ou globais para todas as sessões
Procedimentos externos (construídos como DLL).
Armazenados fora do BD
Prefixo “xp_”
11
SQL Avanç
Avançado
Procedimentos Armazenados
Processamento
Criação
Primeira consulta, coloca o plano de consulta
respectivo no cache.
Cache alocado conforme necessidade
Cache de procedimentos
SQL Avanç
Avançado
Procedimentos Armazenados
Comando de criação: CREATE PROCEDURE
Cria o procedimento e armazena na BD
A criação pode referenciar tabelas, view, variáveis, ...
O que é criado dentro do procedimento não tem vida
externa ao mesmo
Primeiro testar o código e depois realizar o
armazenamento do mesmo
Uma instrução CREATE PROCEDURE não pode
combinada com outras instruções SQL em um único
lote (assim como a VIEW).
Deve ter permissões para CREATE PROCEDURE.
Tamanho máximo de um procedimento é de 128Mb.
SQL Avanç
Avançado
Procedimentos Armazenados
Exemplo 1:
USE Northwind
GO
CREATE PROC dbo.OverdueOrders
AS
SELECT * FROM dbo.Orders WHERE
RequiredDate < GETDATE() AND
ShippedDate IS NULL
GO
SQL Avanç
Avançado
Procedimentos Armazenados
Processo de criação:
Codificação
Verificação sintática.
Em caso erro não será criado nada.
Armazenamento da tabela de sistema
sysobjects e texto na syscomments
Armazenamento é feito dentro da BD atual
SQL Avanç
Avançado
Procedimentos Armazenados
Sintaxe CREATE PROCEDURE
CREATE PROC nome [;número]
[{@parâmetro tipo_dado}
[VARYING][=padrao][OUTPUT]][,...n]
[{RECOMPILE|ENCRYPTION|”ambos”}]
[FOR REPLICATION]
AS
Instrução_sql[...n]
SQL Avanç
Avançado
Procedimentos Armazenados
Diretrizes para criação:
Recomendo que o usuário dbo possua todos os objetos
do BD
Sempre especifique o dbo como proprietário dos
procedimentos, tabelas, views e etc. que você criar
Considere as permissões necessárias em todos os
objetos em que a procedure precisa referenciar.
O ideal é se logar no gerenciador do banco como
administrador, na hora de criar ou alterar objetos do sistema.
Idealmente, uma procedure realiza uma ação
Evitar uso de objetos temporários, por questões de
desempenho.
Prefira sp_executesql do que EXECUTE
12
SQL Avanç
Avançado
Procedimentos Armazenados
Executando um procedimento:
EXEC {[@status retorno=]
{nome_procedimento[;número]|@var_no
me_procedimento}
}
[[@parâmetro={valor|@variável[OUTPUT]
|[DEFAULT]][,...n]
[WITH RECOMPILE]
SQL Avanç
Avançado
Procedimentos Armazenados
Alteração
Altera código de uma procedure existente
Sintaxe é parecida com a CREATE
Ver página 70.
ALTER PROC vai alterar o conteúdo da PROC
dentro da tabela syscomments
Exemplo da página 71
SQL Avanç
Avançado
Procedimentos Armazenados
Usando parâmetros de entrada
Permitem passagem de valores externos para o
procedimento. Generaliza o procedimento.
Comando: CREATE PROC @param tipo
Considere:
Melhor verificar o que está se recebendo, por
exemplo, evitar processar um procedimento com
parâmetro nulo.
Com valor padrão, execução possibilita que não se
passe nenhum valor para um determinado parâmetro
Exemplo da página 76.
SQL Avanç
Avançado
Procedimentos Armazenados
Executando um procedimento:
EXEC OverdueOrders
Possível combinar EXEC dentro de um
INSERT
Inserir dados com o retorno da execução de
uma procedure
Exemplo da página 69.
SQL Avanç
Avançado
Procedimentos Armazenados
Remoção de procedures
Interessante executar comando sp_depends
antes de excluir um registro, para verificar as
dependências.
Sintaxe:
DROP PROCEDURE {nome_proc}
SQL Avanç
Avançado
Procedimentos Armazenados
Considerações sobre o exemplo:
Ordem da declaração difere da ordem de
passagem dos parâmetros
Parâmetros @Region e @Fax não são
especificados, porquê?
No segundo exemplo, página 77, os parâmetros
de passagem não indicam qual parâmetro eles
estão se referenciando, porque eles são
passados na ordem de declaração.
13
SQL Avanç
Avançado
Procedimentos Armazenados
Parâmetros de retorno
Servem para retornar dados processados na
procedure para quem a chamou.
Sintaxe:
CREATE PROC xyz @x1 int OUTPUT
EXEC xyz @idade OUTPUT
Exemplo da página 78.
SQL Avanç
Avançado
Procedimentos Armazenados
Tratamento de erros:
Tratamento de mensagens para informar
sucesso ou falha de um procedimento.
Mensagens tanto para programador, quando
para usuário.
Retorno satisfatório / esclarecedor para quem
invocou a função, de tal forma que este possa
tratar um erro.
Boa prática: verificar situações de erro (RN)
antes de executar uma rotina.
SQL Avanç
Avançado
Procedimentos Armazenados
Tratamento de erros:
USE Northwind
GO
CREATE PROCEDURE dbo.GetOrders
@CustomerID nchar (10)
AS
SELECT OrderID, CustomerID, EmployeeID
FROM [Order Qry]
WHERE CustomerID = @CustomerID
RETURN (@@ROWCOUNT)
GO
SQL Avanç
Avançado
Procedimentos Armazenados
Exercícios:
crie um procedimento que retorne o maior entre
dois números
outro para o menor
outro para retornar a média.
Teste os procedimentos criados...
Calcular fatorial de um número.
SQL Avanç
Avançado
Procedimentos Armazenados
Tratamento de erros:
Instrução RETURN:
Retorna para método anterior
Retorna um valor ou não
Também usada para retornar o status de execução:
normalmente 0 para êxito e valores negativos para
erros.
Valores
Valores
de -1 a -14 estão em uso no SQL Server
de -15 a -99 estão reservados
SQL Avanç
Avançado
Procedimentos Armazenados
Função sp_addmessage
Insere uma mensagem na tabela de
mensagens do BD (sysmessages)
Possibilitando assim, que o usuário que
executou a procedure, identifique o código do
erro que retornou de uma falha de execução da
procedure
14
SQL Avanç
Avançado
Procedimentos Armazenados
Função @@error
Retorna o número do erro que ocorreu na
última execução
Caso não tenha ocorrido erro, retorna zero
Faça o exemplo das página 85-87.
Crie uma mensagem personalizada para cada
caso de erro, adicione na tabela de mensagens
do sistema e mostre o erro gerado, se for o
caso, no lote que executou a procedure.
SQL Avanç
Avançado
Procedimentos Armazenados
Exercício
Fazer pesquisa fonética em uma tabela do BD.
Algoritmo Soundex como procedure.
Este algoritimo foi criado pelo governo Americano para recuperar nomes
para a administração da Seguridade Social nos arquivos Nacionais. O
algoritimo é simples e esta explicado a seguir.
Uma chave de busca é foneticamente igual à algum dado da tabela, se o
código SOUNDEX dela for igual ao código SOUNDEX de um registro do dado
da tabela.
O código soundex é obtido conforme as seguintes regras:
Se o código for maior que quatro caracteres os demais não serão
considerados. Se for menor serão acrescidos Zeros.
Você preserva o primeiro caractere da String e atribui valores conforme a
tabela abaixo até 3 caracteres.
As vogais A,E,I,O,U os caracteres Y,W e H e os demais caracteres não são
considerados.
Os caracteres numéricos são considerados apenas para a primeira casa , os
demais não considerados
Havendo caracteres repetidos somente o primeiro será considerado
SQL Avanç
Avançado
Procedimentos Armazenados
SQL Avanç
Avançado
Procedimentos Armazenados
Função RAISERROR
Gera um erro.
Utilizada quando da verificação da
possibilidade de um erro, lógico, de negócio ou
de sistema.
Pode ser utilizado para evitar o erro do SGBD e
tratar o erro personalizado
Exemplo das páginas 89-90
SQL Avanç
Avançado
Procedimentos Armazenados
Exercício
Código do caractere
Caractere
0
Para palavras curtas
1
B, P, F, V
2
C,S,G,J.K,Q,X,Z
3
D, T
4
L
5
M, N
6
R
Soundex da palavra BROWN
B=B
R=6
O=W=0
N=5
B650
SQL Avanç
Avançado
Funç
Funções do usuá
usuário
Recurso que permite a customização de
funções para o usuário.
Restrições
Devem retornar algum valor (escalar ou tabela)
Aceitam nenhum ou vários parâmetros de
entrada
Não aceitam parâmetros de saída
15
SQL Avanç
Avançado
Funç
Funções do usuá
usuário
Tipos:
Escalares
Funções simples, que processam alguma tarefa e
retornam um escalar.
Com valor de tabela e instruções
Semelhantes a procedimentos
Permitem o uso numa instrução FROM e SELECT
Com valor de tabela in-line
Assemelha-se ao uso de views, porém com suporte
à parâmetros
SQL Avanç
Avançado
Funç
Funções do usuá
usuário
Uso da função em SELECT:
SELECT LastName, City,
dbo.fn_NewRegion(Region) AS Region,
Country
FROM dbo.Employees
SQL Avanç
Avançado
Funç
Funções do usuá
usuário
Criação (CREATE FUNCTION):
Veja sintaxe na página 94 do manual.
GO
CREATE FUNCTION fn_NewRegion (
(@param1 NVARCHAR(30))
RETURNS NVARCHAR(30)
BEGIN
IF @param1 IS NULL
SET @param1 = ‘Não Aplicável’
RETURN @param1
END
SQL Avanç
Avançado
Funç
Funções do usuá
usuário
Alteração:
A alteração da função segue a mesma sintaxe
de estrutura da criação, com exceção da
palavra-chave do comando:
ALTER FUNCTION dbo.fn_NewRegion ...
Exclusão de funções:
Semelhante aos demais objetos:
DROP FUNCTION dbo.fn_NewRegion
SQL Avanç
Avançado
Funç
Funções do usuá
usuário
Fazer exemplos das páginas:
98 funções escalares
99—100 com valor de tabela
101—102 tabela in-line.
Discussão sobre os exemplos:
Quais são as características de cada tipo?
Em qual situação devemos usar qual tipo de função?
SQL Avanç
Avançado
Funç
Funções do usuá
usuário
Boas práticas:
Funções complexas em dados pequenos
Cuidado com o encapsulamento
As funções escondem a complexidade de uma
consulta simples
Prefira funções à procedimentos
Funções in-line são parecidas com view, mas
com uma vantagem: permitem parâmetros
16
SQL Avanç
Avançado
Funç
Funções do usuá
usuário
Exercício:
Converter o procedimento SoundexFunc para uma
função
Criar tabela de Pessoa com os atributos nome e
sobrenome
Escrever testes usando a SoundexFunc para validar o
uso da função
Pergunta:
A comparação usando SoundexFunc é mais lenta que a
comparação direta de nomes, porque precisa converter o nome
para um código antes de pesquisar; mata o índice!! Então qual
seria a solução para utilizar o recurso do soundex sem perda
de índices?
SQL Avanç
Avançado
Disparadores (TRIGGERS)
Uso:
Mais usado para manter integridade
Automatização de operações complexas em
cascata
Customizar verificações e mensagens
Permite trabalhar com estado atual e anterior
de um dado
SQL Avanç
Avançado
Disparadores (TRIGGERS)
Uso:
Customizar verificações e mensagens
Verifica alguma condição especial do sistema e
lança um erro de lógica de negócios apropriado.
Desnormalização
Junção de várias tabelas para consolidação de
dados
Modelo continua íntegro, mas a visualização pode
ser feita conjunta
Permite trabalhar com estado atual e anterior
de um dado
SQL Avanç
Avançado
Disparadores (TRIGGERS)
São um tipo especial de procedimento que
executados sempre que ocorre algum evento.
Por exemplo, pode-se criar uma trigger (ou
disparador) para que, toda vez que seja inserido
um registro em uma determinada tabela, seja
criado algum outro registro de relacionamento.
A execução ocorre automaticamente, quando
ocorre o evento ao qual a trigger está associada.
Inclusive não invocados manualmente
SQL Avanç
Avançado
Disparadores (TRIGGERS)
Uso:
Operações em cascata
Alteração e exclusão em cascata
Automatização de operações complexas de
integridade
Por exemplo, verificar o estado de um atributo
comparando com outras tabelas; caso ele esteja
dentro de uma faixa de valores realiza alguma
operação sobre os dados, caso contrário realiza
outra. Digamos que pedido não pode pedir mais do
que X unidades de um produto que está num limite
mínimo em estoque.
SQL Avanç
Avançado
Disparadores (TRIGGERS)
Considerações:
Podem conter ROLLBACK
Entretanto, se é necessário sair do script da trigger quando é
feito um ROLLBACK, é melhor usar comando RETURN para
sair da execução
Em geral, os disparadores são reativos:
Dado um evento um disparador é executado
Restrições e INSTEAD OF são executados antes do evento
Disparadores podem afetar várias linhas de dados
@@ROWCOUNT
17
SQL Avanç
Avançado
Disparadores (TRIGGERS)
Criação (CREATE TRIGGER)
CREATE TRIGGER nome ON tabela
{FOR | AFTER | INSTEAD OF | }
{INSERT | UPDATE | DELETE}
AS
IF UPDATE(coluna)
...
Instruções
SQL Avanç
Avançado
Disparadores (TRIGGERS)
Alterando uma trigger:
Usar o comando ALTER TRIGGER, cuja sintaxe
é igual a do comando CREATE TRIGGER
Descartando ou removendo uma trigger:
DROP TRIGGER
Desativando / Ativando triggers
ALTER TABLE tabela {ENABLE |
DISABLE} TRIGGER {ALL | nome da
trigger [,...]}
SQL Avanç
Avançado
Disparadores (TRIGGERS)
Funcionamento INSTEAD OF
Pode ser associado a tabelas e views
Não pode ser associado a views com WITH
CHECK OPTION
Executa operações antes da instrução de
atualização
Exemplo das páginas 123—124
SQL Avanç
Avançado
Disparadores (TRIGGERS)
Criação (CREATE TRIGGER):
FOR e AFTER são executados após as ações
INSERT, UPDATE ou DELETE
INSTEAD OF, pelo contrário, cancela a
operação e desvia para execução do código do
disparador
Conferir em casa as instruções que não
podem estar presentes nas triggers (página
114)
Fazer exemplo das páginas 115—116.
SQL Avanç
Avançado
Disparadores (TRIGGERS)
Funcionamento de trigger
Acesso aos dados temporários e log para tomada de
decisões
Insert: tabela inserted
Delete: tabela deleted
Dados removidos das tabelas do BD
Update: registra em ambas as tabelas temporárias:
deleted (os dados anteriores) e inserted (dados novos)
IF UPDATE(coluna) determina se um registro foi alterado ou
não e executar instruções conforme o caso
Exemplo da página 122.
SQL Avanç
Avançado
Disparadores (TRIGGERS)
Disparadores aninhados:
Quando um disparador é executado, o
resultado da sua execução inicia um novo
disparador, que pode iniciar outro e ...
Limite de 32 disparadores aninhados
sp_configure habilita / desabilita
aninhamento de triggers
sp_configure (‘nested triggers’, 0)
Aninhamento cíclio não é permitido / executado
Atenção para aninhamento com dados
complexos
18
SQL Avanç
Avançado
Disparadores (TRIGGERS)
Ativando recursividade
Recursividade é capacidade de um método em
chamar ele mesmo para executar novamente,
sob novas condições, até um ponto de parada.
Ativação:
ALTER DATABASE ClassNorthwind SET
RECURSIVE_TRIGGERS ON
Recursividade pode ser direta ou indireta
(cíclica)
SQL Avanç
Avançado
Disparadores (TRIGGERS)
Exercícios:
Páginas 131—132
Criar uma tabela pessoa com os campos: código, nome e
sobrenome.
Criar uma trigger que, quando um registro é inserido na tabela
pessoa, ela, automaticamente, insere um registro equivalente na
tabela PessoaSoundex com os dados de pessoa, passando pela
função soundexTest. A tabela PessoaSoundex contém os
seguintes campos: codigo, nomex, sobrenomex.
Faça um procedimento que receba como parâmetro o nome de
uma pessoa, e faça a pesquisa pelo nome soundex de uma
pessoa, fazendo uso das tabelas acima. Lógica:
Converter o parâmetro para um código soundex
Procurar na tabela PessoaSoundex os registro com códigos
equivalentes, mas retornar os dados equivalentes na tabela Pessoa
SQL Avanç
Avançado
SQL Avanç
Avançado
Índices
Índices
Uso
Melhorar o desempenho de consultas,
agilizando (indexando) o acesso a dados
Criação de índices
CREATE INDEX
Remoção de índices
DROP INDEX
Índices automáticos:
PRIMARY KEY e UNIQUE
Armazenados na tabela sysindexes
Um índice funciona atribuindo uma chave de
busca a um dado
O situação é: apenas um valor de chave para um dado
(1 : 1)
Pode acontecer de uma chave retornar mais de um
dado.
Quando um índice de agrupamento é criado,
todos os índices sem agrupamento são recriados
Sintaxe e exemplo na página 135
SQL Avanç
Avançado
SQL Avanç
Avançado
Índices
Índices
Índices agrupamento:
CLUSTERED
Exemplo da página 139, mostra índices
duplicados
Sem agrupamento:
NONCLUSTERED
Índices compostos:
União mais de um campo
Por exemplo, não permitir duplicidade de registros com
valores de outras tabelas associadas
Digamos uma tabela de relacionamento entre Pessoa e
uma tabela de endereço. É possível colocar uma
restrição com índice para que uma pessoa não dois
vínculos para um mesmo endereço.
Exemplo da página 141.
Exercício: criar a situação exposta acima (pessoa x
endereço)
19
Download