Você está na página 1de 39

Agenda

1.Introduo ao PostgreSQL 2.Interfaces de acesso ao PostgreSQL

PostgreSQL Essencial
Luciano Mittmann mittmann@gmail.com

3.Gerenciando tabelas 4.Selecionando dados 5.Funes e operadores 6.Alterando dados 7.Controle de transaes 8.Outros objetos de banco de dados 9.Mdulos adicionais do diretrio contrib
2

O que o PostgreSQL?

PostgreSQL um

Introduo ao PostgreSQL

sistema gerenciador de banco de dados relacional (SGBDR) avanado extensvel dentro dos padres multiplataforma (Unix, Linux, Windows, Mac) de cdigo aberto com a licena mais liberal possvel (BSD)
4

O que ele faz de mais?

De onde ele surgiu?

Suporta diversas features padres SQL:


De INGRES a POSTGRES: 1977-1994


chaves estrangeiras (FKs) disparadores (triggers) vises (views) controle de concorrncia (MVCC)

Michael Stonebraker, prof. da UC - Berkeley 77: desenvolveu o INGRES fundou o SGBDR! 86: continuou a pesquisa com o POSTGRES (cdigo do POSTGRES no partiu do INGRES) 94: adicionado suporte a SQL 95: liberado como Postgres95 96: reliberado como PostgreSQL 6.0 consolidao do Grupo de Desenvolvimento
6

Permite a customizao e criao de:


De POSTGRES a PostgreSQL: 1994-1996


tipos de dados e operadores funes escalares e de agregao linguagens procedurais


5

Quem o desenvolve hoje?

Histrico das verses


Padro SQL Desempenho Corporativo Melhorias no Gerenciamento

Thomas Lockhart Jolly Chen Vadim Mikheev Jan Wieck Andrew Yu Tom Lane Bruce Momjian Marc Fournier

Sem Crash

WAL (log trans.)

left joins, schema, PL/lang

OLTP, FSM, replicao, savepoints

DW, parties, SMP, Windows

em major releases ocorre alterao na estrutura dos dados


8

Funcionamento do PostgreSQL
instncia catlogo de dados objetos do SGBD table spaces usurios do SGBD banco esquema objeto banco esquema objeto 1. conexo ocorre em um nico banco de dados e para um usurio 2. no existem sinnimos! 3. acesso a objetos de outro esquema com o recurso de search path 4. nativamente, no h como acessar objetos de outro banco
9

Interfaces de acesso ao PostgreSQL

Conexo pelo Java (via JDBC)

Exemplo de acesso via Java


