Você está na página 1de 8

CAMPUS

INSTITUTO FEDERAL DE EDUCAÇÃO,


CIÊNCIA E TECNOLOGIA DE SÃO PAULO
São Paulo

Banco de Dados Aula 12

Professor: Francisco Veríssimo Luciano e Glauber da Rocha Balthazar


E-mail: fvluciano@hotmail.com

12. - Aula 12 – Procedures e Functions – Parte II

12.1 – Functions
É um tipo de programa, criado no Servidor SQL Server, dentro de um database específico,
que tem como principal objetivo retornar um valor ou um conjunto de valores para um usuário ou
para outra função, para store procedure ou aplicação. São chamadas de User Defined
Functions(UDFs), ou simplesmente, função definida pelo usuário. Uma função definida pelo
usuário é uma rotina Transact-SQL ou CLR (Common Language Runtime) que aceita
parâmetros, executa uma ação, como um cálculo complexo, e retorna o resultado dessa ação
como um valor.
Cabe lembrar ainda, que funções definidas pelo usuário podem ser aninhadas, isto é, uma
função definida pelo usuário pode chamar outra. O nível de aninhamento é incrementado
quando a execução da função é iniciada, e reduzido quando a execução da função chamada é
concluída. Até 32 níveis de funções definidas pelo usuário podem ser aninhados. Se o máximo
de níveis de aninhamento for excedido haverá falha em toda a cadeia de funções da chamada
de aninhamento. Qualquer referência a um código gerenciado de uma função definida pelo
usuário do Transact-SQL é contada como um nível em relação ao limite de 32 níveis de
aninhamento. Os métodos invocados a partir do código gerenciado não são contados em
relação a esse limite.

12.1.1 – Regras para utilização das UDFs

1. Uma função definida pelo usuário pode receber parâmetros de entrada.


2. Os parâmetros de entrada de uma função não podem ser do datatype timestamp, cursor
ou table.
3. Uma função definida pelo usuário não aceita parâmetros de saída (parâmetro output).
4. Uma função retorna um valor escalar ou os dados de uma tabela.
5. Dentro de uma UDF você não pode executar os comandos INSERT, UPDATE e DELETE.
6. Os comandos INSERT, UPDATE e DELETE podem ser utilizados para manipular dados
de variáveis de memória do tipo tabela (table).
7. Para que um usuário possa executar uma UDF, ele deve ter permissão de SELECT nela.
8. Para executar uma função, você deve utilizar o comando SELECT e o nome qualificado
por duas partes, ou seja, deve utilizar o nome do proprietário da função antes do nome
dela para executá-la.
9. As UDFs não podem executar as funções determinísticas internas do SQL Server
(Funções Built-in).
12.1.2 – Funções determinísticas
As funções determinísticas sempre retornam o mesmo resultado quando são chamadas
com o uso de um conjunto específico de valores de entrada e quando recebem o mesmo estado
do banco de dados.
As funções não determinísticas podem retornar resultados diferentes cada vez que são
chamadas com um conjunto específico de valores de entrada, mesmo que o estado do banco de
dados que elas acessam permaneça o mesmo. Por exemplo, a função AVG sempre retorna o
mesmo resultado, dadas as qualificações declaradas acima, mas a função GETDATE, que
retorna o valor datetime atual, sempre retorna um resultado diferente.
Há várias propriedades de funções definidas pelo usuário que determinam a capacidade do
Mecanismo de Banco de Dados do SQL Server de indexar os resultados da função, tanto por
meio de índices em colunas computadas que chamam a função como por meio de exibições
indexadas que referenciam a função. O determinismo de uma função é uma dessas
propriedades. Você não pode influenciar o determinismo de nenhuma função interna. Cada
função interna é determinística ou não determinística com base no modo como a função é
implementada pelo SQL Server. Por exemplo, a especificação de uma cláusula ORDER BY em
uma consulta não altera o determinismo de uma função usada nessa consulta.
12.1.3 – Tipos de User Defined Functions (UDF)

Podem ser de três tipos:

1. Funções escalares;

2. Funções in-line: contêm apenas um comando SELECT para retornar os dados de uma
tabela;

3. Funções que contêm vários comandos e retornam dados de uma tabela.

12.1.3.1 – Função escalar


Uma função escalar é semelhante a uma função interna do SQL Server (Built_in Function).
Elas podem ou não receber parâmetros de entrada e retornar apenas um único valor.

SINTAXE:

Create FUNCTION [Proprietário_da_função].Nome_da_Função


([{@parametro [AS] datatype_escalar [=default ] } [,...n]])
RETURNS [WITH <opção> [ [,] ...n] ]
[AS]
BEGIN
Corpo da Função
RETURN Valor_escalar
END
< opção > ::=
{ ENCRYPTION | SCHEMABINDING }
Exemplo de função escalar:

A função seguinte tem como objetivo calcular a área de um triângulo mediante os valores
recebidos pelos parâmetros de entrada @base e @altura.

Create FUNCTION F_AreaTriangulo (@base smallint, @altura


smallint)
RETURNS int
AS
BEGIN
RETURN ((@base * @altura)/2)
END

Para executar a função:

SELECT dbo.F_AreaTriangulo(5,30)
SELECT dbo.F_AreaTriangulo(3,17)

Outro exemplo de função escalar:

A função seguinte tem como objetivo calcular a área de uma circunferência mediante valores
recebido pelo parâmetros de entrada @raio.

Create FUNCTION F_AreaCirculo (@raio int)


RETURNS Bigint
AS
BEGIN
DECLARE @area Bigint
SET @area = PI() * POWER(@raio,2)
RETURN @area
END

Para executar a função:

SELECT dbo. F_AreaCirculo (10)

12.1.3.2 – Função in-line com apenas um comando

Sintaxe:
Create FUNCTION [Proprietário_da_função].Nome_da_Função
([{@parametro [AS] datatype_escalar [=default ] } [,...n]])
RETURNS TABLE
[WITH <opção > [ [,] ...n]
[AS]
RETURN [ ( ] Comando SELECT [ ) ]
Exemplo:

De acordo com a tabela Funcionário e seus dados apresentados em seguida, a função


F_DataCadastro() recebe uma data como parâmetro e retorna, da tabela Funcionário, todos os
funcionários que foram cadastrados nessa data. Veja a seguir:

Comandos para criação das tabelas Funcionario e Regiao:

CREATE TABLE [Funcionario](


[Cod_Func] [int] NOT NULL,
[Nome_Func] [varchar](100) NULL,
[Sexo_Func] [char](1) NULL,
[Sal_Func] [float] NULL,
[Data_Func] [datetime] NULL,
[Num_Regiao] [int] NULL
)

CREATE TABLE [Regiao](


[Num_Regiao] [int] NOT NULL,
[Regiao] [varchar](50) NULL
)

Comandos para popular as duas tabelas:


insert into funcionario values(1,'Manda Chuva','M',5000,
'1998-01-01 00:00:00.000',1)
insert into funcionario values(2,'Chuchu','M',3000,
'1999-01-01 00:00:00.000',1)
insert into funcionario values(3,'Bacana','M',2000,
'2000-01-01 00:00:00.000',2)
insert into funcionario values(4,'Espeto','M',2500,
'2001-01-01 00:00:00.000',2)
insert into funcionario values(5,'Batatinha','F',4000,
'2002-01-01 00:00:00.000',3)

insert into Regiao values (1,'Norte')


insert into Regiao values (2,'Sul')
insert into Regiao values (3,'Leste')
insert into Regiao values (4,'Oeste')
Exemplo – solução:

Create FUNCTION F_DataCadastro (@data smallDatetime)


RETURNS TABLE
AS
RETURN (SELECT * FROM dbo.Funcionario
WHERE Data_Func = @data)

Para executar a função:

SELECT * FROM F_DataCadastro('01/01/98')

Fazendo JOIN com o resultado da função F_DataCadastro:

Select F.*, Regiao.Regiao


from F_DataCadastro('01/01/98') as F, Regiao
where F.Num_Regiao = Regiao.Num_Regiao

12.1.3.3 – Função com vários comandos


Sintaxe:
Create FUNCTION [Proprietário_da_função].Nome_da_Função
([{@parametro [AS] datatype_escalar [=default ] } [,...n]])
RETURNS @Nome_Variável_Retornada TABLE <Definição da Estrutura da Tabela>
[WITH <opção > [ [,] ...n]
[AS]
BEGIN
Corpo_da_Função
RETURN
END
< opções_da_Função > ::= {ENCRYPTION | SCHEMABINDING }
<Definição da Estrutura da Tabela> ::= ( { Definição_da_Coluna | Constraint
} [,...n ])

Exemplo:
A tabela “Usuario” a seguir é utilizada no próximo exemplo.
CREATE TABLE [dbo].[Usuario](
[User_Name] [varchar](50) NULL,
[Num_Regiao] [int] NULL
)

insert into usuario values ('george',1)


insert into usuario values ('dbo',10)
insert into usuario values ('ana',2)

Função:

A função seguinte obtém o código da região do usuário corrente da tabela Usuario apresentada
anteriormente e testa. Se o número da região for 10, significa que o usuário é o dbo (database
owner) e pode ler todos os dados da tabela Funcionário. Se não, o usuário corrente, que deve
existir na tabela Usuario, pode ler dados da tabela funcionario, mas apenas da região da qual
ele recebeu permissão por meio do Número da região. Se o usuário corrente não estiver na
tabela Usuario, a função retorna apenas as colunas da tabela Funcionario, mas sem valor
algum.

Create FUNCTION F_Func2 ( )


RETURNS @Func Table ( Nome_Func varchar(100) not null,
Sal_Func decimal(10,2) not null )
AS
BEGIN
DECLARE @numreg tinyint
SELECT @numreg = Num_Regiao FROM Usuario WHERE User_name = User
IF @numreg IS NOT NULL AND @numreg <> 10
INSERT @Func
SELECT Nome_Func, Sal_Func FROM Funcionario WHERE
Num_regiao = @numreg
ELSE IF @numreg = 10
INSERT @Func
SELECT Nome_Func, Sal_Func FROM Funcionario
RETURN
END

--Código que executa a função ***


SELECT * FROM dbo.F_Func2( )
Referências

MECENAS, Ivan. OLIVEIRA, Vivianne. Banco de Dados: Do modelo conceitual а implementaзгo


fнsica. Rio de Janeiro: Alta Books, 2005. 180 p.

ELMASRI, Ramez E. & NAVATHE, Shamkant B, Sistema de Bancos de Dados – Fundamentos e


Aplicaзхes, Sгo Paulo: ADDISON WESLEY BRASIL, 2005.

MACEDO, Diego. Modelagem Conceitual, Lуgica e Fнsica de Dados. 2011. Acessado em


<14/02/2015>. Disponнvel em
<http://www.diegomacedo.com.br/modelagem-conceitual-logica-e-fisica-de-dados/>.

NASCIMENTO, Manuela Cicco do. Br2Oracle :Geraзгo automбtica de esquema relacional a


partir da ferramenta BrModelo para o SGBD Oracle. Monografia para conclusгo de graduaзгo
em Ciкncia da Computaзгo. Orientador: Prof. Fernando da Fonseca de Souza. Recife, 30 de
Janeiro de 2008. Universidade Federal de Pernambuco - Centro de Informбtica.

RABELO, Ricardo J. Banco de Dados. MaterialDAS5316. 2009. Acessado em <14/02/2015>.


Disponível em em <http://www.das.ufsc.br/~rabelo/Ensino/DAS5316/MaterialDAS5316/
Banco_de_Dados/bd_intro.pdf>.

MACHADO, Felipe Nery Rodrigues. Projeto de banco de dados: uma visгo prбtica. -- 16 ed.
rev.e atual. -- Sгo Paulo: Йrica, 2009.

ROCHA, Ricardo. Bases de Dados 2005/2006. Parte VIII: Normalizaзгo. DCC - Faculdade de
Ciкncias da Universidade do Porto. Acessado em <18/02/2015>. Disponнvel em
<http://www.dcc.fc.up.pt/~ricroc/aulas/0506/bd/apontamentos/parteVIII.pdf>.

PIVETTA, Elisa Maria. BANCO DE DADOS: Modelagem de Dados – Normalizaзгo.


UFSM/CAFW, 2011. Acessado em <18/02/2015>. Disponнvel em
<http://www.cafw.ufsm.br/~elisa/bd/normalizacao1.pdf>.

FROZZA, Angelo Augusto. BANCO DE DADOS - NORMALIZAЗГO. Instituto Federal


Catarinense. 2011. Acessado em <18/02/2015>. Disponнvel em
<http://www.ifc-camboriu.edu.br/~frozza/2011.1/IE10/IE10-BDD-Aula003-Normalizacao-Revisao
.pdf>.

IFSudesteMG. Exercнcios sobre normalizaзгo. Acessado em <19/02/2015>. Disponнvel em


<http://sistemas.riopomba.ifsudestemg.edu.br/dcc/materiais/1997751601_Exemplos_sobre_nor
malizacao%20resolvido.pdf>.

SANTOS, Ricardo. Mуdulo 2: correзгo exercнcios - normalizaзгo. Acessado em <19/02/2015>.


Disponнvel em <http://ricardosantos.net/arquivos/Normalizacao_resolvidos.pdf>.

LOPES, ABRAHГO. AULA 11-12 Modelo Conceitual, Lуgico e Fнsico, Entidade-Relacionamento.


Instituto Federal do Rio Grande do Norte, campus Mossorу, 2014. Acessado em <19/02/2015>.
Disponível em http://docente.ifrn.edu.br/abrahaolopes/2014.1-integrado/3.2401.1v-
prog-b-dados/ modelo-conceitual-logico-fisico-relacionamento-cardinalidade>.

BIANCHI, Wagner. Entendendo e usando нndices - Parte 1. 2008. Acessado em <19/02/2015>.


Disponнvel em <http://www.devmedia.com.br/entendendo-e-usando-indices-parte-1/6567>.

Você também pode gostar