aula9

download aula9

of 61

description

fuerza flivre

Transcript of aula9

  • Silberschatz, Korth and Sudarshan (modificado)!1!Database System Concepts!

    Captulo 4: SQL!

    Linguagem de Definio de Dados" Estrutura bsica" Operaes com conjuntos" Funes de agregao" Valores nulos" Subconsultas embutidas" Relaes derivadas" Junes" Vistas" Modificao da Base de Dados" SQL Recursivo" Embedded SQL" Dynamic SQL" Funes e Procedimentos"

  • Silberschatz, Korth and Sudarshan (modificado)!2!Database System Concepts!

    Operaes de Juno! As operaes de juno retornam uma relao como resultado

    da combinao de duas outras relaes." Estas operaes adicionais so utilizadas habitualmente em

    subconsultas na clusula from" Condio de juno define quais os tuplos que so

    combinados nas duas relaes, assim como quais os atributos que aparecem no resultado da juno."

    Tipo de juno define como tratar os tuplos que no esto relacionados entre si (basedados na condio de juno)."

    Tipos de Juno"inner join!left outer join!right outer join!full outer join!

    Condies de Juno"natural!on "using (A1, A2, ..., An)"!

  • Silberschatz, Korth and Sudarshan (modificado)!3!Database System Concepts!

    Operaes de Juno!

    obrigatria a utilizao de uma condio de juno nos junes de tipo outer. opcional no inner join (na ausncia, comporta-se como o produto cartesiano)!

    A condio natural aparece antes do tipo de juno (por exemplo natural inner join). As restantes condies aparecem aps o tipo de juno."

    Nas junes com condio natural, primeiro aparecem os atributos comuns a ambas as relaes, na ordem pela qual aparecem na relao do lado esquerdo. Depois, aparecem os restantes atributos da relao do lado esquerdo, seguidos dos restantes atributos da relao do lado direito."

    Nas junes com condio using (A1, A2, ..., An), primeiro aparecem os atributos A1, A2, ..., An. Depois, aparecem os restantes atributos da relao do lado esquerdo, seguidos dos restantes atributos da relao do lado direito."

    Tipos de Juno"inner join!left outer join!right outer join!full outer join!

    Condies de Juno"natural!on "using (A1, A2, ..., An)"!

  • Silberschatz, Korth and Sudarshan (modificado)!4!Database System Concepts!

    Juno versus Produto Cartesiano! Listar o nome, nmero de emprstimo e montante de todos os clientes

    que efectuaram um emprstimo na agncia de Perryridge."select borrower.*, amount"from borrower, loan "where borrower.loan_number = loan.loan_number and

    branch_name = Perryridge" Versus"

    " "select * "from borrower natural inner join loan "where branch_name = Perryridge"

    A ltima separa claramente onde se coloca a origem dos dados de onde se colocam as condies de filtragem (seleco)" Esta separao no s torna a leitura mais fcil, como pode ser aproveitada

    para implementaes." Na ltima consulta no se pode colocar borrower.* aps o select pois

    deixa de ser possvel utilizar o nome da tabela nas colunas usadas para fazer a juno natural (isto , as comuns a ambas as tabelas)"

    "

  • Silberschatz, Korth and Sudarshan (modificado)!5!Database System Concepts!

    Relaes de Exemplo! Relao loan"

    Relao borrower"customer_name" loan_number "

    Jones"Smith"Hayes"

    L-170"L-230"L-155

    amount"3000"4000"1700"

    branch_name"

    Downtown"Redwood"Perryridge"

    loan_number"

    L-170 "L-230"L-260"

  • Silberschatz, Korth and Sudarshan (modificado)!6!Database System Concepts!

    Exemplos !

    select * from loan inner join borrower onloan.loan_number = borrower.loan_number"

    select * from loan left outer join borrower onloan.loan_number = borrower.loan_number"

    branch_name" amount"

    Downtown"Redwood"

    3000"4000"

    customer_name" b.loan_number "

    Jones"Smith"

    L-170"L-230"

    l.loan_number "

    L-170"L-230"

    branch_name" amount"

    Downtown"Redwood"Perryridge"

    3000"4000"1700"

    customer_name" b.loan_number "

    Jones"Smith"null"

    L-170"L-230"null

    l.loan_number "L-170"L-230"L-260

    customer_name" loan_number "

    Jones"Smith"Hayes"

    L-170"L-230"L-155

    amount"

    3000"4000"1700"

    branch_name"

    Downtown"Redwood"Perryridge"

    loan_number"

    L-170 "L-230"L-260"

  • Silberschatz, Korth and Sudarshan (modificado)!7!Database System Concepts!

    Exemplos!

    select * from loan natural inner join borrower"

    select * from loan natural right outer join borrower"

    branch_name" amount"

    Downtown"Redwood"

    3000"4000"

    customer_name"

    Jones"Smith"

    loan_number "

    L-170"L-230"

    branch_name" amount"

    Downtown"Redwood"null "

    3000"4000"null"

    customer_name"

    Jones"Smith"Hayes"

    loan_number "L-170"L-230"L-155

    customer_name" loan_number "

    Jones"Smith"Hayes"

    L-170"L-230"L-155

    amount"

    3000"4000"1700"

    branch_name"

    Downtown"Redwood"Perryridge"

    loan_number"

    L-170 "L-230"L-260"

  • Silberschatz, Korth and Sudarshan (modificado)!8!Database System Concepts!

    Exemplos!

    select * from loan full outer join borrower using (loan_number)"branch_name" amount"

    Downtown"Redwood"Perryridge"null"

    3000"4000"1700"null"

    customer_name"

    Jones"Smith"null"Hayes"

    loan_number "

    L-170"L-230"L-260"L-155

    customer_name" loan_number "

    Jones"Smith"Hayes"

    L-170"L-230"L-155

    amount"

    3000"4000"1700"

    branch_name"

    Downtown"Redwood"Perryridge"

    loan_number"

    L-170 "L-230"L-260"

  • Silberschatz, Korth and Sudarshan (modificado)!9!Database System Concepts!

    Utilizao tpica de USING! Considerem-se as tabelas cursos(cod_curso,nome) e alunos(num_aluno, nome, cod_curso)! A interrogao

    select * from cursos natural inner join alunos equivalente a select cursos.cod_curso as cod_curso, cursos.nome as nome, alunos.num_aluno from cursos, alunoswhere cursos.cod_curso = alunos.cod_curso and cursos.nome = alunos.nome "

    Enquanto que a interrogao select * from cursos inner join alunos using (cod_curso)corresponde a select cursos.cod_curso as cod_curso, cursos.nome, alunos.num_aluno, alunos.nome from cursos, alunoswhere cursos.cod_curso = alunos.cod_curso"

    Qual a correcta?"

  • Silberschatz, Korth and Sudarshan (modificado)!10!Database System Concepts!

    Aspectos a ter cuidado! Ocasionalmente as junes podem ser ambguas quando esto

    envolvidas mais do que 2 tabelas:""select *from a natural left outer join b left outer join c on b.c1 = c.c1"

    Pode ser interpretado como:""select *from (a natural left outer join b) left outer join c on b.c1 = c.c1"

    "ou:""select *from a natural left outer join (b left outer join c on b.c1 = c.c1)"

    Os operadores associam esquerda, ou seja, a primeira hiptese a executada. Na dvida usar os parntesis, em particular quando h muitas condies de juno expressas atravs de ON."

  • Silberschatz, Korth and Sudarshan (modificado)!11!Database System Concepts!

    Exemplos!Listar todos os clientes que tm uma conta e nenhum emprstimo"

    ! !select customer_name!from depositor left outer join borrower using(customer_name) !where loan_number is null!

    Listar todos os clientes que tm uma conta ou um emprstimo no banco (mas no ambos!) !

    ! !select customer_name!from depositor natural full outer join borrower!where account_number is null or loan_number is null!

  • Silberschatz, Korth and Sudarshan (modificado)!12!Database System Concepts!

    Vistas! Em certas circunstncias, no desejvel que todos os

    utilizadores possam aceder a todo o modelo lgico (i.e. a todas as relaes armazenadas na base de dados)."

    Considere o caso de um empregado que necessita de saber o nmero de emprstimo de um cliente, mas que no precisa de saber o montante desse emprstimo. Este empregado dever ver apenas a relao descrita por ""!select costumer_name, loan_number

    "from borrower natural inner join loan"

  • Silberschatz, Korth and Sudarshan (modificado)!13!Database System Concepts!

    Vistas!" Mesmo que no seja por razes de segurana, pode ser til apresentar

    um conjunto de relaes personalizada que se adapte melhor s intuies de um dado utilizador do que o modelo lgico."

    Considere o caso de um empregado do departamento de marketing que poder preferir ver uma relao contendo os clientes que tm uma conta ou um emprstimo no banco, e as respectivas agncias. Tal relao seria:"

    "(select branch_name, customer_name "from depositor natural inner join account)"

    !union!"(select branch_name, customer_name

    "from borrower natural inner join loan)! Qualquer relao que no pertena ao modelo lgico mas que se torne

    visvel ao utilizador como uma relao virtual designada por vista."

  • Silberschatz, Korth and Sudarshan (modificado)!14!Database System Concepts!

    Vistas! Mecanismo que permite apresentar um modelo diferente do

    modelo lgico, e.g. ocultando (escondendo) informao de certos utilizadores. Para criar uma vista utilizamos o comando:"

    " "create view v as ""em que:" qualquer expresso SQL vlida" O nome da vista v"

    Em SQL do Oracle pode-se escrever"! !create or replace view v as para criar ou substituir uma vista j existente, evitando a utilizao do comando drop view."

  • Silberschatz, Korth and Sudarshan (modificado)!15!Database System Concepts!

    Exemplo! Uma vista contendo todas as agncias e respectivos clientes"

    !create view all_customer as !(select branch_name, customer_name " from depositor natural inner join account)"

    " union !(select branch_name, customer_name

    " from borrower natural inner join loan)" Listar todos os clientes da agncia de Perryridge"

    " "select customer_name "from all_customer"where branch_name = Perryridge"

    Uma definio de uma vista no o mesmo que a criao duma nova relao a partir da avaliao da sua expresso. Em vez disso, a definio da vista permite guardar a expresso que depois substituda nas consultas que utilizam a vista."

  • Silberschatz, Korth and Sudarshan (modificado)!16!Database System Concepts!

    Definio de vistas! Uma vista pode ser utilizada na expresso de definio de outra

    vista. Por exemplo:"!! !create view perryridge_customer as ! ! !! ! !select customer_name " " "from all_customer " " " "" " "where branch_name = Perryridge"

    Uma vista v1 depende directamente de uma vista v2 se v2 utilizada na expresso que define v1"

    Uma vista v1 depende de uma vista v2 se v1 depende directamente de v2 ou se existe um caminho de dependncias entre v1 e v2 "

    Uma vista v diz-se recursiva se depender dela prpria." Em SQL no so permitidas vistas recursivas!"

  • Silberschatz, Korth and Sudarshan (modificado)!17!Database System Concepts!

    Expanso de vistas! Forma de atribuir significado a vistas definidas em termos de

    outras vistas." Seja a vista v1 definida em termos de uma expresso e1 que

    pode ela prpria conter vistas." Para expandir as vistas numa expresso repete-se

    sucessivamente o seguinte passo:""repeat

    !Encontrar uma vista vi em e1 "Substituir a vista vi pela expresso que a define

    until no ocorram mais vistas em e1" Desde que as definies das vistas no sejam recursivas, este

    ciclo terminar sempre."

  • Silberschatz, Korth and Sudarshan (modificado)!18!Database System Concepts!

    Expanso de vistas (exemplo)! A expresso:"

    ! ! !select * " "from perryridge_customer " " " " """where customer_name = John"

    ... inicialmente expandida para:"! ! !select *

    " "from (select customer_name " " "from all_customer " " " "" " "where branch_name = Perryridge)" " """where customer_name = John"

    ... que por sua vez expandida para:"! ! !select *

    " "from (select customer_name " " "from ( "(select branch_name, customer_name

    " " " "from depositor natural inner join account)" " " " " "union

    ! ! ! !(select branch_name, customer_name " " " "from borrower natural inner join loan)) "" " " "where branch_name = Perryridge)" "" " "where customer_name = John"

  • Silberschatz, Korth and Sudarshan (modificado)!19!Database System Concepts!

    Modificao da base de Dados Remoo! A remoo de tuplos de uma tabela (ou vista) feita em SQL

    com a instruo"" "delete from "! !where !

    Apagar todas as contas da agncia de Perryridge"" "delete from account

    "where branch-name = Perryridge

  • Silberschatz, Korth and Sudarshan (modificado)!20!Database System Concepts!

    Exemplo de remoo! Apagar todas as contas de todas as agncias na cidade de

    Needham.""delete from depositorwhere account-number in (select account-number

    " "from branch natural inner join account" "where branch-city = Needham)"

    !delete from accountwhere branch-name in (select branch-name

    " " " from branch " " " where branch-city = Needham)

    "

  • Silberschatz, Korth and Sudarshan (modificado)!21!Database System Concepts!

    Exemplo de remoo! Remover todas as contas com saldos inferiores aos da mdia do

    banco."" "delete from account

    "where balance < some (select avg (balance)" " from account)"

    Problema:" medida que removemos tuplos de deposit, o saldo mdio

    altera-se" Soluo utilizada no standard SQL:"

    1."Primeiro, calcula-se o saldo mdio (avg) e determinam-se quais os tuplos a apagar"

    2."Seguidamente, removem-se todos os tuplos identificados anteriormente (sem recalcular avg ou testar novamento os tuplos)"

  • Silberschatz, Korth and Sudarshan (modificado)!22!Database System Concepts!

    Modificao da base de dados Insero! A insero de tuplos numa tabela (ou vista) feita em SQL com a

    instruo"" "insert into "! !values "

    ou"" "insert into "! !select ..."

    Adicionar um novo tuplo a account"" "insert into account

    " "values (A-9732, Perryridge,1200)ou equivalentemente insert into account (branch-name, balance, account-number)

    "values (Perryridge, 1200, A-9732)" Adicionar um novo tuplo a account em que balance null"

    " "insert into account" "values (A-777,Perryridge, null)"

    "

  • Silberschatz, Korth and Sudarshan (modificado)!23!Database System Concepts!

    Exemplo de Insero! Dar como bnus a todos os muturios da agncia de Perryride,

    uma conta de poupana de $200. O nmero do emprstimo servir de nmero de conta de poupana"

    " insert into account"select loan-number, branch-name, 200 "from loan "where branch-name = Perryridge

    insert into depositor"select customer-name, loan-number"from loan natural inner join borrower"where branch-name = Perryridge ""

    A instruo select-from-where avaliada antes da insero de tuplos na relao (caso contrrio consultas como insert into table1 select * from table1 causariam problemas)"

  • Silberschatz, Korth and Sudarshan (modificado)!24!Database System Concepts!

    Modificao da base de dados Actualizao! A actualizao de tuplos duma tabela (ou vista) feita em SQL

    com a instruo"" "update "! !set = , = , ... "

    " "where " Pagar juros de 1% a todas as contas da agncia Perryride."

    " "update account"set balance = balance * 1.01 "where branch_name = Perryride"

    "

  • Silberschatz, Korth and Sudarshan (modificado)!25!Database System Concepts!

    Modificao da base de dados Actualizao! Pagar juros de 6% a todas as contas com saldos superiores a

    $10,000, e juros de 5% s restantes contas." Escrever duas instrues de update:"

    " "update account"set balance = balance * 1.06 "where balance > 10000"

    "" "update account

    "set balance = balance * 1.05 "where balance 10000"

    A ordem importante. Porqu?" Pode ser efectuado de maneira mais limpa recorrendo instruo

    case"

  • Silberschatz, Korth and Sudarshan (modificado)!26!Database System Concepts!

    Instruo Case para Actualizaes Condicionais!

    Pagar juros de 6% a todas as contas com saldos superiores a $10,000, e juros de 5% s restantes contas."

    update account set balance = case when balance

  • Silberschatz, Korth and Sudarshan (modificado)!27!Database System Concepts!

    Actualizao de uma vista! Modificaes nas bases de dados atravs de vistas devem ser

    traduzidas para modificaes das verdadeiras relaes presentes na base de dados." E.g com uma vista com a informao sobre emprstimos,

    escondendo o atributo amount"" "create view branch-loan as

    ! !select branch-name, loan-number" "from loan"

    a adio de um novo tuplo em branch-loan""insert into branch-loan values (Perryridge, L-307)"

    Causa problemas pois ter que ser traduzido em adies de tuplos em tabelas que existam na base de dados. Duas hipteses: " Rejeitar a insero e devolver uma mensagem de erro" Traduzir na insero, na relao loan, do tuplo"

    " " "(L-307, Perryridge, null)"

  • Silberschatz, Korth and Sudarshan (modificado)!28!Database System Concepts!

    Actualizao de uma vista (cont.)! Outro problema ocorre quando temos, por exemplo, a vista:"

    ! !create view info_emprstimos as ! ! ! !! !select customer_name, amount" "from borrower natural inner join loan!

    e pretendemos fazer a seguinte insero:"insert into info_emprstimos values (Johnson,1900)"

    A nica forma seria inserir (Johnson,null) na tabela borrower e (null,null,1900) na tabela loan, no tendo o efeito desejado."

  • Silberschatz, Korth and Sudarshan (modificado)!29!Database System Concepts!

    Actualizao de uma vista (cont)! Outras no tm traduo nica, como por exemplo:"

    "create view all_costumers as ! !(select * from depositor) "

    ! ! !union " " " " " "" "(select * from borrower)"

    Toda a adio em all_costumers no tem traduo nica:" Deve introduzir-se em depositor ou em borrower???"

  • Silberschatz, Korth and Sudarshan (modificado)!30!Database System Concepts!

    Actualizao de vistas! Uma view em SQL actualizvel (updatable) se todas as seguintes

    condies se verificam:" A clasula from s contm uma relao da base de dados;" A clasula select apenas contm nomes de atributos da relao, no

    contendo expresses, agregados, ou especificao de distinct;" Qualquer atributo que no aparece na clasula select deve poder tomar o

    valor null;" A consulta no contm nenhuma clasula group by nem having."

    A view "" "create view downtown_account as

    ! !select acount_number,branch_name,balance " "from account"

    ! ! !where branch-name = Downtown"... actualizvel. No entanto, a insero "

    " "insert into downtown_account values (L-307,Perryridge,1000)"apesar de ser efectuada, no produziria efeitos na view."

  • Silberschatz, Korth and Sudarshan (modificado)!31!Database System Concepts!

    Actualizao de vistas! Em Oracle 11g possvel impedir as situaes anteriores por

    intermdio da clusula WITH CHECK OPTION na criao da vista.create view downtown_account as

    ! !select acount_number,branch_name,balance " "from account"

    ! ! !where branch-name = Downtown""with check option!

    " Para impedir a actualizao de vistas utiliza-se a clusula WITH READ

    ONLY"

    "

  • Silberschatz, Korth and Sudarshan (modificado)!32!Database System Concepts!

    Recurso em SQL! SQL:1999 permite definio recursiva de vistas" Exemplo: encontrar todos os pares empregado-chefe, onde o

    empregado responde directa ou indirectamente ao chefe (i.e. ao chefe do chefe do chefe, etc.) with recursive empl (employee_name, manager_name ) as ( select employee_name, manager_name from manager union select manager.employee_name, empl.manager_name from manager, empl where manager.manager_name = empl.employe_name) select * from empl""Esta vista, empl, o fecho transitivo da relao manager"

  • Silberschatz, Korth and Sudarshan (modificado)!33!Database System Concepts!

    O poder da recurso! As vistas recursivas permitem a escrita de consultas, tais como

    as de fecho transitivo, que no podem ser escritas sem recurso (ou iterao). " Intuio: Sem recurso, um programa no-iterativo e no-recursivo

    s pode calcular um nmero fixo de junes de manager consigo prpria." Isto s pode fornecer um nmero fixo de nveis de chefias"

    Clculo do fecho transitivo" Cada passo do processo iterativo constroi uma verso estendida de

    empl a partir da sua definio recursiva. " O resultado final chamado de ponto-fixo da definio recursiva da

    vista." As vistas recursivas tm que ser monotnicas. I.e. se

    acrescentarmos tuplos relao manager, a vista contm todos os tuplos que continha anteriormente, e possivelmente mais."

  • Silberschatz, Korth and Sudarshan (modificado)!34!Database System Concepts!

    Exemplo de uma computao ponto-fixo!manager!

    emp_name" man_name"Antnio! Bruno!Bruno! Eduardo!Carla! Duarte!

    Duarte! Joo!Eduardo! Joo!

    Joo! Lara!Rita! Lara!

    with recursive empl (emp_name, man_name ) as ! ! !!(select emp_name, man_name " " " " ""from manager) " " " " " " ""union ! ! ! ! ! ! ! ! !!(select manager.emp_name, empl.man_name " ""from manager, empl " " " " " " ""where manager.man_name = empl.emp_name)"

    select * from empl"

    Antnio! Bruno!Bruno! Eduardo!Carla! Duarte!

    Duarte! Joo!Eduardo! Joo!

    Joo! Lara!Rita! Lara!

    Antnio! Eduardo!Bruno! Joo!Carla! Joo!

    Duarte! Lara!Eduardo! Lara!

    empl (2 iter)!emp_name" man_name"

    Antnio! Bruno!Bruno! Eduardo!Carla! Duarte!

    Duarte! Joo!Eduardo! Joo!

    Joo! Lara!Rita! Lara!

    empl (1 iter)!emp_name" man_name"

    Antnio! Bruno!Bruno! Eduardo!Carla! Duarte!

    Duarte! Joo!Eduardo! Joo!

    Joo! Lara!Rita! Lara!

    Antnio! Joo!Bruno! Lara!Carla! Lara!

    Antnio! Eduardo!Bruno! Joo!Carla! Joo!

    Duarte! Lara!Eduardo! Lara!

    empl (3 iter)!emp_name" man_name"

    Antnio! Bruno!Bruno! Eduardo!Carla! Duarte!

    Duarte! Joo!Eduardo! Joo!

    Joo! Lara!Rita! Lara!

    Antnio! Joo!Bruno! Lara!Carla! Lara!

    Antnio! Lara!

    Antnio! Eduardo!Bruno! Joo!Carla! Joo!

    Duarte! Lara!Eduardo! Lara!

    empl (4 iter)!emp_name" man_name"

    Antnio! Bruno!Bruno! Eduardo!Carla! Duarte!

    Duarte! Joo!Eduardo! Joo!

    Joo! Lara!Rita! Lara!

    Antnio! Joo!Bruno! Lara!Carla! Lara!

    Antnio! Lara!

    Antnio! Eduardo!Bruno! Joo!Carla! Joo!

    Duarte! Lara!Eduardo! Lara!

    empl (5 iter)!emp_name" man_name"

    empl (inicial)!emp_name" man_name"

    Ponto Fixo"

  • Silberschatz, Korth and Sudarshan (modificado)!35!Database System Concepts!

    Exemplo de uma computao ponto-fixo!

    Antnio! Bruno!Bruno! Eduardo!Carla! Duarte!

    Duarte! Joo!Eduardo! Joo!

    Joo! Lara!Rita! Lara!

    manager"emp_name" man_name"

    Antnio! Bruno!Bruno! Eduardo!Carla! Duarte!

    Duarte! Joo!Eduardo! Joo!

    Joo! Lara!Rita! Lara!

    Antnio! Joo!Bruno! Lara!Carla! Lara!

    Antnio! Lara!

    Antnio! Eduardo!Bruno! Joo!Carla! Joo!

    Duarte! Lara!Eduardo! Lara!

    1st iteration!2nd iteration!3rd iteration!4th iteration!5th iteration!

    empl"emp_name" man_name"with recursive empl (emp_name, man_name ) as ! !! !select emp_name, man_name " " " "

    " "from manager " " " " " " ""union ! ! ! ! ! ! ! ! ! !! !select manager.emp_name, empl.man_name "" "from manager, empl " " " " " "" "where manager.man_name = empl.emp_name

    select * " " " " " " " " " " from empl"

  • Silberschatz, Korth and Sudarshan (modificado)!36!Database System Concepts!

    Embedded SQL! SQL fornece uma linguagem declarativa para manipulao de bases de

    dados. Facilita a manipulao e permite optimizaes muito difceis se fossem programadas em linguagens imperativas."

    Mas h razes para usar SQL juntamente com linguagens de programao gerais (imperativas):" o SQL no tem a expressividade de uma mquina de Turing (h perguntas

    impossveis de codificar em SQL e.g. fechos transitivos)" usando SQL juntamente com linguagens gerais possvel suprir esta

    deficincia" nem tudo nas aplicaes de bases de dados declarativo (e.g. aces de

    afixar resultados, interfaces, etc)" Essa parte pode ser programado em linguagens gerais"

    O standard SQL define uma srie de embeddings, para vrias linguagens de programao (e.g. Pascal, PL/I, C, C++, Cobol, etc)."

    linguagem na qual se incluem comandos SQL chama-se linguagem host. s estruturas SQL permitidas na linguagem host chama-se SQL embutido (ou embedded SQL)"

  • Silberschatz, Korth and Sudarshan (modificado)!37!Database System Concepts!

    Embedded SQL! Permite acesso a bases e dados SQL, via outra linguagens de

    programao." Toda a parte de acesso e manipulao da base de dados feito

    atravs de cdigo embutido. Todo o processamento associado feito pelo sistema de bases de dados. A linguagem host recebe os resultados e manipula-os."

    O cdigo tem que ser pr-processado. A parte SQL transformada em cdigo da linguagem host, mais chamadas a run-time do servidor."

    A expresso EXEC SQL usado para identificar cdigo SQL embutido"

    " "EXEC SQL END-EXEC""Nota: Este formato varia de linguagem para linguagem. E.g. em C usa-se ; em vez do END-EXEC. Em Java usa-se # SQL { . } ; "

  • Silberschatz, Korth and Sudarshan (modificado)!38!Database System Concepts!

    Cursores! Para executar um comando SQL numa linguagem host

    necessrio comear por declarar um cursor para esse comando." O comando pode conter variveis da linguagem host,

    precedidas de :" E.g. Encontrar os nome e cidades de clientes cujo saldo seja

    superior a amount"EXEC SQL"

    "declare c cursor for select customer-name, customer-cityfrom account natural inner join depositor"" " " natural inner join customerwhere account.balance > :amount"

    END-EXEC"

  • Silberschatz, Korth and Sudarshan (modificado)!39!Database System Concepts!

    Embedded SQL (Cont.)! O comando open inicia a avaliao da consulta no cursor"

    " "EXEC SQL open c END-EXEC" O comando fetch coloca o valor de um tuplo em variveis da

    linguagem host."" "EXEC SQL fetch c into :cn, :cc END-EXEC"

    Chamadas sucessivas a fetch obtm tuplos sucessivos" Uma varivel chamada SQLSTATE na SQL communication area

    (SQLCA) toma o valor 02000 quando no h mais dados." O comando close apaga a relao temporria, criada pelo

    open, que contem os resultados da avaliao do SQL."" "EXEC SQL close c END-EXEC"

  • Silberschatz, Korth and Sudarshan (modificado)!40!Database System Concepts!

    Modificaes com Cursores! Como no devolvem resultado, o tratamento de modificaes

    dentro doutras linguagens mais fcil." Basta chamar qualquer comando vlido SQL de insert, delete,

    ou update entre EXEC SQL e END SQL"

    Em geral, as vriaveis da linguagem host s podem ser usadas em locais onde se poderiam colocar variveis SQL."

    No possvel construir comandos (ou parte deles) manipulando strings da linguagem host"

  • Silberschatz, Korth and Sudarshan (modificado)!41!Database System Concepts!

    Dynamic SQL! Permite construir e (mandar) executar comandos SQL, em run-

    time." E.g. (chamando dynamic SQL, dentro de um programa em C)

    char * sqlprog = update account set balance = balance * 1.05

    " where account-number = ?EXEC SQL prepare dynprog from :sqlprog;char account [10] = A-101;EXEC SQL execute dynprog using :account;"

    A string contm um ?, que indica o local onde colocar o valor a ser passado no momento da chamada para execuo."

  • Silberschatz, Korth and Sudarshan (modificado)!42!Database System Concepts!

    ODBC! Standard Open DataBase Connectivity(ODBC)"

    Standard para comunicao entre programas e servidores de bases de dados"

    application program interface (API) para " Abrir uma ligao a uma base de dados" Enviar consultas e pedidos de modificaes" Obter os resultados"

    Aplicaes diversas (eg GUI, spreadsheets, etc) podem usar ODBC"

  • Silberschatz, Korth and Sudarshan (modificado)!43!Database System Concepts!

    ODBC (Cont.)! Um sistema de bases de dados que suporte ODBC tem uma

    driver library que tem que ser ligada com o programa cliente." Quando o cliente faz uma chamada API ODBC, o cdigo da

    library comunica com o servidor, que por sua vez executa a chamada e devolve os resultados."

    Um programa ODBC comea por alocar um ambiente SQL, e um connection handle."

    Para abrir uma ligao a uma BD, usa-se SQLConnect(). Os parmetros so:" connection handle," servidor onde ligar" username, " password "

  • Silberschatz, Korth and Sudarshan (modificado)!44!Database System Concepts!

    Exemplo de cdigo ODBC! int ODBCexample()"

    "{" RETCODE error;" HENV env; /* environment */ " HDBC conn; /* database connection */ " SQLAllocEnv(&env);" SQLAllocConnect(env, &conn);" SQLConnect(conn, "aura.bell-labs.com", SQL_NTS, "avi", SQL_NTS,

    "avipasswd", SQL_NTS); " { . Manipulao propriamente dita }"" SQLDisconnect(conn); " SQLFreeConnect(conn); " SQLFreeEnv(env); "

    }"

  • Silberschatz, Korth and Sudarshan (modificado)!45!Database System Concepts!

    ODBC (Cont.)! Os programas enviam comandos SQL base de dados usando

    SQLExecDirect" Os tuplos resultado so obtidos via SQLFetch()" SQLBindCol() liga variveis da linguagem a atributos do

    resultado do SQL" Quando um tuplo obtido com um fetch, os valores dos seus

    atributos so automaticamente guardados nas ditas variveis.""

  • Silberschatz, Korth and Sudarshan (modificado)!46!Database System Concepts!

    Exemplo de cdigo ODBC!"char branchname[80];float balance;int lenOut1, lenOut2;HSTMT stmt; " SQLAllocStmt(conn, &stmt);

    char * sqlquery = "select branch_name, sum (balance) from account group by branch_name";"

    error = SQLExecDirect(stmt, sqlquery, SQL_NTS);" if (error == SQL_SUCCESS) {

    SQLBindCol(stmt, 1, SQL_C_CHAR, branchname , 80, &lenOut1); SQLBindCol(stmt, 2, SQL_C_FLOAT, &balance, 0 , &lenOut2);"

    while (SQLFetch(stmt) >= SQL_SUCCESS) { printf (" %s %g\n", branchname, balance); }}SQLFreeStmt(stmt, SQL_DROP); "

  • Silberschatz, Korth and Sudarshan (modificado)!47!Database System Concepts!

    JDBC! JDBC uma API Java para comunicar com sistemas de bases

    de dados que suportam o SQL." JDBC suporta vrias formas de consulta e modificao de bases

    de dados" O modelo de comunicao com a base de dados:"

    Abre uma ligao" Cria um objecto statement" Executa comandos usando esse objecto para enviar os comandos e

    obter os resultados" Usa mecanismos de excepo para lidar com os erros"

  • Silberschatz, Korth and Sudarshan (modificado)!48!Database System Concepts!

    Exemplo de cdigo JDBC!public static void JDBCexample(String dbid, String userid, String passwd) "

    { " try { "

    Class.forName ("oracle.jdbc.driver.OracleDriver"); " Connection conn =

    DriverManager.getConnection( "jdbc:oracle:thin:@aura.bell-labs.com:2000:bankdb", userid, passwd); "

    Statement stmt = conn.createStatement(); " Do Actual Work ." stmt.close(); "" conn.close(); "" }" "" catch (SQLException sqle) { " "" System.out.println("SQLException : " + sqle); " "" }" ""

    }"

  • Silberschatz, Korth and Sudarshan (modificado)!49!Database System Concepts!

    Exemplo de cdigo JDBC (Cont.)! Actualizao"

    try { " stmt.executeUpdate( "insert into account values

    ('A-9732', 'Perryridge', 1200)"); "} catch (SQLException sqle) { " System.out.println("Could not insert tuple. " + sqle);"}"

    Execuo de perguntas "ResultSet rset = stmt.executeQuery( "select branch_name,

    avg(balance) from account group by branch_name");"

    while (rset.next()) { " ""System.out.println(

    rset.getString("branch_name") + " " + rset.getFloat(2));""

    } " ""

  • Silberschatz, Korth and Sudarshan (modificado)!50!Database System Concepts!

    Linguagens proprietrias! A maior parte dos sistemas comerciais incluem linguagens

    proprietrias que, para alm do embedded SQL, tm primitivas prprias para (entre outras) criar interfaces no ecr (forms) e para formatar dados para apresentao de relatrios (reports)."

    Algumas destas linguagens tm ainda construtores de mais alto nvel, para trabalhar sobre cursores."

    Tipicamente os programas nestas linguagens, compilam para outras linguagens (eg C) embedded SQL."

    Os sistemas comerciais costumam ainda ter aplicaes de gerao fcil de programas na linguagem proprietria"

    No Oracle a linguagem proprietria o PLSQL. O Forms, o Reports e o APEX so aplicaes que geram PLSQL."

  • Silberschatz, Korth and Sudarshan (modificado)!51!Database System Concepts!

    PL/SQL! Extenso procedimental ao SQL, do Oracle." Suporta:"

    Variveis (mesmos tipos do Oracle)" Condies (IF-THEN-ELSE e CASE)" Ciclos (LOOP, FOR)" Excepes (para tratamento de erros)"

    Unidades de programas em PL/SQL podem ser compilados na base de dados Oracle."

  • Silberschatz, Korth and Sudarshan (modificado)!52!Database System Concepts!

    Construtores procedimentais! O SQL:1999 suporta uma grande variedade de construtores

    procedimentais" O Oracle suporta aqueles que existem no PL/SQL"

    Expresses com whiles e repeats!! !declare n integer default 0;!! !while n < 10 do!

    ! ! set n = n+1;!! !end while;!! !repeat!

    set n = n 1;"! !until n = 0;"! !end repeat!

    Em Oracle, em vez de set var = usa-se var :=!

  • Silberschatz, Korth and Sudarshan (modificado)!53!Database System Concepts!

    Construtores procedimentais (Cont.)! Ciclos"

    Iteraes sobre o resultado de perguntas" E.g. soma de todos os saldos da agncia Perryridge

    declare n integer default 0; for r as select balance from account where branch-name = Perryridge do! set n = n + r.balance;

    end for"

  • Silberschatz, Korth and Sudarshan (modificado)!54!Database System Concepts!

    Construtores procedimentais (cont.)! Expresses condicionais (if-then-else)

    E.g. Soma dos saldos por categorias de contas (com saldo 5000)"! !if r.balance < 1000

    " then set l = l + r.balance "elseif r.balance =< 5000 " then set m = m + r.balance "else set h = h + r.balance "end if !

    Assinalar condies de excepo e erros, e declarao de tratamento de excepes"! !declare out_of_stock condition;

    !declare exit handler for out_of_stock ; "begin!

    .. signal out-of-stock; "end!

    Neste exemplo o tratamento da excepo exit sai do bloco beginend" No Oracle em vez de signal usa-se raise!

  • Silberschatz, Korth and Sudarshan (modificado)!55!Database System Concepts!

    Funes e Procedimentos! O SQL:1999 suporta funes e procedimentos"

    As funes e procedimentos podem ser escritas directamente em SQL, ou em linguagens de programao externas (e.g. PL/SQL)."

    Alguns sistemas de bases de dados (entre eles o Oracle) permitem definir funes que devolvem tabelas"

    Grande parte dos sistemas de bases de dados tm linguagens proprietrias onde se podem definir funes e procedimentos, e que diferem bastante do standard SQL:1999"

    No Oracle podem-se criar funes e procedimentos atravs da linguagem PL/SQL, ou directamente na base de dados."

  • Silberschatz, Korth and Sudarshan (modificado)!56!Database System Concepts!

    Funes SQL! Definir uma funo que, dado o nome de um cliente, devolva o nmero

    de contas de que ele titular." create function account_count (customer_name varchar(20))

    returns integer begin declare a_count integer; select count (* ) into a_count from depositor where depositor.customer_name = customer_name return a_count; end!

    Encontrar o nome e morada dos clientes com mais do que uma conta."" "select customer_name, customer_street, customer_city

    "from customer "where account_count (customer_name ) > 1"

  • Silberschatz, Korth and Sudarshan (modificado)!57!Database System Concepts!

    Funes que retornam Tabelas! SQL:2003 acrescenta funes que devolvem uma relao como

    resultado. " Examplo: Devolver todas as contas de um dado cliente"

    "create function accounts_of (customer_name char(20)"" "returns table ( "account_number char(10),

    " " "branch_name char(15)" " "balance numeric(12,2)))"

    "return table "(select account_number, branch_name, balance" from account A" where exists ( " select *" from depositor D" where D.customer_name=accounts_of.customer_name" and D.account_number = A.account_number ))"

    Utilizao"" "select *

    !from table (accounts_of (Smith))"

  • Silberschatz, Korth and Sudarshan (modificado)!58!Database System Concepts!

    Funes e procedimentos SQL! A funo account_count pode ser escrita como procedimento:"

    !create procedure account_count_proc (in customer_name varchar(20), out a_count integer)begin!! select count(*) into a_count from depositor where depositor.customer_name = account_count_proc.customer_name"

    end! Os procedimentos podem ser chamados dentro de outros procedimentos

    SQL, ou de linguagens SQL embedded ou proprietrias." E.g. num procedimento SQL"

    ! !declare a_count integer;"call account_count_proc( Smith, a_count);"

    O SQL:1999 permite que haja mais que uma funo ou procedimento com o mesmo nome, desde que o nmero de argumentos (ou, pelo menos, os seus tipos) sejam diferentes"

  • Silberschatz, Korth and Sudarshan (modificado)!59!Database System Concepts!

    Funes e procedimentos externos! O SQL:1999 permita o uso de funes e procedimentos escritos

    noutras linguagens (e.g. C ou C++) " A declarao de funes e procedimentos externos faz-se da

    seguinte forma:""create procedure account_count_proc(in customer_name varchar(20),out count integer)language C external name /usr/avi/bin/account_count_proccreate function account_count(customer_name varchar(20))returns integerlanguage C external name /usr/avi/bin/author_count"

  • Silberschatz, Korth and Sudarshan (modificado)!60!Database System Concepts!

    Funes e procedimentos externos (Cont.)! Vantagens: "

    Mais eficiente para muitas operaes" Mais poder expressivo"

    Desvantagens" O cdigo que implementa as rotinas externas pode ter que ser

    carregado no sistema de bases de dados e executado no espao de endereos deste" risco de corromper acidentalmente a estrutura da base de

    dados" risco de segurana dos dados"

    H alternativas que garante segurana ( custa, por vezes, da deteriorao da performance)"

    A execuo directa no sistema de bases de dados s feita se a eficincia for bem mais importante que a segurana"

  • Silberschatz, Korth and Sudarshan (modificado)!61!Database System Concepts!

    Segurana para rotinas externas! Para lidar com estes problemas de segurana"

    Usar tcnicas de sandbox" i.e. usar linguagem segura como o Java, que no permite

    o acesso a outras parte do cdigo da base de dados" Ou executar rotinas externas em processo separado, sem

    acesso memria usada por outros processos do sistema de bases de dados" Os parmetro e resultados so passados via

    comunicao entre processos" Ambas as alternativas tm custos de performance""