$javaccp~/lib/pgsql.jarConPg.java importjava.sql.*; $javacp.:~/lib/pgsql.jarConPg classConPg{ publicstaticvoidmain(Stringargs[])throwsSQLException{ DriverManager.registerDriver(neworg.postgresql.Driver());

Download do driver

http://jdbc.postgresql.org/ postgresql-<verso>.jar org.postgresql.Driver jdbc:postgresql://servidor[:porta]/banco ex: jdbc:postgresql://10.15.60.84:5434/ccb


11

Biblioteca JAR

Classe de acesso

Connectionconn=DriverManager.getConnection( "jdbc:postgresql://localhost:5432/cidades", "rodrigo","celepar"); Statementstmt=conn.createStatement(); ResultSetrset=stmt.executeQuery( "SELECTnomeFROMcidade_internacionalLIMIT5"); while(rset.next()) System.out.println(rset.getString(1)); }


12

URL de conexo

psql: cliente em linha de comando

psql: principais parmetros


Uso: psql[OPES]...[NOMEBD[USURIO]]

Natureza

$psqlhelp

terminal interativo, como SQL*Plus ou sqlcmd acompanha o cliente do PostgreSQL #aptgetinstallpostgresqlclient cliente padro do PostgreSQL, acesso nativo, console, no requer servidor grfico (ie: X), rpido, pode ser usado na criao de scripts

Multiplataforma

Opesgerais: dNOMEBDespecificaonomedobancodedadosaoqualquerseconectar(padro:$USER) cCOMANDOexecutasomenteumcomando(SQLouinterno)esai fARQUIVOexecutacomandosdeumarquivoesai llistaosbancosdedadosdisponveisesai helpmostraestaajudaesai versionmostrainformaosobreaversoesai Opesdeentradaesada: Emostraconsultasqueoscomandosinternosgeram qexecutasilenciosamente(semmensagens,somentesadadaconsulta) oARQUIVOenviaresultadosdaconsultaparaumarquivo(ou|pipe) smodopassoapasso(confirmacadaconsulta) LARQUIVOenvialogdasessoparaarquivo Opesparaformatodesada: Amododesadaemtabeladesalinhada(Pformat=unaligned) HmododesadaemtabelaHTML(Pformat=html) texibesomenteosregistros(Ptuples_only) TTEXTOdefineatributosdomarcadortabledoHTML(width,border)(Ptableattr=) xhabilitasadaemtabelaexpandida(Pexpanded) FSEPARADORdefineseparadordecampos(padro:"|")(Pfieldsep=) RSEPARADORdefineseparadorderegistros(padro:nova_linha)(Precordsep=) Opesdeconexo: hMQUINAservidordebancodedadosoudiretriodosoquete(padro:"/var/run/postgresql") PPORTAportadoservidordebancodedados(padro:"5432") UUSURIOnomedeusuriodobancodedados(padro:$USER) Wperguntasenha(podeocorrerautomaticamente)

Instalao no Debian

Caractersticas

13

14

psql: exemplos de parmetros #1

psql: exemplos de parmetros #2

conectar-se ao servidor scelepar05480, porta 5432, banco de dados cursopg, usurio sa_cursopg, senha stranger
$psqlhscelepar05480p5432\ cursopgsa_cursopg

executar nica linha de comando SQL


$psqlcselectversion() $echoselectversion()|psql

executar arquivo de script SQL


$catscript.sql|psql $psql<script.sql $psqlfscript.sql
$cat>script.sql<<EOF selectnow(); selectcurrent_user; EOF

exibir a listagem dos bancos de dados existentes localmente, sem formatao e com os campos separados por :
$psqllAtF:
15

16

psql: exemplos de parmetros #3

psql: conectado ao banco de dados


Bemvindoaopsql8.3.9,oterminaliterativodoPostgreSQL. Digite:\copyrightparamostrartermosdedistribuio \hparaajudacomcomandosSQL \?paraajudacomcomandosdopsql \gouterminarcompontoevrgulaparaexecutaraconsulta \qparasair postgres=#

redirecionar resultado para um arquivo


$psqll>bancos.log $psqllobancos.log

executar script de modo passo-a-passo


$psqlfscript.sqls

executar instrues SQL


db=#SELECTcurrent_date;

ponto e vrgula!

exibir comandos SQL internos do cliente


$psqllE
17

executar comandos internos do psql


db=#\l
barra invertida!
18

psql: obtendo ajuda dos comandos

Antes de prosseguir o curso...

listagem de ajudas disponveis


db=#\h

crie um esquema especfico


db=#CREATESCHEMAmy_schema; db=#\dn
altere para o seu nome!

ajuda de instrues SQL


db=#\hcreatetable db=#\hcopy db=#\htruncate

altere o seu caminho de busca


db=#SETsearch_pathTOmy_schema,public; db=#SHOWsearch_path;

listagem de comandos internos do psql


db=#\?
19

verifique as tabelas existentes


db=#\d
20

psql: criando a tabela de teste

psql: populando a tabela de teste

criar a tabela de teste


db=#CREATETABLEtabela( db(#idserialnotnullprimarykey, db(#destextnotnull db(#);

inserir registros na tabela de teste


db=#INSERTINTOtabela(des) db#VALUES('primeiro'); db=#INSERTINTOtabela(des) db#VALUES('segundo'); db=#...

criar ndice secundrio para a tabela


db=#CREATEINDEXtabela_i01 db=#ONtabela(des);
21

22

psql: auto-completion, seu amigo!

psql: principais comandos internos


Geral \c[onnect][NOMEBD|[USURIO]] conectaaumoutrobancodedados \encoding[CODIFICAO] mostraoudefinecodificaodocliente \h[NOME]mostrasintaxedoscomandosSQL,*paratodososcomandos \qsaidopsql \set[NOME[VALOR]] definevarivelinternaoulistatodoscasonotenhaparmetros \timingalternaparaduraodaexecuodecomandos(atualmentedesabilitado) \unsetNOMEapaga(exclui)varivelinterna Bufferdeconsulta \e[ARQUIVO]editaobufferdeconsulta(ouarquivo)comumeditorexterno \s[ARQUIVO]mostrahistricoougravaoemumarquivo \w[ARQUIVO]escreveobufferdeconsultaparaarquivo Entrada/Sada \echo[STRING]escrevecadeiadecaracteresnasadapadro \iARQUIVOexecutacomandosdeumarquivo \o[ARQUIVO]enviatodososresultadosdaconsultaparaarquivoou|pipe

o que isso?

um poderoso til recurso semelhante ao que possui o bash, acionado com a tecla [Tab] aps a digitao de iniciais dos comandos
busca comando na lista de instrues possveis

nas instrues SQL


db=#SELECT*FROMtabela;

nos comandos internos


db=#\d+tabela
busca objeto no catlogo do banco de dados
23

exibir durao aps execuo de SQL


db=#\timing db=#SELECTcount(1)FROMpg_class;
24

psql: comandos internos

psql: comandos internos

alternar o banco de dados em uso


db=#\ctemplate1 db=#\ccursopgsa_cursopg

executar script de arquivo externo


db=#\iscript.sql

redirecionar sada para arquivo


db=#\osaida.log

abrir editor de textos padro (ex: vi)


db=#\e

voltar ao modo anterior


db=#\o

sair do programa
db=#\q [Ctrl]+D
25

exibir ltimos comandos (histrico)


db=#\s
26

psql: comandos informativos #1


Informativo \d[NOME]descrevetabela,ndice,sequnciaouviso \d{t|i|s|v|S}[MODELO](adicione"+"paraobtermaisdetalhe) listatabelas/ndices/sequncias/vises/tabelasdosistema \da[MODELO]listafunesdeagregao \db[MODELO]listatablespaces(adicione"+"paraobtermaisdetalhe) \dc[MODELO]listaconverses \dClistaconversesdetipos \dd[MODELO]mostracomentriodoobjeto \dD[MODELO]listadomnios \df[MODELO]listafunes(adicione"+"paraobtermaisdetalhe) \dg[MODELO]listagrupos \dn[MODELO]listaesquemas(adicione"+"paraobtermaisdetalhe) \do[NOME]listaoperadores \dllistaobjetosgrandes,mesmoque\lo_list \dp[MODELO]listaprivilgiosdeacessodetabelas,visesesequncias \dT[MODELO]listatiposdedado(adicione"+"paraobtermaisdetalhe) \du[MODELO]listausurios \llistatodososbancosdedados(adicione"+"paraobtermaisdetalhe) \z[MODELO]listaprivilgiosdeacessodetabelas,visesesequncias(mesmoque\dp)

psql: comandos informativos #2

listar relaes (tabelas, vises, seqncias) do banco de dados atual


db=#\d

listar somente as tabelas do banco


db=#\dt

exibir informaes detalhadas da tabela


db=#\d+tabela

listar bancos de dados existentes


db=#\l
27

28

psql: comandos informativos #3

Ferramenta: pgAdmin III

listar esquemas do banco


db=#\dn

Home page e download

http://www.pgadmin.org/ Linux, FreeBSD, Windows, Mac OSX #aptgetinstallpgadmin3* fcil de usar, fornece dicas, faz acesso nativo, cdigo aberto, compilado (C++)

listar ndices do banco


db=#\di db=#\ditabela_i01

Multiplataforma

listar funes do banco


db=#\df

Instalao no Debian

exibir corpo de uma funo


db=#\df+funcao
29

Caractersticas

30

pgAdmin: tela inicial

pgAdmin: configurando o servidor


acesse o menu Arquivo -> Novo servidor
Nome - Apelido do servidor Mquina

servidores

bancos

dica: instrues para a criao ou excluso do objeto

esquemas

endereo IP ou nome de domnio do servidor banco de dados inicial


32

Manuteno do DB

objetos

31

pgAdmin: efetuando consultas

pgAdmin: exportando dados via SQL

selecione o banco de dados desejado e acesse o menu Ferramentas -> Query tool

na jenela do Query tool, acesse o menu Query -> Execute to file Row separator

janela de entrada pressione [F5] para executar

LF (Unix) CR/LF (DOS)

tabela de resultados

Filename

arquivo de destino (local)


34

33

pgAdmin: planos de execuo

Ferramenta: phpPgAdmin

na jenela do Query tool, acesse o menu Query -> Explain ou pressione [F7]

Home page e download

http://phppgadmin.sourceforge.net/ requer Apache e PHP #aptgetinstallphppgadmin requer apenas browser no cliente, scripts em PHP, cdigo aberto, diversas funcionalidades especficas do PostgreSQL, intuitivo

Multiplataforma

diagrama do plano de execuo

Instalao no Debian

Caractersticas

35

36

Ferramenta: TOra

Ferramenta: Aqua Data Studio

Home page e download

Home page e download

http://tora.sourceforge.net/

http://www.aquafold.com/ requer apenas Java VM (>= 1.5) #aptgetinstalldatastudio fcil instalao, intuitivo, acompanha drivers para diversos SGBDs, extrao de DDLs, IDE para criao e execuo de scripts

Plataformas

Multiplataforma

Linux e Windows #aptgetinstalltora

Toolkit for Oracle

Instalao no Debian

Instalao no Debian

Caractersticas

Caractersticas

interface desktop (compilado), licena GPL, til para criao de stored procedures, navegao de schemas e execuo de SQLs

37

38

Introduo tabela

o que uma tabela num SGBDR?

Gerenciando tabelas

uma estrutura de dados formada por linhas (registros, tuplas) e colunas (campos, atributos) nmero e ordem das colunas so fixos, e cada coluna possui um nome nico nmero de linhas varivel, em geral no garantindo a ordem destas e podendo ser no-nicas cada coluna possui um tipo de dado, que limita o conjunto de possveis valores

principais caractersticas

40

Introduo tabela

Como criar uma tabela?


CREATETABLEtable_name([ {column_namedata_type[DEFAULTdefault_expr] [column_constraint[...]] |table_constraint [,...] sintaxe simplificada ]) [CONSTRAINTconstraint_name] {NOTNULL|NULL|UNIQUEindex_parameters| PRIMARYKEYindex_parameters|CHECK(expression)| REFERENCESreftable[(refcolumn)] [ONDELETEaction][ONUPDATEaction]} [CONSTRAINTconstraint_name] {UNIQUE(column_name[,...])index_parameters| PRIMARYKEY(column_name[,...])index_parameters| CHECK(expression)| FOREIGNKEY(column_name[,...]) REFERENCESreftable[(refcolumn[,...])] [ONDELETEaction][ONUPDATEaction]} 42

41

Tabelas: exemplos #1

Tabelas: exemplos #2

criao da tabela de filmes


CREATETABLEfilmes( codigochar(5) CONSTRAINTfilmes_pkPRIMARYKEY, titulovarchar(40)UNIQUE, didintegerNOTNULL,distribuidor data_proddateDEFAULTcurrent_date, generovarchar(10), duracaointervalhourtominute );
43

criao da tabela de distribuidores


CREATETABLEdistribuidores( didintegerCHECK(did>100), nomevarchar(40)NOTNULL, PRIMARYKEY(did) ); CREATETABLEdistribuidores2( didintegerPRIMARYKEY, nomevarchar(40)DEFAULT'LusoFilmes' );
44

outra maneira

Tabelas: opes especficas #1

Tabelas: opes especficas #2

[ GLOBAL | LOCAL ] TEMP

[ DEFERRABLE | NOT DEFERRABLE ]

criao de tabelas temporrias (global ou local)

configurao de constraints adiveis alocao fsica da tabela em outra partio alocao fsica do ndice em outra partio especificao de parmetros adicionais para o armazenamento fsico da tabela (ex: fillfactor)
46

INHERITS ( parent_table [, ... ] )

TABLESPACE tablespace

herana e polimorfismo de tabelas (como em Orientao a Objetos) cpia das colunas e restries, sem o mesmo vnculo da herana identificador nico para as linhas (ie: ROWID)

LIKE parent_table [ ... ]

USING INDEX TABLESPACE tablespace

WITH ( storage_parameter [= value] [, ... ] )

{ WITH | WITHOUT } OIDS

45

Tabelas: qualificando o esquema

Tabelas: visualizando a estrutura

criao de tabela em outro esquema


CREATETABLEmy_schema.tab( idserial ); SETsearch_pathTOmy_schema; CREATETABLEtab( idserial );
47

via psql
db=#\dfilmes Tabela"public.filmes" Coluna|Tipo|Modificadores ++ codigo|character(5)|notnull titulo|charactervarying(40)| did|integer|notnull data_prod|date|default('now'::text)::date genero|charactervarying(10)| duracao|intervalhourtominute| ndices: instrues "filmes_pk"PRIMARYKEY,btree(codigo) "filmes_titulo_key"UNIQUE,btree(titulo)

ambos os caminhos levam Roma!

DDL

via pgAdmin

abrir a rvore Servidor, Banco, Esquemas, Tabelas, Colunas

48

Como alterar a estrutura da tabela?

Como alterar a estrutura da tabela?

incluir uma coluna


ALTERTABLEdistribuidores ADDCOLUMNenderecovarchar(30);

alterar os valores padres de campos


ALTERTABLEfilmes ALTERCOLUMNdata_prodDROPDEFAULT, ALTERCOLUMNduracaoSETDEFAULT'1:20';

excluir uma coluna


ALTERTABLEdistribuidores DROPCOLUMNenderecoRESTRICT;

renomear uma coluna


ALTERTABLEfilmes RENAMECOLUMNdata_prodTOproducao;

alterar o tipo de dados de uma coluna


ALTERTABLEdistribuidores ALTERCOLUMNnomeTYPEvarchar(50);
49

50

Como alterar a estrutura da tabela?

Como alterar a estrutura da tabela?

renomear a tabela
ALTERTABLEdistribuidores2 RENAMETOdist2;

adicionar check constraint


ALTERTABLEdistribuidores ADDCONSTRAINTck_nome CHECK(length(nome)>=5);

tornar coluna obrigatria


ALTERTABLEfilmes ALTERCOLUMNgeneroSETNOTNULL;

remover check constraint


ALTERTABLEdistribuidores DROPCONSTRAINTck_nome;

retirar obrigatoriedade da coluna


ALTERTABLEfilmes ALTERCOLUMNgeneroDROPNOTNULL;
51 52

Como alterar a estrutura da tabela?

Como destruir a tabela?


DROPTABLE[IFEXISTS]name[,...] [CASCADE|RESTRICT]

mover a tabela para outro tablespace


ALTERTABLEdistribuidores SETTABLESPACEtbs_veloz;

mover tabela para outro esquema


ALTERTABLEfilmes SETSCHEMApublic;

IF EXISTS

caso a tabela no exista, no ocorre erro automaticamente exclui os objetos que dependem da tabela o oposto da opo acima, e o default

CASCADE

dica: no psql, use


\db para exibir os tablespaces \dn para exibir os esquemas


53

RESTRICT

54

Comentrios em objetos

comentar bancos, esquemas, tabelas, campos e outros objetos


COMMENTONDATABASEcursopg IS'CursodePostgreSQL'; COMMENTONSCHEMApublic IS'Esquemapblico(padro)'; COMMENTONTABLEfilmesIS'Filmes'; COMMENTONCOLUMNfilmes.did IS'Cdigododistribuidor';

Selecionando dados

remover o comentrio
COMMENTONTABLEfilmesISNULL;
55

Consultas: uma viso geral

Consultas: a clusula FROM


FROMtable_reference[, table_reference[,...]]

o processo ou o comando para obter dados de um banco de dados chamado de query (ie: consulta ou consulta SQL) o SELECT uma instruo de DML (Data Manipulation Language) da SQL um exemplo de consulta simples
SELECT*FROMtabela;

serve para definir a lista de tabelas (uma ou mais) a serem lidas para a consulta a table_reference pode ser o nome de uma tabela (com ou sem esquema), uma subconsulta, uma juno ou combinao destas se mais de uma tabela for especificada, elas sero cruzadas numa tabela virtual
58

um exemplo de consulta sem tabela


SELECTnow();

ah! no precisa de um artifcio chamado DUAL

57

Consultas: tipos de junes

Consultas: tipos de junes

preparar o seguinte caso de teste


CREATETABLEt1(numint,nometext); CREATETABLEt2(numint,valortext); INSERTINTOt1VALUES(1,'a'); INSERTINTOt1VALUES(2,'b'); INSERTINTOt1VALUES(3,'c'); INSERTINTOt2VALUES(1,'xxx'); INSERTINTOt2VALUES(3,'yyy'); INSERTINTOt2VALUES(5,'zzz'); SELECT*FROMt1; SELECT*FROMt2;
59

CROSS JOIN (resulta em N x M linhas)


SELECT*FROMt1,t2; SELECT*FROMt1CROSSJOINt2;

INNER JOIN (condio satisfeita nas duas)


SELECT*FROMt1 INNERJOINt2ONt1.num=t2.num; SELECT*FROMt1 INNERJOINt2USING(num); SELECT*FROMt1 NATURALINNERJOINt2;
notao especfica do PostgreSQL
60

Consultas: tipos de junes

Consultas: utilizao de apelidos

LEFT e RIGHT JOIN (buraco em um lado)


SELECT*FROMt1 LEFTJOINt2ONt1.num=t2.num; SELECT*FROMt1 LEFTJOINt2USING(num); SELECT*FROMt1 RIGHTJOINt2ONt1.num=t2.num;

exemplos de utilizao
SELECT* FROMTB_UmaTabelaComNomeCompridonc JOINTB_OutraTabelaComNomePeculiarnp ONnc.id=np.num WHEREnp.campo>5;
o AS opcional!

FULL JOIN (buracos nos dois lados)


SELECT*FROMt1 FULLJOINt2ONt1.num=t2.num;
61

SELECT* FROMpessoasASmae JOINpessoasASfilho ONmae.id=filho.id_mae;


62

Consultas: a clusula WHERE


WHEREsearch_condition

Consultas: lista de seleo


alm do *, a lista especfica de campos pode ser utilizada na clusula SELECT
SELECTa,b,cFROM... SELECTtabl.a,tab2.a,tab1.bFROM... SELECTtab1.*,tab2.aFROM...

serve para filtrar os registros obtidos da clusula FROM, mantendo apenas os que atinjam determinada condio search_condition uma expresso de valor qualquer que retorne um tipo de dados lgico (booleano)
SELECT*FROMfdtWHEREc1>5; SELECT*FROMfdtWHEREc1IN(1,2);
63

os campos da lista de seleo podem ser rotulados, para evitar problemas de interpretao ou redundncia
SELECTaASvalor,b+cASsomaFROM... SELECTversion()ASversao_atual;
64

Consultas: operaes de conjuntos


query1UNION[ALL]query2 query1EXCEPT[ALL]query2
crculo quadrado ALL define se linhas duplicadas sero consideradas

Consultas: a clusula ORDER BY


ORDERBYsort_expression[ASC|DESC] [,...]

query1INTERSECT[ALL]query2
MINUS em outros SGBDs

serve para definir a ordem em que as linhas, j processadas, sejam retornadas sort_expression pode ser qualquer expresso que seria vlida na lista de seleo (podem ser usados nmeros)
SELECTa,bFROMtab1ORDERBYa+b,c; SELECTa+bASsmFROMtablORDERBYsm;

UNION

INTERSECT

EXCEPT
65

SELECTa,bFROMtab1ORDERBY2DESC,1;
66

Consultas: limitando o resultado


LIMITnumber

serve para limitar a quantidade de linhas a serem retornadas de uma consulta


SELECT*FROMt1ORDERBYnumLIMIT2;
importante: usar em conjunto com ORDER BY!

Funes e operadores

OFFSETnumber

serve para pular as primeiras N linhas da clusula LIMIT (usado em paginaes)


SELECT*FROMt1ORDERBYnum LIMIT2OFFSET1;
67

Funes matemticas

Operadores matemticos

absoluto, logaritmo natural, logaritmo 10


SELECTabs(17.4),ln(2.0),log(100.0);

adio, subtrao, multiplicao, diviso


SELECT1+2,34,2*3,5/2;

mdulo, exponencial, potncia, raiz


SELECTmod(9,4),exp(1.0), power(9,0.5),sqrt(9.0);

mdulo, exponenciao, raiz, fatorial


SELECT5%2,2^3,|/9,||/27,3!;

arredondar, truncar
SELECTround(3.5),round(3.55,1), trunc(3.5),trunc(3.55,1);

bitwise AND, OR, XOR e NOT


SELECT91&15,32|3,17#5,~1;

bitwise shift left e shift right


SELECT1<<4,3<<1,8>>2,6>>1; SELECT3::bit(8),(3<<2)::bit(8), (12>>1)::bit(8),B'00000110'::int;

randmico, gerar semente


SELECTsetseed(0.54823),random();
69

70

Funes matemticas Exerccio

Funes de texto - I

multiplicao de nmeros da tabela


cursopg=>SELECT???FROMtabela; mul 120 (1registro)

concatenao de strings
SELECT'Post'||'greSQL','a'||null;

converso de codificao
SELECTconvert_from('codificao','LATIN1');

minsculo, maisculo
SELECTlower('PARAN'),upper('PontaGrossa');

iniciais maisculas
SELECTinitcap('DIRIO'),initcap('ol');

DICA: ln (a . b . c) = ln a + ln b + ln c
71

72

Funes de texto - II

Funes de texto - III

localizao de substring
SELECTposition('gre'in'PostgreSQL');

comprimento do texto
SELECTlength('Oitocentos');

extrair substring
SELECTsubstring('PRAIA'from2for3); SELECTsubstring('PRAIA'from3); SELECTsubstring('PRAIA'for3); SELECTsubstring('PRAIA'from'^..');

complementar texto (direita e esquerda)


SELECTrpad('abc',5,'*'), lpad('abc',5,'*');

repetir texto diversas vezes


SELECTrepeat('X',3),repeat('abc',2);

remover espaos laterais


SELECTtrim('abc'),rtrim('ab'), ltrim('ab');
73

substituir substrings no texto


SELECTreplace('abcabcabc','c','..');
74

Funes de texto - IV

Funes de texto Exerccio

clculo de MD5
SELECTmd5('senhasecreta'),md5('aaa');

reproduzir a seguinte sada via SQL


cursopg=>SELECT???FROMtabela; id|capitulo + 1|Primeiro......1 2|Segundo.......2 3|Terceiro......3 4|Quarto........4 5|Quinto........5 (5registros)

citao - aspas simples


SELECTquote_literal('C\'estvrai!');

extrair texto com delimitador


SELECTsplit_part('abc@fazenda.gov.br','@',1);

transformar texto em formato ASCII


SELECTto_ascii('Aafroderis');

75

76

Funes de busca de padro: LIKE


string[NOT]LIKEpattern

Funes de busca de padro: ER


operadores de expresso regular (POSIX)
SELECT*FROMtabela WHEREdes~'^qu'ANDdes~'to$'; SELECT*FROMtabela WHEREdes!~'qu(a|i)'; SELECT*FROMtabela WHEREdes~*'^Qu';
op.ao ~buscapadro(CS) ~*buscapadro(CI) !~nobusca(CS) !~*nobusca(CI)
77

operador padro SQL ANSI


SELECT*FROMtabela WHEREdesLIKE'%eiro'; SELECT*FROMtabela WHEREdesLIKE'qu__to'; SELECT*FROMtabela WHEREdesNOTLIKE'qu__to' ANDdesNOTLIKE'%eiro';

curingas: % e _

similar a ERs usadas em egrep, sed e awk

operadores

expsignificado ^inciodastring $finaldastring .qualquercaracter *0oumais +1oumais

ATENO: cuidado com o uso do LIKE pode provocar leituras do tipo full scan na tabela!

expresses regulares

78

Funes de formatao de tipo

Funes de data e hora

converter para text com o to_char()


SELECTto_char(now(),'HH12:MI:SS'); SELECTto_char(125,'00000'); SELECTto_char(125.8,'999D99S');

data, hora e data/hora atual


SELECTcurrent_date,current_time, current_timestamp,now();

calcular idade (duas verses)


SELECTage('20010410','19570613'); SELECTage('15000422'::timestamp);

converter para date com o to_date()


SELECTto_date('05122000','DDMMYYYY');

converter para numeric com o to_number()


SELECTto_number('2,454.8','9G999D9S');

extrair partes da data (ano, ms, ..., ms)


SELECTdate_part('hour',now());

truncar data/hora at determinado campo


SELECTdate_trunc('month',now());
80

valor

padro
79

Operadores de data e hora

Funes para lidar com seqncias

adio de data com intervalo ou hora


SELECTdate'20010928'+7; SELECTdate'20010928'+ '4months'::interval; SELECTdate'20010928'+time'03:00';

criar seqncia temporria


CREATETEMPSEQUENCEseq_temp;

buscar valor atual (com e sem atualizao)


SELECTnextval('seq_temp'); SELECTcurrval('seq_temp');
prximo valor ser exatamente o especificado

subtrao de data com intervalo ou hora


SELECTdate'20011001' date'20010928'; SELECTdate'20011001'7::int; SELECTtimestamp'2001092823:00' interval'22hours';
81

forar atualizao do valor


SELECTnextval('seq_temp');

SELECTsetval('seq_temp',100); SELECTsetval('seq_temp',100,false); SELECTnextval('seq_temp');


82

Expresses condicionais: case


CASEWHENconditionTHENresult [WHEN...] [ELSEresult] END

Expresses condicionais: case II


CASEexpression WHENvalueTHENresult [WHEN...] [ELSEresult] END

exemplo de utilizao

ATENO: apesar de til, evite utilizar este recurso!

exemplo de utilizao
SELECTnum, CASEnum%2 WHEN0THEN'par' ELSE'mpar' END FROMt1;

SELECTnum, CASE WHENnum%2=0THEN'par' ELSE'mpar' END FROMt1;

condio: par divisvel por 2

83

84

Expresses condicionais: coalesce

Funes de agregao

retorna o primeiro argumento no-nulo similar s funes NVL e IFNULL presentes em outros SGBDs
SELECTcoalesce(rg,cpf)asdocumento, age(coalesce(datnasc,now()))ASidade FROMTB_Cliente;

retornam um nico valor atravs de um conjunto de entradas podem ser criadas pelo usurio (UDAs) ex: contagem, mnimo e mximo
SELECTcount(1),count(*),count(num), min(num),max(num)FROMt1;

data de nascimento pode no estar cadastrada

SELECTprimeiro_nome||''|| coalesce(nome_meio,'')||sobrenomeAS nome_completo pessoa pode no FROMTB_Pessoa; possuir sobrenome


85

ex: mdia, desvio padro, varincia


SELECTavg(num),stddev(num), variance(num)FROMt2;
3 abordagens distintas para o COUNT()

86

Expresses de subconsulta: exists


EXISTS(subquery)

Expresses de subconsulta: in, not in


expression[NOT]IN(subquery)

exemplo de utilizao
SELECTnum FROMt1 WHEREEXISTS( SELECT1 FROMt2 WHEREt2.num=t1.num );
no precisa especificar campos ou *

retornar somente registros que estejam em outra tabela

SELECT*FROMt2 WHEREnumIN(SELECTnumFROMt1);

ATENO: evite utilizar se a subconsulta retornar muitos itens!

retornar somente itens que no estejam entre os valores determinados


SELECT*FROMt2 WHEREnumNOTIN(1,2,3);
88

subconsulta que referencia linhas externas


87

Funes de informao do sistema

Funes Exerccio 3a

verso e data/hora de inico da instncia


SELECTversion(), pg_postmaster_start_time();

criar a seqncia seq_boletos_id alterar a numerao inicial dela para 1001 verificar sua numerao atual criar e testar a funo rand():
CREATEFUNCTIONrand()RETURNSintAS$$ SELECTtrunc(random()*100)::int $$LANGUAGEsql; SELECTrand();

endereo IP e porta (servidor e cliente)


SELECT inet_server_addr(),inet_server_port(), inet_client_addr(),inet_client_port();

banco, esquema e usurio atuais


SELECTcurrent_database(), current_schema(),current_user, session_user,user;
89

90

Funes Exerccio 3b

Funes Exerccio 3c

criar a tabela boletos, contendo os seguintes campos:


popular a tabela boletos executando:


ALTERTABLEboletos ADDdummyint; INSERTINTOboletos(dummy) SELECT*FROMgenerate_series(1,1000);

id: inteiro, PK, default = valor da seqncia cliente: inteiro, obrigatrio, default = rand() linha: caracter(24), default =
to_char(current_date - rand() + current_time + (rand()::text || 'sec')::interval, 'YYYYMMDDHH12MISS') || trim(to_char((random() * 1e5)::numeric(10,2), repeat('0', 10)))

incluir os seguintes campos na tabela:


dthr: data/hora, no obrigatrio valor: nmero decimal 10;2, no obrigatrio

200701031212450000068484
ano ms dia hora min seg valor (2 decimais)

exemplo de linha

91

extrair os valores do campo linha e copi-los para dthr e valor, utilizando as funes de converso de tipos de dados92

Funes Exerccio 3d

listar os 10 maiores clientes, exibindo os valores totais e ordenados de modo decrescente exibir a mdia e o desvio padro dos valores dos boletos do ms de setembro exibir o menor e o maior valor de boleto do dia 01 de outubro de 2010 exibir os boletos cujo cdigo do cliente esteja na tabela t1 (campo num), ordenando pelo id e desconsiderando os 10 primeiros registros 93

Alterando dados

Antes de prosseguir o curso...

Incluindo linhas com INSERT

execute as seguintes instrues


CREATETABLEprodutos( idinteger, nometext, preconumeric ); CREATETABLEbio(valint); CREATETABLEcontas( idserialPRIMARYKEY, saldonumericDEFAULT0.0 );
95

inserindo uma linha por vez (ordenada)


INSERTINTOprodutos VALUES(1,'Queijo',9.99);
boa prtica!

especificando todas as colunas


INSERTINTOprodutos(id,nome,preco) VALUES(2,'Manteiga',2.34); INSERTINTOprodutos(nome,preco,id) VALUES('Presunto',7.55,3);

omitindo determinadas colunas


INSERTINTOprodutos(id,nome) VALUES(4,'Amendocrem');
ainda existe?
96

Incluindo linhas com INSERT II

Incluindo linhas com SELECT

as formas a seguir so extenses do PostgreSQL (fora do padro ANSI SQL) preenchendo com valores padres
INSERTINTOprodutos VALUES(5,'Mortadela',DEFAULT); INSERTINTOprodutos DEFAULTVALUES;

possvel incluir linhas com base em uma consulta SQL! criando novos produtos
INSERTINTOprodutos SELECTid+10,initcap(des), (random()*10)::numeric(10,2) FROMtabela;
dica: execute antes somente o SELECT

especificando diversas linhas de uma vez


INSERTINTOprodutosVALUES (6,'PoSrio',3.57), (7,'PoFrancs',0.28);
s a partir da verso 8.2...

aumentando a populao
INSERTINTObio SELECTgenerate_series(1,10);
a tabela duplicada a cada execuo

97

INSERTINTObioSELECT*FROMbio;

98

Criando tabelas com o SELECT

Incluindo linhas com COPY


COPYtablename[(column[,...])] FROM{'filename'|STDIN}

possvel criar uma tabela j populada com base em uma consulta SQL! criando uma tabela com parte dos boletos
SELECTid,cliente,dthr,valor INTObol_min a tabela de FROMboletos destino pode ser temporria WHEREdummy<10;

altamente recomendvel para a incluso de muitos registros! copiando pelo terminal


COPYprodutosFROMstdin;
finalizar com \.

os campos da nova tabela tm o mesmo tipo de dados dos que vm da consulta ateno: chaves primrias e ndices no so criados com essa sintaxe!

copiando a partir de um arquivo


COPYprodutosFROM'/tmp/prod.dat';
\Nvalornulo [tab]separadordecampos caminho absoluto: o arquivo deve existir no servidor

99

100

Gerando arquivos com COPY


COPYtablename[(column[,...])] TO{'filename'|STOUT}

Trabalhando com o formato CSV


exportando para o formato CSV
COPYprodutosTOstdoutDELIMITER';'CSV;

til para a exportao rpida de todas as linhas de uma determinada tabela copiando para o terminal
COPYprodutosTOstdout;

importando a partir de um arquivo CSV


$cat>impcsv.sql<<EOF COPYesquema.produtos FROMstdinDELIMITER';'CSV; 6;Maionese;3.45 7;Catchup;2.96 no esquea do \. terminador \. EOF
altere o nome do esquema

copiando para um arquivo


COPYprodutosTO'/tmp/prod.dat';
caminho absoluto: deve haver permisso de escrita no servidor

101

$psqlhscelepar05480p5432\ cursopgsa_cursopg<impcsv.sql

102

Alterando linhas com UPDATE

Alterando linhas com UPDATE II

aumentando em 10% o preo do queijo


UPDATEprodutos SETpreco=1.1*preco WHEREid=1;

a sintaxe UPDATE ... FROM


UPDATEprodutos SETpreco=0.85*preco FROMt1WHEREnum=id;

desconto de 5% em todos os produtos


UPDATEprodutos SETpreco=0.95*preco;
cuidado com isso!

exibir registros aps alterao


s a partir da UPDATEprodutos verso 8.2... SETpreco=1.05*preco WHEREid=2RETURNINGid,preco;

alterando vrias colunas de uma vez


UPDATEprodutosSETpreco=preco1.5, nome=nome||'Oferta' WHEREidIN(1,3,5);

sintaxe alternativa com lista de colunas


UPDATEprodutos SET(preco,nome)=(preco,nome);
104

103

Excluindo linhas de uma tabela

Alterando dados Exerccio 1

excluindo apenas determinadas linhas


DELETEFROMprodutos WHEREidISNULL;
cuidado com isso!

popule a tabela contas com base na instruo SQL de consulta a seguir


SELECTDISTINCTON(cliente) valorASsaldo,clienteASid FROMboletos WHEREcliente<=10;

excluindo todos os registros da tabela


DELETEFROMfilmes;

para remover todas as linhas da tabela de uma forma mais rpida, use o TRUNCATE
TRUNCATEfilmes; TRUNCATEfilmes,distribuidores; TRUNCATEfilmesCASCADE;
esvaziar em cascata
105

aumente em 5% o saldo das contas cuja identificao seja um nmero mpar exclua, com um s comando, as contas cujo nmero esteja presente na tabela t2 (campo num)

106

Alterando dados Exerccio 2

aumente o nmero de linhas da tabela bio para cerca de 1 milho execute a instruo a seguir
SELECTcount(1)asqtd,val FROMbioGROUPBYvalORDERBY2;

Controle de transaes

exclua somente os registros cujo campo val seja igual a 2, da maneira mais rpida possvel dica: use os comandos SELECT..INTO, TRUNCATE e INSERT INTO..SELECT
107

Integridade dos dados: ACID

Controle de concorrncia: MVCC

Atomicidade

modelo tradicional de row-locking

transao inseparvel - tudo ou nada a transao garante estado final consistente transaes no so afetadas por mudanas ocorridas em transaes concorrentes ao finalizar uma transao com o COMMIT, as alteraes so permanentes

Consistncia

bloqueio de linhas (ou pginas) durante toda uma alterao

Isolamento

modelo MVCC (Multiversion Concurrency Control)


mltiplas verses para cada linha minimiza conteno por lock para permitir desempenho razovel em ambientes com muitos usurios simultneos
110

Durabilidade

109

Como funciona o MVCC?

O que uma transao?

cada transao v uma foto do banco de dados (uma verso) como era quando ele iniciou, independente do que as transaes concorrentes estejam fazendo leitura no bloqueia escrita escrita no bloqueia leitura o MVCC torna possvel o backup a quente com consistncia
111

uma transao agrupa diversas operaes em uma nica operao atmica o resultado da transao tudo ou nada
BEGIN; UPDATEcontas SETsaldo=saldo+100.00 WHEREid=2588; UPDATEcontas SETsaldo=saldo100.00 WHEREid=7534; COMMIT;
112

uma transao

Pontos de gravao (savepoints)

Nveis de isolamento transacional

um savepoint uma marca especial dentro de uma transao que permite com que as instrues possam ser desfeitas (rollback) parcialmente na transao
BEGIN; UPDATEcontasSETsaldo=saldo+100.00WHEREid=2588; SAVEPOINToperacao_credito; UPDATEcontasSETsaldo=saldo100.00WHEREid=7534; ROLLBACKTOoperacao_credito;
ops, conta errada!

o padro SQL define quatro nveis de isolamento transacional em termos de trs fenmenos que devem ser prevenidos entre transaes concorrentes:

uma transao

dirty read: a transao l dados escritos por uma transao concorrente no-finalizada nonrepeatable read: a transao rel dados que previamente j obteve e percebe que estes foram modificados por outra transao phantom read: a transao reexecuta uma consulta SQL e as linhas resultantes mudam por causa de alteraes de outra transao

UPDATEcontasSETsaldo=saldo100.00WHEREid=7584; COMMIT;
113

114

Nveis de isolamento transacional

O nvel read committed

no PostgreSQL pode ser requerido um dos 4 tipos de isolamento padro SQL, sendo que internamente existem apenas 2 nveis
Nvel de Isolamento Read uncommitted Read committed Repeatable read Serializable
115

o nvel default do PostgreSQL cada comando inicia com um snapshot com todas as modificaes feitas at o instante, e subseqentes comandos na mesma transao vero os efeitos das transaes concorrentes que finalizaram modo adequado para a maioria das aplicaes, sendo rpido e simples de usar para aplicaes com consultas e atualizaes complexas preciso utilizar um nvel de isolamento mais rigoroso

Dirty Read possvel

Nonrepeatable Phantom Read Read possvel possvel possvel possvel possvel


116

O nvel serializable

Nveis de bloqueio (lock)

o nvel de isolamento mais restritivo emula execuo de transaes de modo serial, como se estas tivessem sido rodadas uma aps a outra, no de modo concorrente a transao nunca v dados no efetivados ou alteraes efetuadas por outras transaes concorrentes durante a execuo da transao sucessivas consultas dentro de uma transao vem o mesmo resultado
117

existem diversos modos de bloqueio (lock) para controlar o acesso concorrente dos dados nas tabelas as instrues SQL automaticamente adquirem nveis de bloqueio adequados para garantir a integridade dos objetos nveis de bloqueio incluem: de tabela, de linha, deadlocks e consultivo (advisory) para visualizar os bloqueios ocorrendo no servidor, utilize a viso pg_locks
118

Protegendo as linhas de alteraes

Transaes Exerccio

para proteger de transaes concorrentes uma linha ou uma tabela inteira, podem ser usadas as clusulas SELECT FOR UPDATE SHARE, ou LOCK TABLE
BEGIN; SELECTsaldoFROMcontas WHEREid=2588FORUPDATE; ... UPDATEcontas SETsaldo=novo_valorWHEREid=2588; COMMIT;
119

terminal 1
BEGIN; SELECT*FROMcontas WHEREid=10; UPDATEcontas SETsaldo=0.0 WHEREid=10; COMMIT; UPDATEcontas SETsaldo=5.0 WHEREid=10;

tempo

terminal 2
SHOWdefault_ transaction_isolation; BEGIN; SELECT*FROMcontas WHEREid=10; SELECT*FROMcontas WHEREid=10 FORUPDATE; DELETEFROMcontas; ROLLBACK;
120

a consulta agir como se fosse uma alterao

lock?

lock?

consulte a viso pg_locks a cada ponto de conflito

Os esquemas (schemas)

Outros objetos de banco de dados

fornecem meios de separar os objetos dentro do banco de dados, tal como diretrios em uma hierarquia de arquivos (mas com apenas um nvel) esquemas so usados basicamente para:

agrupar de modo lgico os objetos de um banco de dados implantar a segurana dos objetos de acordo com os usurios ou papis (roles) evitar colises de nomes em bancos de dados grandes

122

Manipulando esquemas

Os espaos de tabela (tablespaces)

criando um esquema
CREATESCHEMAhistorico;

um tablespace nos permite especificar onde sero armazenados fisicamente:


criando objetos dentro do esquema


CREATETABLEhistorico.log( idserial,destext);

bancos de dados esquemas tabelas ndices

BD-1

BD-2

BD-3

BD-4

usando o caminho de busca


SHOWsearch_path; SETsearch_pathTOhistorico,public;

vantagens:

disco a

disco b

disco c

granularidade a nvel de objeto aumenta o desempenho e controle sobre a utilizao de cada disco rgido maior flexibilidade para gerenciar espao
124

excluindo o esquema em cascata


DROPSCHEMAhistoricoCASCADE;
123

Os ndices (indexes)

Comparativo de ndices em SGBDRs

ndices so estruturas de dados que visam aumentar o desempenho do banco de dados um ndice garante eficincia na recuperao de registros especficos de uma tabela em operaes de consulta analogia: ndices de um livro-texto em contrapartida, ndices podem causar um overhead no sistema como um todo, e por isso devem ser criados com cautela
125

Fonte: http://en.wikipedia.org/ (acesso em Fevereiro de 2007)

126

Manipulando ndices

As vises (views)

criando um ndice de chave primria


ALTERTABLEprodutos ADDPRIMARYKEY(id);
criao do ndice implcita em PKs

uma viso encapsula uma consulta SQL atravs de uma tabela virtual tem como objetivos:

criando um ndice nico


CREATEUNIQUEINDEXprodutos_i01 ONprodutos(nome);

esconder detalhes das tabelas reduzir complexidade das consultas aumentar a segurana atravs de acesso seletivo aos dados

criando um ndice funcional


CREATEINDEXprodutos_i02 ONprodutos(upper(to_ascii(nome)));

o PostgreSQL ainda no suporta vises materializadas


128

ndices sero abordados em momento oportuno

127

Manipulando vises

As seqncias (sequences)

criando uma viso


CREATEVIEWfaixa_boletos_25AS SELECTid,dthr, round(valor/100,0)*100ASfaixa FROMboletos WHEREcliente=25;

as seqncias so objetos geradores de nmero inteiro estruturalmente so tabelas que possuem apenas uma linha e diversos campos de controle podem ser temporrias ou materializadas para consultar ou atualizar o nmero atual so usadas funes especficas usar seqncia em tabelas pode fazer com que buracos sejam criados nelas

consultando uma viso


SELECT*FROMfaixa_boletos_25;

excluindo uma viso


DROPVIEWfaixa_boletos_25;
129

130

As restries (constraints)

Restries adiveis (deferred)

enquanto o tipo de uma coluna define o formato de dado aceitvel nela; as restries permitem maior flexibilidade na verificao dos dados tipos de restries suportadas:

as restries de chave estrangeira podem ser adiveis (deferred), o que faz com que a verificao de integridade referencial seja somente no final da transao isso resolve o problema clssico da referncia cclica entre duas tabelas (ex: funcionrios e departamento) PostgreSQL e Oracle so um dos poucos SGBDs que suportam deferred constraints em outros SGBDs, usam-se triggers
132

check: verificao de acordo com expresso not null: obrigatoriedade de preenchimento unique: exclusividade do valor na tabela primary key: chave primria (unique+not null) foreign key: chave estrangeira
131

Os disparadores (triggers)

Blobs no PostgreSQL

um disparador (trigger) faz com que uma funo seja executada quando determinado evento (ie: instruo DML) ocorre em uma tabela pode ser definido para ser executado antes ou depois de um INSERT, UPDATE ou DELETE, pela instruo (statement) ou por linha alterada a funo de trigger deve ser definida em uma das disponveis linguagens procedurais instaladas no banco

o padro SQL define o tipo BLOB (binary large object) a fim de armazenar dados binrios como imagens, sons e arquivos em geral o PostgreSQL fornece o tipo de dados bytea (byte array) para esse tipo de aplicao internamente, o tipo bytea tratado como uma cadeia de octetos (binary string), e tem comprimento varivel
134

133

Outros objetos extensveis

Outros objetos Exerccio 1a

funes de agregao

crie as seguintes tabelas


CREATETABLEdepartamentos( idintNOTNULL, nometextNOTNULL, gerente_idintNOTNULL, PRIMARYKEY(id) ); CREATETABLEfuncionarios( idintNOTNULL, nometextNOTNULL, depto_idintNOTNULL, PRIMARYKEY(id) );

COUNT(), SUM(), MAX() e MIN() +-*/<>=~!@#%^&|`? reutilizao de restries de verificao converso entre codificaes (ex: UTF-8)
135

operadores

domnios

converses

136

Outros objetos Exerccio 1b

Outros objetos Exerccio 1c

crie os seguintes relacionamentos entre as duas tabelas


ALTERTABLEdepartamentos ADDFOREIGNKEY(gerente_id) REFERENCESfuncionarios(id); ALTERTABLEfuncionarios ADDFOREIGNKEY(depto_id) REFERENCESdepartamentos(id);

recrie as restries, mas de forma adivel


ALTERTABLEfuncionarios DROPCONSTRAINTfuncionarios_depto_id_fkey; ALTERTABLEfuncionarios ADDFOREIGNKEY(depto_id) REFERENCESdepartamentos(id) INITIALLYDEFERRED;
verificao de chave estrangeira s ser feita ao final da transao

inclua algumas linhas nas duas tabelas, atentando integridade referencial entre departamentos e funcionrios
137

ALTERTABLEdepartamentos DROPCONSTRAINTdepartamentos_gerente_id_fkey; ALTERTABLEdepartamentos ADDFOREIGNKEY(gerente_id) REFERENCESfuncionarios(id) INITIALLYDEFERRED;

138

Outros objetos Exerccio 1d

Outros objetos Exerccio 2

tente novamente inserir os registros, mas dentro de uma transao


BEGIN; INSERTINTOfuncionarios VALUES(1001,'Anacleto',10); INSERTINTOfuncionarios VALUES(1002,'Berlio',10); INSERTINTOdepartamentos VALUES(10,'RecursosHumanos',1001); END;
139

use o cdigo-fonte em Java fornecido compile as classes seguindo essa ordem:


1) Conexao.java 2) GravarBlob.java 3) LerBlob.java

