Professional Documents
Culture Documents
Mod08 ProgramandonoSQLServer 20200513224715
Mod08 ProgramandonoSQLServer 20200513224715
Variáveis
DECLARE
IF...ELSE
WHILE
Tratamento de erros
Variáveis
Numéricos
• Inteiros: int, smallint, tinyint, bigint, bit
• Valores decimais precisos: decimal (p, [s]) ou dec (p,
[s]), numeric(p, [s]), money, smallmoney
• Valores de ponto flutuante: real, float[(p)]
Datas
• Datetime
• Smalldatetime
Caracteres
• Tamanho fixo: char(n), nchar(n)
• Tamanho variável: varchar(n), nvarchar(n)
Inicializando uma variável
Ex.:
declare @x int, @date datetime
set @date = getdate()
set @x = datepart(month, @date)
select @x as x, @date as data_atual
Exibindo o valor de uma variável
Ex.:
use Empresa
GO
declare @count int
select @count = count(*)
from emp
print 'Existem ' + convert(varchar, @count) + '
empregados cadastrados na tabela EMP'
GO
Exibindo o valor de uma variável
Ex.:
use Empresa
GO
declare @count int
set @count = (select count(*) from dept)
print 'Existem ' + convert(varchar, @count) + '
departamentos cadastrados na tabela DEPT'
GO
IF...ELSE
Comandos condicionais
Ex.:
declare @count int
SELECT @count = COUNT(*)
FROM emp
WHERE deptno = 20
IF @count > 0
print 'Existem ' + convert(varchar, @count) + ' empregados no
departamento 20'
ELSE
print 'Não existem empregados no departamento 20'
GO
IF...ELSE
Ex.:
USE empresa
GO
IF
(SELECT AVG(salario)
FROM emp
WHERE deptno = 20) > 1000
print 'Média do depto 20 acima de 1000'
ELSE
print 'Média do depto 20 abaixo de 1000'
GO
WHILE
Comando de repetição
Ex.:
declare @x int, @i int, @msg varchar(40)
set @x = 30
set @i = 0
while @i < @x
set @i = @i + 1
set @msg = 'O valor de @i é igual a ' + convert(varchar,
@i)
print @msg
Tratamento de Erros
BEGIN TRY
...
END TRY
BEGIN CATCH
...
END CATCH
Tratamento de Erros
Exemplo: tentando inserir um registro com PK duplicada (BD “Formula1”).
BEGIN TRAN
BEGIN TRY
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
SELECT ERROR_NUMBER() AS NumeroErro, ERROR_SEVERITY() AS Severidade,
ERROR_STATE() as Estado, ERROR_MESSAGE() as Mensagem
END CATCH
Tratamento de Erros
Exemplo: tentando inserir um registro com PK duplicada (BD “Formula1”).
CREATE PROCEDURE st_Insere_Piloto
@piloto_id INT
, @nome VARCHAR(50)
, @pais_origem VARCHAR(50)
, @equipe_id INT
AS
BEGIN
BEGIN TRAN
BEGIN TRY
INSERT INTO PILOTO (PILOTO_ID, NOME, PAIS_ORIGEM, PONTOS, EQUIPE_ID)
VALUES (@piloto_id, @nome, @pais_origem, NULL, @equipe_id)
COMMIT TRAN
END TRY
BEGIN CATCH
SET @erro = 'Erro ao inserir piloto: ' + ERROR_MESSAGE()
ROLLBACK TRAN
Sintaxe:
Sintaxe:
return @cidade
end
Invocando uma função
select dbo.ft_Cidade_Paciente(100)
ou
select nome
, dbo.ft_Cidade_Paciente(idPaciente) as Cidade
from paciente
Criando funções
create function Info_Empregado (@CodEmp int)
returns varchar(200)
as
begin
declare @info varchar(200)
return @info
end
Criando funções
(1 row(s) affected)
Criando funções
go
-- Exemplo de execução
select *
from ft_gerenciados(7839)
Criando funções
select *
from ft_empMaiorSal(20)
Criando funções
if month(@data_base) <= 6
begin
set @data_inicio = '01.01.' + CAST(YEAR(@data_base) as varchar)
set @data_fim = '30.06.' + CAST(YEAR(@data_base) as varchar)
end else
begin
set @data_inicio = '01.07.' + CAST(YEAR(@data_base) as varchar)
set @data_fim = '31.12.' + CAST(YEAR(@data_base) as varchar)
end
return
end
go
select *
from ft_periodo_letivo(GETDATE())
Criando funções
create function GetSugestaoPalavra(@palavra varchar(30))
returns @tabPalavras table (nome varchar(30))
as
begin
insert into @tabpalavras
select nome
from dicionario
where nome = @palavra
if (select count(*)
from @tabpalavras) = 0
begin
insert into @tabpalavras
select nome
from dicionario
where soundex(nome) = soundex(@palavra)
end
return
end
Criando funções
Criar uma função que receba como primeiro
argumento o código de um departamento e como
segundo argumento um inteiro:
1 - retornar empregados com maior salário
2 - retornar empregados com menor salário
if (@opcao = 1)
insert into @empregados
select empno, nome, cargo from emp
where deptno = @deptno
if (@opcao = 1)
insert into @empregados
select empno, nome, cargo
from emp
where deptno = @deptno
and salario > @media
else if (@opcao = 2)
insert into @empregados
select empno, nome, cargo
from emp
where deptno = @deptno
and salario < @media
return
end
Criando stored procedures
CREATE PROC [ EDURE ] procedure_name [ ;
number ]
[ { @parameter data_type }
[ = default ] [ OUTPUT ] ] [ ,...n ]
[ WITH
{ENCRYPTION} ]
AS sql_statement [ ...n ]
Criando stored procedures
Ex.:
use Empresa
GO
CREATE PROCEDURE emp20
AS
SELECT * FROM emp WHERE deptno = 20
GO
Executando stored procedures
Executando um procedimento
armazenado isoladamente
EXEC[UTE] emp20
Executando um procedimento
armazenado em uma instrução INSERT
INSERT INTO emp_temp
EXEC emp20
Alterando e descartando stored
procedures
Title
--------------------------------------------------------------------------------
The Busy Executive's Database Guide
The Gourmet Microwave
The Psychology of Computer Cooking
(3 row(s) affected)
-------------------------------------------------------------
O custo total desses livros é $22.98
(1 row(s) affected)
Criando Triggers
Tipo específico de stored procedure
Associado a uma tabela
Executada automaticamente após
UPDATE
INSERT
DELETE
Não podem ser chamados diretamente
É parte de uma transação
Criando Triggers
Criadas para
Alterações em cascata em tabelas
relacionadas de um banco de dados
Impor uma integridade de dados mais
complexa do que uma restrição CHECK
Comparar os estados anteriores e
posteriores dos dados que estão sendo
modificados
Criando Triggers
As constraints são verificadas
primeiro
A operação (INSERT, UPDATE,
DELETE) é executada
A trigger é disparada
As tabelas podem conter várias
triggers para uma mesma ação
Criando Triggers
Sintaxe
create trigger [owner.]trigger_name
on [owner.]table_name
for {insert, update, delete}
as SQL_statements
Criando Triggers
Sintaxe
create trigger [owner.]trigger_name
on [owner.]table_name
for {insert, update}
as
[if update (column_name )
[{and | or} update
(column_name)]...]
SQL_statements
Criando Triggers
Exemplo
create trigger tr_dept on dept
for insert as
print 'Linha inserida'
GO
insert into dept (deptno, nome)
values (70, 'RH')
GO
Linha inserida
(1 row(s) affected)
Alterando Triggers
Exemplo
alter trigger tr_dept on dept
for update as
if update(nome)
print 'Nome alterado'
else if update(loc)
print 'Local alterado'
GO
update dept
set nome = 'FIN'
where deptno = 70
GO
Nome alterado
(1 row(s) affected)
Criando Triggers
Tabelas INSERTED e DELETED
Tabelas especiais utilizadas em instruções de
triggers
SQL Server automaticamente cria e gerencia
essas tabelas
Tabelas temporárias, em memória, utilizadas
para testar os efeitos das alterações
realizadas
Não podem ser alteradas
Criando Triggers
Tabelas INSERTED e DELETED
Criando Triggers
Tabelas INSERTED e DELETED
Inserted:
empno nome salario deptno
----------- ------------------ --------------------- -----------
8000 Stephen 2000.0000 70
(1 row(s) affected)
Deleted:
empno nome salario deptno
--------- -------------------- --------------------- -----------
(0 row(s) affected)
Criando Triggers
insert into emp (empno, nome, salario, deptno)
values (9000, 'Mary', 1400, 70)
GO
Inserted:
empno nome salario deptno
----------- ------------------ --------------------- -----------
9000 Mary 1400.0000 70
(1 row(s) affected)
Deleted:
empno nome salario deptno
--------- -------------------- --------------------- -----------
(0 row(s) affected)
Criando Triggers
update emp
set salario = salario * 1.5
where deptno = 70
GO
Inserted:
empno nome salario deptno
----------- -------------------- --------------------- -----------
8000 Stephen 3000.0000 70
9000 Mary 2100.0000 70
(2 row(s) affected)
Deleted:
empno nome salario deptno
----------- -------------------- --------------------- -----------
8000 Stephen 2000.0000 70
9000 Mary 1400.0000 70
(2 row(s) affected)
Criando Triggers
delete from emp
where deptno = 70
GO
Inserted:
empno nome salario deptno
--------- -------------------- --------------------- -----------
(0 row(s) affected)
Deleted:
empno nome salario deptno
--------- -------------------- --------------------- -----------
8000 Stephen 3000.0000 70
9000 Mary 2100.0000 70
(2 row(s) affected)
Alterando dados na tabela base utilizando
as tabelas INSERTED e DELETED
alter trigger tr_emp on emp
for insert as
update emp
set comissao = salario*0.10
where empno in
(select empno from inserted)
Alterando dados na tabela base utilizando
as tabelas INSERTED e DELETED
insert into emp (empno, nome, salario, deptno)
values (9000, 'Mary', 1400, 70)
GO
select empno, salario, comissao
from emp
where empno = 9000
GO
(1 row(s) affected)
(1 row(s) affected)
Alterando dados na tabela base utilizando
as tabelas INSERTED e DELETED
ALTER TRIGGER tr_EMP ON emp
FOR UPDATE AS
DECLARE @NEW_SAL money, @OLD_SAL money
select @NEW_SAL = salario
from inserted
UPDATE DEPT
SET ATIVO = 1
GO
Exercícios (Trigger)
Crie uma trigger na tabela DEPT, de
maneira que não seja possível
inativar um departamento (campo ATIVO =
0), caso exista algum empregado neste
departamento
Exercícios (Trigger)
create trigger TR_UPD_ATIVO_DEPT on dept
for UPDATE as
declare @deptno varchar(10)
if update(Ativo)
begin
select @deptno = e.deptno
from inserted I
join emp e
on i.deptno = e.deptno
where i.ativo = 0
DECLARE cursor_name
[ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
Declarando cursores
Exemplo
OPEN crsr_emp
Print 'O cursor possui ' + convert(varchar, @@cursor_rows) + ' linhas '
Print ''
while @@fetch_status = 0
begin
set @i = @i + 1
print 'Estamos na posicao ' + convert(varchar, @i) + ' do cursor'
print 'Empno ' + convert(varchar, @empno) + ', nome ' + convert(varchar, @nome)
Print ''
fetch next from crsr_emp
into @empno, @nome
end
close crsr_emp
deallocate crsr_emp