Modelo de Dados Objeto-Relacional
Banco de Dados II – 2009.2Bacharelado em Ciência da Computação
UFCGProf. Cláudio de Souza Baptista, Ph.D.
Conteúdo Bancos de Dados Objeto-Relacional
Modelo de Dados Objeto-Relacional Linguagem de Consultas Objeto Relacional
Visão geral dos conceitos de orientação a objetos disponíveis no ORACLE 11g
Extensões para criar Objetos Complexos O impacto da orientação a objetos em consultas
SQL Integração OO-Relacional através de Visões de
Objeto
Banco de Dados Objeto-Relacional
SGBDs Objeto-Relacional combinam os benefícios do modelo Relacional com a capacidade de modelagem do modelo OO
Fornecem suporte para consultas complexas sobre dados complexos
Atendem aos requisitos das novas aplicações e da nova geração de aplicações de negócios
Banco de Dados Objeto-RelacionalModelos e Linguagens
O modelo de dados OR é uma extensão do modelo Relacional As extensões incluem mecanismos para permitir aos
usuários estender o banco de dados com tipos e funções específicas da aplicação
A linguagem de consulta OR é uma extensão da linguagem SQL para suportar o modelo de objetos As extensões incluem consultas envolvendo objetos,
atributos multivalorados, TADs, métodos e funções como predicados de busca em uma consulta
Modelo de Dados Objeto-Relacional Permite especificar e utilizar tipos abstratos
de dados(TADs) da mesma forma que os tipos de dados pré-definidos TADs são tipos de dados definidos pelo
usuário que encapsulam comportamento e estrutura interna (atributos)
A tabela convencional é estendida para permitir a referência de objetos (referência de tipos), TADs e valores alfanuméricos como domínio de colunas
Modelo de DadosObjeto-Relacional
Utiliza referências para representar conexões inter-objetos tornando as consultas baseadas em caminhos de referência mais compactas do que as consultas feitas com junção
Herança é implementada organizando todos os tipos em hierarquias
Utiliza os construtores set, list, multiset ou array para organizar coleções de objetos
Benefícios do Modelo de Dados Objeto-Relacional
Nova Funcionalidade Aumenta indefinidamente o conjunto de tipos e
funções fornecidas pelo SGBD Desenvolvimento de aplicações simplificado
Reuso de código Consistência
Permite a definição de padrões, código reusável por todas as aplicações
Linguagem de Consultas paraBancos de Dados Objeto-Relacional
O resultado de uma consulta ainda consiste de tabelas Um SGBD Objeto-Relacional ainda é relacional
pois suporta dados armazenados em tabelas formadas por linhas e colunas
A linguagem de consultas para BDOR é uma extensão da linguagem SQL, utilizada para definição e manipulação de dados e consultas
SQL:1999 (SQL-3) É a base para muitos SGBDs OR (Oracle11g, Informix
Universal Server, IBM’s DB2 Universal Database, entre outros)
Também está sendo chamada de SQL:1999 e tem sido caracterizada como “SQL Orientada a Objetos”
SQL:1999 é muito mais do que SQL-92 incrementada com a tecnologia de OO. Envolve características adicionais que podem ser classificadas em: Relacionais: novos tipos de dados, novos predicados Orientadas a Objetos:tipos de dados definidos pelo
usuário, definição de métodos, uso de referências
O que tem no SQL:1999? Multi-part standard — ISO/IEC 9075-n:1999
Part 1: SQL/Framework Part 2: SQL/Foundation Part 3: SQL/CLI Part 4: SQL/PSM Part 5: SQL/Bindings
Part 1: SQL/Framework
Definições comuns e conceitos Estrutura do padrão multi-parte Estrutura para conformidade básica Possui cerca de 75 páginas
Part 2: SQL/Foundation O cerne do padrão Omite host language bindings, dynamic SQL,call interface, e questões semelhantes SQL tradicional e SQL orientando a objetos! Cerca de 1100 páginas
Part 3: CLI Call-Level Interface Melhor implementação: ODBC Alinhado com SQL:1999 features e ODBC3.0 features Cerca de 400 páginas
Part 4: SQL/PSM PSM-96 especificou:
functions & procedures SQL-server modules computational completeness
PSM-99 specifica: SQL-server modules computational completeness
Análogo a PL/SQL, Transact-SQL, etc. Cerca de 160 páginas
Part 5: SQL/Bindings Embedded SQL (SQL embutido) Dynamic SQL “Direct Invocation” Cerca de 250 páginas Tendência: ser incorporado na Part 2!!!!
Novas partes do SQL Part 7: SQL/Temporal Part 9: SQL/MED (Management of External
Data) Part 10: SQL/OLB (Object Linking Binding)
JDBC e SQLJ SQL/OLAP SQL/MM: Spatial, Text, Image
Part 2: SQL/Foundation Estamos interessados neste curso na parte
do padrão que trata de Orientação a Objetos: Tipos de dados definidos pelo usuário Atributos & comportamento Encapsulamento: funções & métodos Observers & mutators Hierarquias de tipos (herança simples) User-defined CAST, ordenação Tabelas tipadas & tipos referência
Tipos de Dados Definidos pelo Usuário UDT – User Defined Types Evolução dos tipos em SQL:
Sempre houve os tipos embutidos (built-in) como: INTEGER, SMALLINT, CHAR, VARCHAR, DATE, TIME e TIMESTAMP
Alguns tipos proprietários: Oracle NUMBER e RAW; Sybase SMALLMONEY e IMAGE
Após alguns anos, surgiram BLOB e CLOB com semântica limitada!
Houve algumas tentativas de DBMS vendors de propor soluções para certos tipos de dados específicos: texto, GIS, imagens e time series
UDT Entretanto, o que se queria era uma solução
mais genérica que pudesse estender o SGBD com tipos específicos:
Solução: UDT!!!! Obs.: o termo User em UDT não quer dizer
usuário final!
UDT Definição: Um UDT é um tipo que não é
embutido em um SGBD ou linguagem de programação, mas que pode ser definido como parte de um desenvolvimento de uma ou mais aplicações, com possível comportamento definido em sua criação.
(adaptada de Jim Melton: Advanced SQL:1999, Morgan Kauffman, 2003)
Tipos definidos pelo usuário Três tipos de UDT:
Distinct types Structured types Reference types
Distinct Types Baseados em tipos embutidos CREATE TYPE QI AS INT FINAL
Não pode misturar o tipo fonte e o tipo distinto e m expressões
DECLARE VARIABLE X INTEGER; DECLARE VARIABLE Y QI; ...X+Y --INVALID EXPR! ...X+CAST(Y AS INTEGER) --OK
Distinct Types
CREATE TYPE TAMBLUSA AS INT FINAL;CREATE TYPE NUMSAPATO AS INT FINAL;CREATE TABLE pessoas (
nome VARCHAR (30),calca NUMSAPATO,veste TAMBLUSA,
);
Distinct Types
Uso incorreto:SELECT nomeFROM PessoasWHERE calca > veste;
Distinct Types
Uso correto:SELECT nomeFROM PessoasWHERE CAST(calca TO INTEGER) >
CAST(veste TO INTEGER);
Distinct Types
Uso incorreto:SELECT nome, calca + 20FROM PessoasWHERE veste > 7;
Distinct Types
Uso correto:SELECT nome, CAST (calca TO INTEGER) + 20FROM PessoasWHERE CAST(Veste TO INTEGER) > 7;
Structured Types Também conhecidos como “abstract data
types” (Tipos Abstratos de Dados) Pode conter uma estrutura arbitrariamente
complexa Análogo a struct na linguagem C Stored data => state => attributes Behavior => semantics => methods &
functions & procedures
Atributos • “Stored data” Cada atributo pode ser:
Tipo embutido, incluindo coleção Tipo definido pelo usuário
O sistema gera uma função “get” (observer) e uma função “set” (mutator) para cada atributo — not overloadable
Encapsulamento Esconde implementação dos usuários Permite que a implementação mude sem
afetar as aplicações — desde que a interface provida permaneça constante
Aplicações acessam tudo através da interface funcional, incluindo os atributos usando as funções observer e mutator
Procedures, Funções, Métodos Conceito genérico: rotina => procedure,
function, method — normalmente “stored” Procedure: parâmetros de input & output
invocada usando o comando “CALL” Função: apenas parâmetro de input (output
retornado como valor da função); invocado usando a notação funcional
Métodos: caso especial de funções
Procedures, Funções, Métodos Procedures
Pode ser overloaded: mesmo nome, com números diferentes de parâmetros
Tipos de dados dos argumentos não utilizados para overloading
Em qualquer esquema, não ligado a um tipo estruturado.
Procedures, Functions, Methods Functions:
Podem ser overloaded Funções múltiplas com o mesmo nome, mesmo
número de parâmetros Distintos pelos tipos de dados dos argumentos Mas…usado apenas em tempo de compilação não
em tempo de execução Em qualquer esquema, não ligado a um tipo
estruturado
Procedures, Functions, Methods Métodos
Podem ser overloaded Fortemente acoplado a um único tipo estruturado Deve estar no mesmo esquema da definição do tipo First argument implicit, distinguished —
Tipo do argumento é associado ao tipo estruturado Todos argumentos, exceto o primeiro usado o tipo
declarado para resolução, o primeiro argumento usa o tipo mais específico do runtime
Notação: ponto (.) vs funcional Notação de ponto: a.b.c Notação funcional: c(b(a)) Funções DEVEM usar a notação funcional Métodos DEVEM usar a notação de ponto
Observer: SELECT EMP.AGE FROM... Mutator: SET EMP.AGE = 10
Diferenças Funções e MétodosCaracterística Função MétodoLigado a um tipo específico?
Não Sim
Sintaxe de chamada Notação funcional Notação de ponto
Esquema de residência Qualquer esquema Esquema do tipo associado
Resolução de rotina Compilation time Runtime
Tipos de métodos Há dois tipos de métodos:
Static methods: opera no tipo de dados propriamente dito
Instance methods: opera na instância de um tipo.
Declaração de Métodos Há dois lugares para definição de métodos
Declaração: os métodos são declarados (suas assinaturas) na definição do tipo de dados
Implementação: a implementação dos métodos ficam em outro lugar, utilizando-se de um comando SQL específico para tal fim. O código pode ser escrito em SQL ou em outra linguagem de programação como Java e C++
Exemplo: Método
CREATE TYPE Filme AS (título varchar (100),descricao varchar (500),duracaoMinutos int) NOT FINALMETHOD duracaoEmHoras() RETURNS INTERVAL HOUR(2) TO MINUTE
Exemplo: Método
CREATE INSTANCE METHOD duracaoEmHoras ( ) RETURNS INTERVAL HOUR(2) TO MINUTE FOR Filme
RETURN CAST (CAST (SELF.duracao AS INTERVAL MINUTE(4)) AS INTERVAL HOUR(2) TO MINUTE)
Chamada a Métodos Ex.:CREATE TABLE tb_Filme (
cod int,info filme,aluguel DECIMAL(5,2))
Chamada a Método
Recupere a duração em horas e minutos do filme ‘Ghost’
SELECT mt.info.duracaoEmHoras( )FROM tb_Filme AS mtWHERE mt.info.titulo = ‘Ghost’
Encapsulamento Considere:
CREATE TYPE rational AS ( numerator INTEGER, denominator INTEGER )
Funções implícitas: CREATE FUNCTION numerator (rational)
RETURNS INTEGER CREATE FUNCTION numerator (rational,
INTEGER) RETURNS rational
Construtores Nenhum “new object” é criado, ao invés usa-
se da seguinte forma:DECLARE VARIABLE ratvar rational;SET ratvar = rational(5,7);INSERT INTO table1 (ratcol)VALUES (rational(13,131));
Construtores Construtor default gerado pelo sistema:
CREATE FUNCTION rational() RETURNS rational Overloadable: qualquer número de
construtores definidos pelo usuário: CREATE FUNCTION rational(numer,denom)
RETURNS rational CREATE FUNCTION rational(denom)
RETURNS rational
Exemplo// Ponto em coordenadas polares que pode retornar coordenadas cartesianasCREATE TYPE ponto AS (
rho REAL,theta REAL, … ) NOT FINAL
METHOD x_coord ( ) RETURNS REALMETHOD y_coord ( ) RETURNS REALCREATE INSTANCE METHOD x_coord ( )
RETUNRS REAL FOR pontoRETURN cos(SELF*theta)*SELF*rho
CREATE INSTANCE METHOD y_coord( ) RETURNS REAL FOR pontoRETURN sin(SELF.theta)*SELF.rho
Sintaxe Tipo estruturado
CREATE TYPE name[ UNDER supertype-name ]AS ( attrib-name type,... )[ [ NOT ] INSTANTIABLE ][ NOT ] FINAL[ REF ref-options ][ method-spec,... ]
Sintaxe Tipo estruturado REF ref-options =>
User-defined:REF USING predefined-type
[ ref-cast-option ] Derived:REF ( attrib-name, ... ) System-generated:REF IS SYSTEM GENERATED
Sintaxe Tipo estruturado method-spec => Método original:
[ INSTANCE | STATIC ] METHOD name ( param-name type,... ) RETURNS type
Método sobrescrito:OVERRIDING original-method
Remoção de um UDT
DROP TYPE nome <CASCADE|RESCRICT>
Alterando um UDT
<alter type> ::= ALTER TYPE <nome> <action><action> ::= ADD ATTRIBUTE <definition> |
DROP ATTRIBUTE <nome> RESTRICT | ADD <method specification> | DROP <method specification>
Herança de Tipos Permite a
especialização dos tipos existentes
“Subtype” & “Supertype”
Herança Subtype herda tudo do supertype SQL:1999 dá suporte apenas a herança
simples Na definição de subtype:
Novos atributos podem ser adicionados Novos métodos podem ser adicionados Métodos podem ser sobrescritos
Herança Obs.:
Pode-se definir UDT contendo atributos cujos tipos são supertipos do tipo definido!
Não pode definir UDT cujos atributos contenham o tipo do próprio tipo que está sendo definido (recursivo)
Não pode definir UDT contendo atributos com tipos de subtipos que ainda vão ser definidos!
Herança: Substitutability Na herança usa-se o conceito de “most specific
type” numa hierarquia de tipos O princípio da Substitutability diz respeito a
habilidade de prover uma instância de um subtipo em qualquer local onde uma instância de um supertipo é esperada.
Ex.: DECLARE p Pessoa; SET p = NEW Empregado (…);
OBS.: o inverso não é válido!
HerançaCREATE TYPE emp UNDER person
( salary DECIMAL(6,2), dept department ) METHOD give_raise(...)..., OVERRIDING METHOD address(...)...;
Herança Tipo declarado:CREATE TYPE department (
dept_name CHARACTER(30),manager employee, ...)
Tipo mais específicoDECLARE VARIABLE x department;SET x.manager = executive('Oliveira',...);
UDT: Valores e não instâncias! Os tipos estruturados possuem valores e não
instâncias!!!!! Razão: não há OID, que só ocorrerá no
repositório que são as tabelas tipadas (vistas mais à frente!)
UDT: Valores e não instâncias!
Ex.: BEGIN
DECLARE v1, v2 Filme;SET v1 = NEW Filme (‘Shrek’, ‘blá blá blá’, 118);SET v2 = v1;SET v1 = v1.duracao(135);
END
User Defined Constructors(Inicializadores) SQL:1999 dá suporte a métodos construtores
(inicializadores) definidos pelo usuário Podem existir vários destes construtores, com
mesmo nome do construtor provido pelo sistema, com lista de parâmetros diferente para cada construtor.
Só podem ser invocados através da keyword NEW
Tais construtores devem ter SELF como retorno.
User Defined Constructors(Inicializadores) Ex.:CREATE METHOD filme (nome varchar (50), descr
varchar (500), dur int) RETURNS filmeBEGIN
SET SELF.titulo= nome;SET SELF.descricao = descr;SET SELF.duracao = dur;RETURN SELF;
END;
User Defined Constructors(Inicializadores)
BEGINDECLARE f filme;SET f =
NEW filme (‘Shrek’, ‘blá blá blá’, 135);…
END;
User Defined Constructors(Inicializadores)
Exemplo anterior usando o construtor definido pelo sistema
BEGINDECLARE f filme;SET f = NEW filme
SET f.titulo= ‘Shrek’; SET f.duracao = 135;
END; -- decrição contém valor null
Inserindo dados
INSERT INTO tb_Filmes VALUES(‘1203’, -- código do filme
NEW Filme (‘Gone with the Wind’, ‘blá blá blá’,128), -- instância de Filme
2.99); -- preço aluguel
Inserindo dados
Mesma inserção anterior usando uma variávelINSERT INTO tb_Filmes VALUES(
‘1203’, -- código do filme f, -- instância de Filme 2.99); -- preço aluguel
Atualizando dados
1. Atualizando o valor do aluguel de um filme particular
UPDATE tb_FilmeSET aluguel = 1.99WHERE codigo = 1234;
Atualizando dados
2. Atualizando um filme sem todos os dados
UPDATE tb_FilmeSET info = NEW Filme (‘’, ‘’, 228)WHERE codigo = 1234;
Atualizando dados
UPDATE tb_FilmeSET info = NEW Filme (info.titulo,
info.descricao, 228)WHERE codigo = 1234;
Atualizando dados
Mesmo que o exemplo anterior, de forma mais simples:
UPDATE tb_FilmeSET info = info.descricao(113)WHERE codigo = 1234;
Atualizando dados
Mesmo que o exemplo anterior, de forma mais simples:
UPDATE tb_FilmeSET info.descricao= 113WHERE codigo = 1234;
Recuperando Dados
SELECT mt.info.descricaoINTO :variavel_hostFROM tb_filmesWHERE mt.codigo = 1234;
User Defined CAST (1)Ex.: CREATE FUNCTION filme_to_char(meuFilme Filme)
RETURNS CHAR(610)BEGIN
DECLARE n CHAR(100), d CHAR(500), t CHAR(10), retorno CHAR(610);
SET n = meuFilme.titulo;SET d = meuFilme.descricao;SET t = CAST( meuFilme.duracao AS CHAR(10));RETURN n || d || t;
END
User Defined CAST (2)
CREATE CAST (filme AS CHAR(610)) WITH filme_to_char;
SELECT CAST (filme AS CHAR(610))INTO :variavel_FilmeFROM tb_FilmesWHERE cod = 1234;
Comparação de UDT Há a comparação default de UDT, que compara campo a campo Pode-se também criar uma semântica de comparação para o
UDT Usa-se o comando:CREATE ORDERING FOR <nome do tipo>
EQUALS ONLY BY <categoria> | ORDER FULL by <categoria>
<categoria> ::= RELATIVE WITH <especificação de função | MAP WITH <especificação de função de mapeamento] |
STATE [<nome específico>] | RELATIVE WITH COMPARABLE INTERFACE
Comparação de UDT Comparação STATE
Você pode instruir o sistema para fazer comparações baseadas em valores de atributos.
Usa expressão de igualdade, retornando um Boolean. É a comparação default, campo a campo.
Ex.CREATE ORDERING FOR Filme
EQUALS ONLY BY STATE;
Comparação de UDT Comparação MAP
Mapear dois tipos estruturados para algum tipo embutido do SQL, e dai fazer a comparação com o resultado deste mapeamento.
Este mapeamento é feito com uma map function, que é invocada automaticamente
Ex.CREATE ORDERING FOR Filme
ORDER FULL BY MAP WITH FUNCTION filme_mapping(filme);
Comparação de UDT Comparação MAP (cont.)CREATE FUNCTION filmeMapping( f filme)
RETURNS INTEGERRETURN length(f.titulo)+f.duracao;
Comparação de UDT Comparação Relative
Comparação usando o resultado retornado por uma relative function, que retorna: -1: o primeiro tipo é menor do que o segundo 0: os dois tipos são iguais +1: o primeiro tipo tem valor maior do que o segundo
Pode-se especificar para o supertipo e os subtipos herdam
Comparação de UDT Comparação Relative
Ex.:CREATE ORDERING FOR Filme
ORDER FULL BY RELATIVE WITHFUNCTION filme_comp(filme, filme);
CREATE FUNCTION filme_comp (f1 filme, f2 filme)RETURNS INTEGER
IF ( … ) – condição da aplicaçãoTHEN RETURN -1
ELSEIF ( …)THEN RETURN 0
ELSE RETURN 1END IF;
Comparação de UDT Remover um User Defined Comparison:
DROP ORDERING FOR <nome do tipo>
Type predicate Usado para se saber o tipo de um
determinado variável. Ex.: determinar de o que está armazenado
na coluna pes é um empregadopes IS OF (Empregado)
pes IS OF (ONLY PESSOA) – sem subtipo
Segurança de UDT Em SQL:1999 não há public, protected, private A restrição de acesso é via privilégios Tais privilégios são dados com comando
GRANT e podem ter WITH GRANT OPTION Privilégios:
USAGE: permite o tipo ser usado (colunas, rotinas) UNDER: permite subtipos do tipo em questão serem
definidos EXECUTE: permite usuários executarem um dado
método
Segurança de UDT Exemplo:
GRANT EXECUTE ON INSTANCE METHOD ano_lancamento( ) FOR filme TO PUBLIC;
Tabelas tipadas Instâncias do tipo são linhas de uma tabela Comporta-se como objetos: CREATE TABLE rationals OF rational REF IS
id_col ref-option Cria uma tabela base com uma coluna poratributo, mais uma coluna “self-referencing” Esta coluna “self-referencing” contém em cada
linha um valor que identifica univocamente a linha
Tabelas tipadas Ex. 2:CREATE TABLE movie (
title varchar (100).desc varchar(500),runs integer)
NOT FINAL
Tabelas tipadas Uma tabela tipada é uma tabela ordinária! Pode-se inserir, remover, alterar e consultar as
linhas da tabela usando SQL Pode-se definir constraints e triggers Obs.: o uso de NEW visto anteriormente, não causa
uma instância ser armazenada numa tabela. Por que não?
Podem existir várias tabelas tipadas associadas a um dado UDT
Pode-se criar valores de tipos que não são persistidos em linhas de uma tabela tipada (como vimos!)
Tabelas Tipadas Colunas “Self-referencing”:
Espécie de OID Seu valor é único globalmente, ou seja, não haverá
duas linhas numa tabela com valor igual da coluna “self-referencing”
As aplicações podem usar os valore das colunas self-referencing como uma espécie de ponteiros para as linhas contendo os valores nas tabelas tipadas. Por isso, alguns chamam typed tables de referenced
tables
Hierarquias de Tabelas Pode-se definir uma tabela com sendo sub-
tabela de uma outra, chamada super-tabela Só pode criar hierarquias de tabelas tipadas Deve haver correspondência às hierarquias de
tipo Supertable deve ser “of” supertype Subtable deve ser “of” subtype
Ou seja os relacionamentos entre as subtabelas e respectivos subtipos devem ser 1 para 1.
Hierarquias de Tabelas Entretanto, a hierarquia completa de tabelas
não precisa ter um relacionamento com a hierarquia completa de tipos
Ex. Hierarchia de tableas Movie
Movie
VHS Tape DVD BlueRay
Dolby Digital Sound
DTS Sound
Hierarquias de Tabelas Hierarquia de Tabelas para Apenas DVD
DVD
Dolby Digital Sound
DTS Sound
Hierarquias de Tabelas Hierarquia de Tabelas sem diferenciação de
som
Movie
VHS Tape DVD BlueRay
Hierarquias de Tabelas Hierarquia de Tabelas Inválida!
Movie
VHS Tape BlueRay
Dolby Digital Sound
DTS Sound
Definindo Tabelas Tipadas<table definition> :: =
CREATE TABLE <table name>OF <UDT name>[<subtable clause>][ <table element list> ]
<subtable clause> ::= UNDER <supertable clause>
<supertable clause> ::= <table name>
Definindo Tabelas Tipadas
<table element list> ::=( <table element> [ {, <table element>} … ] )
<table element> ::= <table constraint definition> |<self-referencing column specification>
| < column options >
Definindo Tabelas Tipadas OBS: Pode-se especificar o nome de uma tabela
de uma única super-tabela (herança simples) O nome da tabela na cláusula da sub-tabela
dever ser um nome de uma tabela tipada! Os nomes do atributos da tabela não podem ser
iguais aos herdados Não se pode definir colunas arbitrárias (for a do
UDT) dentro de uma tabela tipada, apenas as que compõem o UDT + self-referencing column
Definindo Tabelas Tipadas Obs.:
NÃO é permitido especificar PRIMARY KEY constraint num subtabela.
Uma coluna self-referencing NÃO pode ser especificada na definição de uma sub-tabela, mas deve ser especificada na super-tabela máxima (raiz)
Definindo Tabelas Tipadas<self-referencing column specification> ::= REF IS <column name> <reference
generation>
<reference generation> ::= SYSTEM GENERATED
| USER GENERATED| DERIVED
Definindo Tabelas Tipadas
<column option> ::=<column name> WITH OPTIONS <column option list>
<column option list> ::=[<scope clause>][<default clause>][<column constraint definition> …]
Definindo Tabelas Tipadas
[<scope clause>]: se a coluna é do tipo REF, então pode-se especificar o nome da tabela tipada para o UDT associado[<default clause>]: permite definir valores default para uma coluna[<column constraint definition> …]: permite definir constraints como NOT NULL, CHECK, etc.
Definindo Tabelas Tipadas
CREATE TYPE movie AS (title varchar(100),desc varchar(500),runs integer)
INSTANTIABLENOT FINALREF IS SYSTEM GENERATED
Definindo Tabelas Tipadas
CREATE TYPE dvd UNDER movie AS (stock_number INTEGER,rentavarchar(500),extra_features feature_desc)
INSTANTIABLENOT FINAL
Definindo Tabelas Tipadas
CREATE TABLE short_movies OF movie( REF IS movie_id SYSTEM GENERATED, runs WITH OPTIONS CONSTRAINT short_movie_check_runs
CHECK (runs < 90) )
Definindo Tabelas Tipadas
CREATE TABLE short_dvds OF dvdUNDER short_movies( rental_price WITH OPTIONS CONSTRAINT short_dvds_check_price
CHECK (price < 1.99) )
Definindo Tabelas TipadasHá um relacionamento 1 para 1 entre a
especificação do reference type (no UDT) e o type generation (na tabela tipada)
Obs.: quando se escolhe user-generated para um UDT, é responsabilidade da aplicação escolher o valor armazenado na coluna self-referencing de cada linha inserida na tabela tipada.
<reference type specification> <reference generation>
REF USING <tipo predefinido (built in)> USER GENERATED
REF FROM <lista de atributos> DERIVED
REF IS SYSTEM GENERATED SYSTEM GENERATED
Reference types Permite uma variável referenciar uma outra Apenas instâncias de tipos estruturados podem ser
referenciados Referencia um valor de uma row/instance
explicitamente representado numa linha Sintaxe:
<reference type> ::=REF ( <UDT> ) [<scope clause>]
<scope clause> ::= SCOPE <table name>
Reference types O SCOPE pode ter um check (espécie de
integridade referencial)<reference scope check ::=
REFERENCES ARE [NOT] CHECKED[ON DELETE <referential action>]
<referential action> ::=RESTRICT | SET NULL | SET DEFAULT | NO ACTION
Default: NO ACTION
Consultas em Tabelas Tipadas Recupere os DVD’s “Rose”:SELECT title, runsFROM short_dvdsWHERE title LIKE ‘%Rose%’
Consultas em Tabelas Tipadas Recupere filmes de curtíssima duração:SELECT title, runsFROM short_moviesWHERE runs < 60
Consultas em Tabelas Tipadas Recupere filmes de curtíssima duração não
em DVD:SELECT title, runsFROM ONLY (short_movies)WHERE runs < 60
Consultas em Tabelas Tipadas Usando REFsCREATE TYPE movie AS (
title varchar(100),desc varchar(500),runs integer)INSTANTIABLE
NOT FINALREF IS SYSTEM GENERATEDINSTANCE METHOD rating () RETURNS DECIMAL(2,1)
Consultas em Tabelas Tipadas Usando REFs
CREATE TYPE player AS (player_name name,role_played name,film REF (movie) )INSTANTIABLE
NOT FINALREF IS SYSTEM GENERATED
Consultas em Tabelas Tipadas Usando REFs
CREATE TABLE movies OF movie(REF IS movie_id SYSTEM GENERATED)
CREATE TABLE actors OF player(REF IS actor_id SYSTEM GENERATED,film WITH OPTIONS SCOPE movies)
Consultas em Tabelas Tipadas Usando REFs
SELECT film -> runsFROM actorsWHERE player_name = ‘Peter Sellers’ AND role_played = ‘Merkin Muffley’
Consultas em Tabelas Tipadas Usando REFs
SELECT film -> ratings ( )FROM actorsWHERE player_name = ‘Peter Sellers’ AND role_played = ‘Merkin Muffley’
Consultas em Tabelas Tipadas Usando REFs
SELECT DEREF (film)FROM actorsWHERE player_name = ‘Peter Sellers’ AND role_played = ‘Merkin Muffley’
Inserção em Tabelas Tipadas Criando uma nova instância de dvd na tabela
short_dvdsINSERT into short_dvds (title, desc, runs,
stock_number, rental_price)VALUES (‘The Next Game’, ‘blá blá blá’, 48,61992, 0.49)
Remoção em Tabelas Tipadas Removendo de todas as tabelas na
hierarquia
DELETE from short_moviesWHERE title LIKE ‘%dead%’
Remoção em Tabelas Tipadas Removendo apenas de uma tabela
específica e suas supertables
DELETE from ONLY short_moviesWHERE title = ‘The Lunch Lady’
Atualização em Tabelas Tipadas Atualizando uma linha numa hierarquia
UPDATE short_moviesSET title = ‘The Lunch Lady’WHERE title = ‘The Cafeteria Lady’
Atualização em Tabelas Tipadas Atualizando apenas numa tabela específica e
suas supertables
UPDATE ONLY (short_movies)SET title = ‘The Lunch Lady’WHERE title = ‘The Cafeteria Lady’
Typed Views Também conhecidas como Referenceable Views ou
Object Views Os dados visíveis na view correspondem a linhas
nas tabelas tipadas. Pode-se ter herança simples de views: superview &
subview
Typed Views<view definition> ::=
CREATE VIEW <table name>OF < UDT name>[<subview clause> ][<view element list> ]AS <query expression>[WITH [ <levels clause> CHECK OPTION]
<subview clause>::= UNDER <table name>
<view element list> ::= ( <view element> [{,<view element>} …]
<view element> ::= <self-referencing column specification>| <view column option>
<view column option> ::= <column name> WITH OPTIONS <scope clause>
Typed Views Obs.:
WITH CHECK OPTION Usada para Views que podem ser atualizadas: update, delete e insert.
Exemplo:CREATE VIEW cheap_movies AS
SELECT title, price FROM movies WHERE price < 1
WITH CHECK OPTION;
Assim, o seguinte Update seria rejeitado:UPDATE cheap_moviesSET price = 15WHERE title = ‘The Wedding Singer’;
Typed Views Exemplo:CREATE VIEW short_movies_with_long_titles
OF movie (REF IS movie_id DERIVED)AS SELECT title, desc, runs
FROM ONLY (short_movies)WHERE char_length (title) > 75
CREATE VIEW short_DVDs_with_long_titlesOF dvdUNDER short_movies_with_long_titlesAS SELECT title, desc, runs, stock_number, rental_price FROM ONLY (short_dvds)
WHERE char_length(title) > 75
Tabelas Tipadas e Privilégios Privilégio USAGE: é requerido para se poder usar
um tipo numa aplicação ou BD. Se está invocando um método num valor de TAD
que é armazenado numa coluna de um tipo de uma tabela ordinária (não tipada), é necessário ter o privilégio SELECT
Se o método é um mutator, deve também ter o privilégio UPDATE
Também é necessário ter o privilégio EXECUTE em todos os métodos invocados
Privilégio UNDER: para permitir especificar sub-tabelas, sub-tipos ou sub-views.
Rotinas SQL Falamos em aula anterior que existem três tipos
de rotinas em SQL: Procedures: chamadas através de CALL e com
parâmetroe IN, OUT e INOUT; ligadas a um esquema Funções: chamadas diretamente através de notação
funcional f(a), com parâmetros de IN e retorno, e ligadas a um esquema
Métodos: chamados diretamente através de notação de ponto f.a, com parâmetros de entrada e retorno, ligados a um UDT
Rotinas SQL Uma rotina SQL é uma rotina que é invocada
através de um comando SQL. Pode ser escrita em SQL ou em outra linguagem,
neste caso chamado de external routine O padrão SQL:1999 provê especificação para 9
LP: Java, C, Ada, Cobol, Fortran, M (antiga Mumps), Pascal e PL/I.
Uma rotina externa é armazenada num arquivo fora do SGBD.
Rotinas SQL Razões para considerar o uso de rotinas externas:
Pode-se já ter um número de rotinas escritas em alguma LP. Por exemplo, um pacote estatístico
Poucos SGBD implementam SQL/PSM, usando, ao invés, uma linguagem proprietária, por exemplo, Oracle PL-SQL, MS Transact-SQL que não são interoperáveis
Também pode-se requerer uma certa funcionalidade que é computacionalmente intensiva,. Por exemplo, análise de séries temporais diárias, semanais, mensais, e semestrais com relatórios de vendas de DVDs.
Rotinas externas são geralmente capazes de acessar serviços providos de baixo nível do SO, como sistemas de arquivo, gerência de memória, etc.
Rotinas SQL Desvantagens de Rotinas Externas:
Impedance mismatch (menor em Java) A criação de novas sessões para execução de
rotinas externas pode ser custoso, impactando no desempenho (context switching overhead)
Treinamento em dois ambientes: SQL e outra LP
Invocação de Rotinas Envolve um número de passos:
Análise sintática Execução runtime
Overloading Overrriding
Rotinas SQL Potencial das Rotinas SQL:
Triggers podem invocar procedimentos que: Enviam email Imprimem documentos Ativa um equipamento robótico para recuperar um
determinado dado
Invocação de Procedures São chamadas através do comando SQL:
CALL Parâmetros são passados e retornados Podem ser overloaded, mas não overriden Estranhamente não é permitido, por
exemplo: transmit (integer) e transmit (real),
Invocação de Procedures Algoritmo:
Todas as rotinas do nome invocado são identificadas. Todas as rotinas contidas em esquemas que não são parte do corrente SQL-path são eliminadas
Todas as rotinas restantes que são funções ou métodos são eliminados
Os procedures restantes para os quais o invocador não possui o privilégio EXECUTE são eliminados
Todos procedimentos cujos número de parâmetros não é igual ao número de argumentos na chamada CALL são eliminados
Se existem duas ou mais procedures restantes, então o algoritmo seleciona aquela que está contida no esquema que apareçe mais cedo no SQL-path.
Ex. de Criação e invocação de procedureCREATE PROCEDURE sendmail (
IN to varchar(32), IN subj varchar(100),IN prio smallint,OUT status integer)
LANGUAGE CPARAMETER STYLE GENERALSPECIFIC sendmail_cDETERMINISTICNO SQLDYNAMIC RESULT SET 0EXTERNAL NAME ‘usr/musicshop/bin/mailPackage/send1’
EXTERNAL SECURITY DEFINER
Ex. De Criação e invocação de procedure
CREATE PROCEDURE sendmail (IN to varchar(32), IN subj varchar(100),OUT status integer)
LANGUAGE CEXTERNAL NAME
‘usr/musicshop/bin/mailPackage/send2’EXTERNAL SECURITY DEFINER
Ex. De Criação e invocação de procedure
CALL sendmail (‘[email protected]’, ‘Exciting sale for web customers only!’, 1, :mailStatus);
CALL sendmail (‘[email protected]’, ‘Exciting sale for web customers only!’, :mailStatus);
Invocação de Função São um pouco mais complexas do que
invocações de procedures Quando existem várias funções com o
mesmo nome, SQL usa vários critérios para escolher a função que irá escolher para ser executada.
Invocação de Função Algoritmo
Todas as rotinas com o nome são identificadas. As que estiverem em esquemas que não são parte do corrente SQL-path são eliminadas
Todas as rotinas remanescentes que são procedures ou métodos são eliminados
As funções restantes, cujo número de parâmetros não é igual ao número de argumentos na função invocada são eliminadas
Para cada função restante, o tipo de dados de cada parâmetro é checado contra o tipo do respectivo argumento; caso não casem a função é eliminada
Se existem duas ou mais funções restantes para executar, então o algoritmo seleciona aquela que aparece mais cedo no SQL-path
Ex. de Função
CREATE FUNCTION ratio ( IN title_param VARCHAR(100),IN length_param INTEGER)RETURNS REALLANGUAGE SQL;
Exemplo de invocação de função
SELECT mt.info.titulo, mt.info.length, ratio (mt.info.titulo, mt.info.length)FROM TB_Filme as mtWHERE mt.info.titulo = ‘TITANIC’
OBS.: notem o uso da notação funcional na chamada da função ratio( ) e da notação de ponto no observer titulo( )
Invocação de Método de Instância Chamada a métodos difere de chamada à
funções: Métodos podem ser overloadable e overriden O SQL-path não é usado para resolução de
método
Invocação de Método de Instância ExemploSELECT mt.info.duraçãoHoras( )FROM TB_Filme mtWHERE mt.info.titulo = ‘The Matrix’
Exemplo de overridingCREATE TYPE dvd UNDER movie AS (
stock_number integer,rental_price decimal(5,2),extra_features feature)
INSTANTIABLENOT FINAL;CREATE TYPE dolby_dvd UNDER dvd AS (
alt_language BOOLEAN)INSTANTIABLENOT FINAL;OVERRIDING METHOD length_interval ( )
RETURNS INTERVAL HOUR(2) TO MINUTE;CREATE INSTANCE METHOD length_interval( )
RETURNS INTERVAL HOUR(2) TO MINUTE FOR dolby_dvdRETURN CAST (CAST (SELF.runs AS INTERVAL MINUTE(4) ) +
INTERVAL ‘10’ MINUTE(4)AS INTERVAL HOUR(2) TO MINUTE);
Exemplo de overridingDECLARE dvd1, dvd2 dvd;DECLARE len1, len2, len3, len4 INTERVAL HOUR TO MINUTE;DECLARE lang1, lang3 BOOLEAN;SET dvd1 = NEW dvd (‘Seven’, ‘… a serial killer …’, 123, 299, 1.89, ‘bla’);SET dvd2 = NEW dolby_dvd (‘Seven’, ‘… a serial killer …’, 123, 299, 1.89, ‘bla’, TRUE);SET len1= dvd1.lenght_interval; -- invoca método de dvdSET len2 = dvd2.lenght_interval; -- invoca método overriden de dolby_dvdSET len3 = (dvd1 AS dvd).lenght_interval; -- igual a len1SET len4 = (dvd2 as dvd).lenght_interval; -- invoca método de dvdSET lang1 = dvd1.alt_language; -- erroSET lang2 = (dvd1 AS dolby_dvd).alt_language; -- erro dvd1 ÍS NOT dolby_dvd