inclua, usando o programa GravarBlob, alguns arquivos no campo foto da tabela funcionarios use o programa LerBlob e o psql para verificar se os arquivos foram gravados

140

Outros objetos Exerccio 2 (a)


importjava.sql.*; publicclassConexao{ $javaccp~/lib/pgsql.jarConexao.java

Outros objetos Exerccio 2 (b)


importjava.io.*; importjava.sql.*; publicclassGravarBlob{ $javaccp.GravarBlob.java $javacp.:~/lib/pgsql.jarGravarBlob\ 1001/tmp/foto.png

privateConnectionconn; privatestaticConexaoinstancia; publicConnectiongetConnection()throwsSQLException{ DriverManager.registerDriver(neworg.postgresql.Driver()); Connectionconn=DriverManager.getConnection( "jdbc:postgresql://scelepar05480:5432/cursopg", "sa_cursopg","********"); returnconn; } publicstaticConexaogetInstance(){ if(instancia==null) instancia=newConexao(); returninstancia; } ... }

... publicvoidgravar(intid,Stringarq)throwsException{ Filefile=newFile(arq); InputStreamfis=newFileInputStream(file); PreparedStatementps=conexao.prepareStatement( "UPDATEfuncionariosSETfoto=?WHEREid=?"); ps.setBinaryStream(1,fis,(int)file.length()); ps.setInt(2,id); ps.executeUpdate(); ps.close(); fis.close(); } }

