Modelo de Dados Objeto-Relacional Banco de Dados II – 2009.2 Bacharelado em Ciência da Computação UFCG Prof. 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-Relacional Modelos 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 Dados Objeto-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 Desenvolvimento de aplicações simplificado Aumenta indefinidamente o conjunto de tipos e funções fornecidas pelo SGBD 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 para Bancos 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 ODBC 3.0 features Cerca de 400 páginas Part 4: SQL/PSM PSM-96 especificou: PSM-99 specifica: functions & procedures SQL-server modules computational completeness 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 nome FROM Pessoas WHERE calca > veste; Distinct Types Uso correto: SELECT nome FROM Pessoas WHERE CAST(calca TO INTEGER) > CAST(veste TO INTEGER); Distinct Types Uso incorreto: SELECT nome, calca + 20 FROM Pessoas WHERE veste > 7; Distinct Types Uso correto: SELECT nome, CAST (calca TO INTEGER) + 20 FROM Pessoas WHERE 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étodos Característica Função Método Ligado 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 FINAL METHOD 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 mt WHERE 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 usase 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 cartesianas CREATE TYPE ponto AS ( rho REAL, theta REAL, … ) NOT FINAL METHOD x_coord ( ) RETURNS REAL METHOD y_coord ( ) RETURNS REAL CREATE INSTANCE METHOD x_coord ( ) RETUNRS REAL FOR ponto RETURN cos(SELF*theta)*SELF*rho CREATE INSTANCE METHOD y_coord( ) RETURNS REAL FOR ponto RETURN 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 ( paramname 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ça CREATE 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ífico DECLARE 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 filme BEGIN SET SELF.titulo= nome; SET SELF.descricao = descr; SET SELF.duracao = dur; RETURN SELF; END; User Defined Constructors(Inicializadores) BEGIN DECLARE f filme; SET f = NEW filme (‘Shrek’, ‘blá blá blá’, 135); … END; User Defined Constructors(Inicializadores) Exemplo anterior usando o construtor definido pelo sistema BEGIN DECLARE 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ável INSERT 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_Filme SET aluguel = 1.99 WHERE codigo = 1234; Atualizando dados 2. Atualizando um filme sem todos os dados UPDATE tb_Filme SET info = NEW Filme (‘’, ‘’, 228) WHERE codigo = 1234; Atualizando dados UPDATE tb_Filme SET info = NEW Filme (info.titulo, info.descricao, 228) WHERE codigo = 1234; Atualizando dados Mesmo que o exemplo anterior, de forma mais simples: UPDATE tb_Filme SET info = info.descricao(113) WHERE codigo = 1234; Atualizando dados Mesmo que o exemplo anterior, de forma mais simples: UPDATE tb_Filme SET info.descricao= 113 WHERE codigo = 1234; Recuperando Dados SELECT mt.info.descricao INTO :variavel_host FROM tb_filmes WHERE 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_Filme FROM tb_Filmes WHERE 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 INTEGER RETURN 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 WITH FUNCTION filme_comp(filme, filme); CREATE FUNCTION filme_comp (f1 filme, f2 filme) RETURNS INTEGER IF ( … ) – condição da aplicação THEN RETURN -1 ELSEIF ( …) THEN RETURN 0 ELSE RETURN 1 END 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 empregado pes 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 por atributo, 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 subtabela 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 Movie Ex. Hierarchia de tableas Movie VHS Tape Dolby Digital Sound DVD DTS Sound BlueRay 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 Dolby Digital Sound BlueRay 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) INSTANTIABLE NOT FINAL REF IS SYSTEM GENERATED Definindo Tabelas Tipadas CREATE TYPE dvd UNDER movie AS ( stock_number INTEGER, renta varchar(500), extra_features feature_desc) INSTANTIABLE NOT 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 dvd UNDER short_movies ( rental_price WITH OPTIONS CONSTRAINT short_dvds_check_price CHECK (price < 1.99) ) Definindo Tabelas Tipadas Há um relacionamento 1 para 1 entre a especificação do reference type (no UDT) e o type generation (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 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 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, runs FROM short_dvds WHERE title LIKE ‘%Rose%’ Consultas em Tabelas Tipadas Recupere filmes de curtíssima duração: SELECT title, runs FROM short_movies WHERE runs < 60 Consultas em Tabelas Tipadas Recupere filmes de curtíssima duração não em DVD: SELECT title, runs FROM ONLY (short_movies) WHERE runs < 60 Consultas em Tabelas Tipadas Usando REFs CREATE TYPE movie AS ( title varchar(100), desc varchar(500), runs integer) INSTANTIABLE NOT FINAL REF IS SYSTEM GENERATED INSTANCE 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 FINAL REF 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 -> runs FROM actors WHERE player_name = ‘Peter Sellers’ AND role_played = ‘Merkin Muffley’ Consultas em Tabelas Tipadas Usando REFs SELECT film -> ratings ( ) FROM actors WHERE player_name = ‘Peter Sellers’ AND role_played = ‘Merkin Muffley’ Consultas em Tabelas Tipadas Usando REFs SELECT DEREF (film) FROM actors WHERE player_name = ‘Peter Sellers’ AND role_played = ‘Merkin Muffley’ Inserção em Tabelas Tipadas Criando uma nova instância de dvd na tabela short_dvds INSERT 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_movies WHERE title LIKE ‘%dead%’ Remoção em Tabelas Tipadas Removendo apenas de uma tabela específica e suas supertables DELETE from ONLY short_movies WHERE title = ‘The Lunch Lady’ Atualização em Tabelas Tipadas Atualizando uma linha numa hierarquia UPDATE short_movies SET 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_movies SET price = 15 WHERE 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_titles OF dvd UNDER short_movies_with_long_titles AS 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 subtabelas, 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 procedure CREATE PROCEDURE sendmail ( IN to varchar(32), IN subj varchar(100), IN prio smallint, OUT status integer) LANGUAGE C PARAMETER STYLE GENERAL SPECIFIC sendmail_c DETERMINISTIC NO SQL DYNAMIC RESULT SET 0 EXTERNAL 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 C EXTERNAL 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 SQLpath 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 SQLpath Ex. de Função CREATE FUNCTION ratio ( IN title_param VARCHAR(100), IN length_param INTEGER) RETURNS REAL LANGUAGE 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 mt WHERE 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 Exemplo SELECT mt.info.duraçãoHoras( ) FROM TB_Filme mt WHERE mt.info.titulo = ‘The Matrix’ Exemplo de overriding CREATE TYPE dvd UNDER movie AS ( stock_number integer, rental_price decimal(5,2), extra_features feature) INSTANTIABLE NOT FINAL; CREATE TYPE dolby_dvd UNDER dvd AS ( alt_language BOOLEAN) INSTANTIABLE NOT FINAL; OVERRIDING METHOD length_interval ( ) RETURNS INTERVAL HOUR(2) TO MINUTE; CREATE INSTANCE METHOD length_interval( ) RETURNS INTERVAL HOUR(2) TO MINUTE FOR dolby_dvd RETURN CAST (CAST (SELF.runs AS INTERVAL MINUTE(4) ) + INTERVAL ‘10’ MINUTE(4) AS INTERVAL HOUR(2) TO MINUTE); Exemplo de overriding DECLARE 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 dvd SET len2 = dvd2.lenght_interval; -- invoca método overriden de dolby_dvd SET len3 = (dvd1 AS dvd).lenght_interval; -- igual a len1 SET len4 = (dvd2 as dvd).lenght_interval; -- invoca método de dvd SET lang1 = dvd1.alt_language; -- erro SET lang2 = (dvd1 AS dolby_dvd).alt_language; -- erro dvd1 ÍS NOT dolby_dvd