classe de uso comum que registra o driver JDBC do PostgreSQL e efetua a conexo com o banco de dados

141

classe que recebe como argumentos a identificao do funcionrio e o caminho absoluto de um arquivo, gravando-o no banco de dados

142

Outros objetos Exerccio 2 (c)


importjava.io.*; importjava.sql.*; publicclassLerBlob{ ... publicvoidler(intid)throwsException{ PreparedStatementps=conexao.prepareStatement( "SELECTfotoFROMfuncionariosWHEREid=?"); ps.setInt(1,id); ResultSetrs=ps.executeQuery(); if(rs!=null){ while(rs.next()){ byte[]imgBytes=rs.getBytes(1); System.out.println("Tamanhodaimagem:"+imgBytes.length); } rs.close(); } classe que recebe como argumento ps.close(); a identificao do funcionrio, } } $javaccp.LerBlob.java $javacp.:~/lib/pgsql.jarLerBlob1001

Mdulos adicionais do diretrio contrib

lendo o arquivo correspondente no banco de dados

143

O que esse diretrio?

Que tipo de coisa h nele?

o PostgreSQL foi projetado para ser facilmente extensvel, o que faz com que seus add-ons funcionem tal como se fossem features incorporadas no core do sistema o diretrio contrib, que acompanha o cdigo-fonte do PostgreSQL, contm um grande nmero de extenses para o SGBD no contrib esto as extenses de grande interesse aos usurios, mas no a ponto de serem incorporadas ao core do PostgreSQL 145

ferramentas de converso

dbf2pg, ora2pg ltree, isbn_issn, chkpass tsearch2, btree_gist, pg_trgm pgbench, dblink, xml2, earthdistance, fuzzystrmatch, pgcrypto, spi, oid2name, admin81, reindexdb

tipos de dados adicionais

mtodos de indexao adicionais

outras extenses

146

O mdulo pg_bench

Usando o pg_bench

pgbench um programa que executa testes de benchmark no padro TPC-B uma aplicao cliente do PostgreSQL e roda apenas com este SGBD ele efetua diversas transaes pequenas e simples incluindo operaes SELECT, UPDATE e INSERT, e ao final calcula o nmero de transaes completadas com sucesso por unidade de tempo as transaes por segundo (tps)
147

inicializar o banco de testes


$supostgres $createdbpgb $pgbenchipgbs2
escala: influencia o nmero de linhas geradas em cada tabela (default = 1)

executar o teste de benchmark


$pgbenchpgbc5t10d
nmero de clientes modo debug
148

transaes por cliente

O mdulo dblink

Funes disponibilizadas pelo dblink

dblink um mdulo que permite consultas em bancos de dados distintos (mesmo em outro servidor) utilizando chamadas de funes as consultas limitam-se a servidores de banco de dados PostgreSQL prov funes para conexo, retorno de linhas, cursores e execuo de instrues para acessar dados de outros SGBDs existem outros add-ons, como o DBI-Link
149

de conexo

dblink_connect(), dblink_disconnect() dblink_open(), dblink_fetch(), dblink_close() dblink_exec() dblink_current_query(), dblink_get_pkey() dblink()

de cursores

de execuo

miscelneas

de consulta

150

Instalando o dblink

Usando o dblink

instalar o pacote contrib no Debian


#aptgetinstallpostgresqlcontrib8.1

consultando uma tabela de outro servidor


SELECTpreco,nome_produtoFROMdblink(' host=localhostdbname=cursopg user=sa_cursopgpassword=*****',' SELECTnome,precoFROMprodutos WHEREprecoISNOTNULL ORDERBY2DESCLIMIT5')AS( nome_produtotext,preconumeric(10,2));

instalar o mdulo dblink no banco de dados


#supostgres $psqlbancof\ /usr/share/postgresql/8.1/contrib/dblink.sql

inserindo linhas na tabela externa


SELECTdblink_exec(' host=localhostdbname=cursopg user=sa_cursopgpassword=*****',' INSERTINTOprodutos VALUES(30,''Torrone'',25.0)');

verificar se foi instalado com sucesso


$psqlbanco banco=>\dfdblink*
151

152

Exerccio 1 - pgbench

Exerccio 2 - dblink

ateno: execute as instrues a seguir no seu servidor PostgreSQL local! mude para o usurio postgres crie um banco de dados para o teste no banco de dados, inicialize a base do pgbench com escala 10 (100 mil linhas) execute os seguintes testes no pgbench:

crie uma viso no seu banco de dados e esquema que consulte a tabela de pases em outro banco de dados PostgreSQL informaes para conexo:

servidor: scelepar05480.celepar.parana porta: 5432 banco: cursopg usurio: sa_cursopg senha: ***** esquema: cep
154

a) 10 usurios com 10 transaes cada b) 10 usurios com 100 transaes cada c) 100 usurios com 10 transaes cada
153

Bibliografia
PostgreSQL 8.4 Documentation www.postgresql.org/docs www.pgadmin.org Luciano Mittmann mittmann@gmail.com