Você está na página 1de 70

PHP e PostgreSQL

Diego Rodrigo Cabral Silva & George Christian Th 6 de novembro de 2001


Sumrio
1 Introduo
1.1 1.2 1.3 1.4 Client-side scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Server-side scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . O que PHP? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . O que pode ser feito com PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6
6 6 6 6

2 Enviando os dados para o servidor web 3 Formulrios HTML


3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 Denindo um formulrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A tag <input> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6 7
7 7 7 8 8 8 8 8 8 9 9 9

Campo de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Campo de texto com mscara . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . checkbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . radio button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . submit button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . reset button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.10 textarea

3.11 select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.12 le . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4 Sintaxe bsica
4.1 4.2 4.3 4.4 4.5 Delimitador de cdigos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Separador de instrues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9
9 10 10 10 11

Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comentrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Imprimindo cdigo HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5 Tipos
5.1 5.2 5.3 5.4 Inteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nmeros em ponto utuante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11
11 11 12 12

6 Operadores
6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 Operadores aritmticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores de strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13
13 13 13 14 14 14 14 15

Operadores de atribuio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores bit a bit Operadores lgicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Operadores de comparao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores de expresso condicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Operadores de incremento e decremento

7 Estruturas de controle
7.1 7.2 7.3 7.4 7.5 7.6 7.7 Blocos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . While . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15
15 17 18 18 19 19 20

do..while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8 Funes
8.1 8.2 8.3 Denindo funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Valor de retorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21
21 21 21

Argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9 Variveis e Constantes
9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 Declarao de uma varivel O modicador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23
23 23 24 24 25 25 25 25 26 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

static

Variveis variveis

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Variveis enviadas pelo navegador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizando arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variavveis de ambiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Vericando se uma varivel possui um valor

Constantes pr-denidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Denindo constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10 Utilizando cookies
10.1 O que so? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2 Gravando cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3 Lendo cookies gravados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26
26 26 27

11 A Histria do PostgreSQL 12 Software Open Source 13 Stored Procedures 14 Trigger


14.1 Aplicaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27 28 29 30
30

15 Alguns comandos no banco de dados


15.1 Comeando uma sesso de banco de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.2 Escolhendo qual interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30
30 30 30

15.3 Comeando uma sesso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

16 Comandos bsicos em SQL


16.1 Criando tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.2 Adicionando dados com Insert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.3 Visualizando dados com Select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31
31 31 32 32 32 33 33 33

16.4 Selecionando linhas especcas com a clusula Where . . . . . . . . . . . . . . . . . . . . . 16.5 Removendo dados com Delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.6 Modicando dados com Update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.7 Ordenando dados com Sort by . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.8 Destruindo tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17 Tipos de Dados
17.1 Tipos Numricos 17.1.1 Tipo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34
34 34 35 35 35 35 36 36 36 37 37 38

Serial

17.1.2 Tipo Monetrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.2 Tipos caracter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.3 Tipo data/hora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.3.1 Entrada de Data/hora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.3.2 Hora sem Fuso Horrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.3.3 Hora com Fuso Horrio 17.3.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

interval

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17.3.5 Valores Especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.3.6 Sada de data/hora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.4 Tipo Booleano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18 Alguns comandos adicionais em SQL


18.1 Aspas dentro de um texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18.2 Usando valores nulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18.3 O uso de valores DEFAULT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18.4 Comentrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18.5 Uso de OR e AND 18.6 Alcance de Valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39
39 39 40 40 40 40 41 41

18.7 Comparao Like . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18.8 Clusula CASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19 Unindo Tabelas
19.1 Tabelas e referncias colunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.2 Tabelas Agrupadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.3 Criando tabelas agrupadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.4 Realizando agrupamentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42
42 42 44 45 46 47 47

19.5 Escolhendo uma chave de agrupamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.6 Agrupamentos um-para-muitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19.7 Chaves primrias e Chaves estrangeiras . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20 Numerando linhas
20.1 Nmeros de Identicao de Objetos (OIDs) . . . . . . . . . . . . . . . . . . . . . . . . . . 20.2 Limitaes dos Nmeros de Identicao de Objetos . . . . . . . . . . . . . . . . . . . . .

49
49 50 50 50 50 51 51 52 52

20.2.1 Numerao no sequencial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20.2.2 No modicvel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20.2.3 No feito o back up por padro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20.3 Sequncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20.4 Criando Sequncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20.5 Usando Sequncias para numerar linhas 20.6 Tipo Serial . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21 Performance
21.1 ndices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2 Indces nicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

54
54 54

22 Controlando Resultados
22.1 Limites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

56
56

23 Administrao de Tabelas
23.1 Tabelas Temporrias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23.2 Alteraes de Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

57
57 57

24 Chaves e constantes
24.1 Not Null . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24.2 Unique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24.3 Chave Primria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24.4 Chave Estrangeira, REFERENCES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

59
59 59 59 60

25 Php e sua interao com PostgreSQL


25.1 Abrir Conexo com o banco de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25.2 Executar uma consulta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25.3 Tratamento dos dados enviados na consulta . . . . . . . . . . . . . . . . . . . . . . . . . .

62
62 63 63 64 64

25.4 Exibir os dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25.5 Fechar Conexo com o banco de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Introduo
Estes so scripts executados no lado cliente, ou seja, no browser. Esse tipo de script no tem contato

1.1 Client-side scripts


com o servidor. Servem para validar formulrios e interagir com o usurio em algumas tarefas. Geralmente so implementados em JavaScript. Por eles no terem contato com o servidor, descentralizam o processamento e no provocam trfego na rede.

1.2 Server-side scripts


Esses so os scripts responsveis pela criao de pginas em tempo real. Como eles tem contato com o servidor, eles utilizam dados armazenados neles para formar a pgina. Na verdade, o que existe um modelo da pgina que ser mesclado com os dados no momento em que a pgina requisitada.

1.3 O que PHP?


PHP uma linguagem que permite criar sites WEB dinmicos, possibilitando uma interao com o usurio atravs de formulrios, parmetros da URL e links. A diferena de PHP com relao a linguagens semelhantes a JavaScript que o cdigo PHP executado no servidor, sendo enviado para o cliente apenas HTML puro. Desta maneira possvel interagir com bancos de dados e aplicaes existentes no servidor, com a vantagem de no expor o cdigo fonte para o cliente. Isso pode ser til quando o programa est lidando com senhas ou qualquer tipo de informao condencial. O que diferencia PHP de um script CGI escrito em C ou Perl que o cdigo PHP ca embutido no prprio HTML, enquanto no outro caso necessrio que o script CGI gere todo o cdigo HTML, ou leia de outro aquivo.

1.4 O que pode ser feito com PHP


Basicamente, qualquer coisa que possa ser feita por algum programa CGI pode ser feita tambm com PHP, como coletar dados de um fomulrio, gerar pginas dinamicamente ou enviar e receber

cookies .

PHP tambm tem como uma caracterstica muito importante o suporte a um grande nmero de banco de dados, como dBase, Interbase, mSQL, mySQL, Oracle, Sybase, PostgreSQL e vrios outros. Construir uma pgina baseada em um banco de dados torna-se uma tarefa extremamente simples com PHP. Alm disso, PHP tem suporte a outros servios atravs de protocolos como IMAP, SNMP, NNTP, POP3 e, logicamente, HTTP. Ainda possvel abrir

sockets

e interagir com outros protocolos.

Enviando os dados para o servidor web


Pode-se denir um programa em trs partes principais: entrada de dados, processamento dos mesmos,

e o retorno deles para o usurio. Na programao para a web no diferente. Para que o interpretador PHP possa processar os dados, temos primeiro que passa-los pra o computador onde ele est instalado. Dentre os mtodos implementados pelo HTTP, os dois mais usados por programadores PHP para o envio de dados ao servidor so os mtodos GET e POST. O mtodo GET envia informaes atravs da URL (Uniform Resource Locator). Existem pelo menos duas desvantagens em se utilizar esse mtodo. A primeira que a quantidade de dados limitada em 1024 caracteres, o que pode no ser suciente para determinadas aplicaes, a segunda que os dados enviados aparecem no endereo do arquivo PHP e so visveis para o usurio, o que no recomendado para aplicaes que utilizam dados sigilosos, como senhas por exemplo.

Formulrios HTML
Como todos os componentes em um documento html, um formulrio denido por tags. A tag

3.1 Denindo um formulrio


<form>
indica o incio do formulrio e a tag

</form>

indica o nal do mesmo. Dessa maneira possvel

colocar vrios formulrios em um mesmo documento html. Abaixo esto algumas opes da tag

form .

<form name="" action="" method="" enctype="">


Onde:

name: o nome que identica o formulrio no documento HTML; action: caminho do script que receber os dados do formulrio; method: mtodo de envio dos dados (get ou post); enctype: formato em que os dados sero enviados;
Um exemplo tpico de denio de um formulrio :

<form name="sinec" action="sinec1.php" method="post"> Elementos do formulrio </form>


Os elementos do formulrio so identicados pelo script receptor atravs de um nome. Esse nome, ser passado via tag do elemento.

<input> ,

que alm disso dene outras caractersticas importantes como tipo e tamanho

3.2 A tag <input>


A maioria dos elementos dos formulrios so denidos pela tag

<input> .

Cada tipo de elemento possui

parmetros prprios, mas todos possuem pelo menos dois parmetros em comum: de elemento, e

type ,

que dene o tipo

name ,

que dene o nome daquele elemento.

3.3 Campo de texto


<input type="" text="" name="" value="" size="" maxlength="">
Exibe na tela um campo para entrada de texto com apenas uma linha.

value - o valor pr-denido do elemento, que aparecer quando a pgina for carregada; size - o tamanho do elemento na tela, em caracteres; maxlength - o tamanho mximo
texto contido no elemento, em caracteres.

do

3.4 Campo de texto com mscara


<input type="password" name="" value="" size="" maxlength="">
A nica diferena deste tipo para o anterior que sero apresentados asteriscos no lugar do texto. So comumente utilizados para senhas.

3.5 checkbox
<input type="checkbox" name="" value="" checked>
Utilizado para campos de mltipla escolha, onde o usurio pode marcar mais de uma opo.

value

- o valor que ser enviado ao servidor quando o formulrio for submetido, no caso do

campo estar marcado; j aparece marcado.

checked

- o estado inicial do elemento. Quando presente, o elemento

3.6 radio button


<input type="radio" name="" value="" checked>
Parecido com o tipo anterior. A diferena que so utilizados para o usurio poder marcar apenas uma opo do grupo. Para agrupar vrios elementos deste tipo, basta atribuir o mesmo nome a eles.

3.7 submit button


<input type="submit" name="" value="">
Utilizado para enviar os dados do formulrio para o script descrito na seo action da denio do formulrio.

value - o texto que aparecer no boto.

3.8 reset button


<input type="reset" name="" value="">
Utilizado para fazer todos os campos do formulrio voltarem ao valor original, de quando a pgina foi carregada.

3.9 button
<input type="button" name="" value="">
Utilizado para ativar funes de scripts client-side (JavaScript, por exemplo).

3.10 textarea
<textarea cols="" rows="" name="" wrap="">texto</textarea>
Exibe na tela uma caixa de texto, com o tamanho denido pelos parmetros cols e rows.

cols

- nmero de colunas do campo, em caracteres;

caracteres;

wrap - maneira como so tratadas as quebras de linha automticas.

rows

- nmero de linhas do campo, em O valor soft

faz com que o texto quebre somente na tela, sendo enviado para o servidor o texto da maneira como foi digitado; o valor hard envia o texto ao servidor com todas as quebras que aparecem na tela; o valor o  faz com que o texto no quebre na tela nem quando enviado ao servidor.

3.11 select
<select name="" size="" multiple> <option value="">text</option> </select>
Se o valor size tiver o valor 1 e no houver o parmetro multiple, exibe na tela uma combo box. Caso contrrio, exibe uma select list.

multiple - se presente, permite selecionar mais de uma linha, atravs das teclas Control ou Shift; option - cada item do tipo option acrescenta uma linha ao select; value - valor a ser enviado ao servidor se aquele elemento for selecionado. Default: o texto do item; text - valor a ser exibido para aquele item. Se
- nmero de linhas exibidas. Default: 1; posiciona entre as tags

size

<option>

</option> .

3.12 le
<input type="file" name="" size="">
Exibe na tela um campo de texto e um boto, que ao clicado abre uma janela para localizar um arquivo no disco. Para utilizar este tipo de componente, o formulrio dever utilizar o mtodo POST e ter o parmetro enctype com o valor  multipart/form-data .

10

Sintaxe bsica
O cdigo PHP inserido diretamente no documento HTML e diferenciado a partir de tags especiais

4.1 Delimitador de cdigos


que indicam o seu incio e m. Abaixo esto as vrias maneiras de se utilizar cdigos PHP em pginas HTML.

<?php //tag que indica o incio do script corpo do script ?> //tag que indica o fim do script <script language=''php''> //tag que indica o incio do script corpo do script </script> //tag que indica o fim do script <? //tag que indica o incio do script corpo do script ?> //tag que indica o fim do script <% //tag que indica o incio do script corpo do script %> //tag que indica o fim do script
Entre esses quatro, os delimitadores de cdigo mais utilizados entre programadores PHP o terceiro tipo, que uma abreviao do primeiro. Para utiliz-lo, necessrio habilitar a opo

short-tags

na

congurao do PHP, da mesma maneira, para usar o quarto tipo temos que habilit-lo no arquivo de congurao

php.ini .

4.2 Separador de instrues


Em PHP, cada instruo deve acabar com um ponto-e-vrgula, da mesma forma que as linguagens C e Perl. Na ltima instruo do bloco de script no necessrio o uso do ponto-e-vrgula, mas por questes estticas recomenda-se o uso sempre.

4.3 Variveis
As variveis em PHP iniciam com o caracter $ seguido de uma string que identica a varivel. Essa string deve comear com uma letra ou o caracter  _. O nome da varivel caso sensitivo, ou seja, a varivel $var diferente da varivel $Var.

$var = "Bob"; $Var = "Joe"; echo "$var, $Var";

// Sada "Bob, Joe"

11

4.4 Comentrios
Basicamente existem dois tipos de comentrios em PHP:

Comentrios de uma linha: Marca como comentrio at o nal da linha ou at o nal do bloco de instrues PHP. Pode ser delimitado pelo caracter # ou por duas barras //.

Comentrios de mais de uma linha: Tem como delimitadores os caracteres /* para o incio do bloco e */ para o nal do comentrio.

4.5 Imprimindo cdigo HTML


Na maioria dos casos, o objetivo de um programa PHP gerar um documento HTML. Para que isso seja possvel deve-se utilizar uma das funes de impresso: escolher um dos seguintes formatos:

{echo}

{print} .

Para utiliz-las deve-se

print(argumento); echo (argumento1, argumento2, ...); echo argumento;

12

Tipos
PHP suporta os seguintes tipo:

Array Ponto utuante Inteiro Objeto String

O tipo da varivel usualmente no escolhida pelo programador. Isso decidido em tempo de execuo pelo PHP dependendo do contexto no qual ela usada. possvel forar uma varivel a ser convertida para um certo tipo atravs do funo settype nela.

typecasting , ou usando a

5.1 Inteiros
Inteiros podem ser especicados usando qualquer umas das sintaxes abaixo:

$a $a $a $a

= = = =

1234; -123; 0123; 0x12;

# # # #

nmero nmero nmero nmero

decimal decimal negativo na base octal (equivalente ao 83 decimal) na base hexadecimal (equivalente ao 18 decimal)

O tamanho de um inteiro depende da plataforma. Para uma plataforma de 32 bits o mximo valor inteiro de 2 bilhes.

5.2 Nmeros em ponto utuante


Nmeros em ponto utuante (doubles) podem ser especicados usando qualquer umas das sintaxes abaixo:

$a = 1.234; $a = 1.2e3; // equivalente a 1200

5.3 Strings
Strings podem ser especicadas usando um dos conjuntos de delimitadores: a) utilizando aspas simples (') - desta maneira, o valor da varivel ser exatamente o texto contido entre as aspas (com exceo de

e ')

b) utilizando aspas duplas () - desta maneira, quaquer varivel ou caracter de escape ser expandido antes de ser atribudo.

13

<? $teste = "III Sinec"; $teste2 = 'Apostila do $teste de PHP e PostgreSQL\n'; echo "$teste2"; ?> // A sada desse script ser: ``Apostila do $teste de PHP e PostgreSQL\n''. <? $teste = "III Sinec"; $teste2 = "Apostila do $teste de PHP e PostgreSQL\n"; echo "$teste2"; ?> // A sada desse script ser: ``Apostila do III Sinec de PHP e PostgreSQL''.
A tabela abaixo lista os caracteres de escape:

Sintaxe Signicado
\n \r \t \\ \$ \' \
Nova linha Retorno (semelhante a Tabulao horizontal A prpria barra ( \) O simbolo $ Aspas simples Aspas duplas Tabela 1: Caracteres de escape

\n)

5.4 Arrays
Em PHP existem arrays associativos e escalares. Ambos funcionam como tabelas de disperso, onde os ndices so as chaves de acesso aos dados. Por exemplo:

$a[0] = "abc"; $a[1] = "def"; $b["sinec"] = 13;


Equivalentemente pode-se escrever:

<? $cor = array(1 => "vermelho", 2 => "verde", 3 => "azul", "teste" => 1); ?>

14

Operadores
Tais operadores devem ser usados com operandos numricos. Se forem de outro tipo, sero convertidos

6.1 Operadores aritmticos


antes da operao. + * / % adio subtrao multiplicao diviso mdulo (resto da diviso)

Tabela 2: Operadores Aritmticos

6.2 Operadores de strings


O nico operador exclusivo para strings vem a seguir: . concatenao

Tabela 3: Operador de string

6.3 Operadores de atribuio


Existe um operador bsico de atribuio e diversos derivados. No caso dos operadores derivados de atribuio, a operao feita entre os dois operandos, sendo atribuda o resultado para o primeiro. = += -= *= /= %= .= atribuio simples atribuio com adio atribuio com subtrao atribuio com multiplicao atribuio com diviso atribuio com mdulo atribuio com concatenao

Tabela 4: Operadores de atribuio

exemplo:

<? $a = 7; $a passa aconter o valor 7 $a += 2; // $a passa a conter o valor 9 ?>

15

6.4 Operadores bit a bit


Comparam dois nmeros bit a bit. & | e lgico ou lgico ou exclusivo no (inverso) shift left shift right

^ ~
 

Tabela 5: Operadores bit a bit

6.5 Operadores lgicos


Utilizados para inteiros representando valores booleanos. and or xor ! && || e lgico ou lgico ou exclusivo no (inverso) e lgico ou lgico

Tabela 6: Operadores lgicos Existem dois operadores para e e para ou porque eles tem diferentes posies na ordem de precedncia.

6.6 Operadores de comparao


As comparaes so feitas entre os valores contidos nas variveis, e no as referncias. Sempre retornam um valor booleano. == != < > <= >= igual a diferente de menor que maior que menor ou igual a maior ou igual a

Tabela 7: Operadores lgicos

6.7 Operadores de expresso condicional


Existe um operador de seleo ternrio que funciona da seguinte forma:

16

(expresso1)?(expresso2):(expresso3)
O interpretador PHP checa se a primeira expresso verdadeira. Se for, a expresso retorna o valor da expresso2, seno, retorna o valor da expresso3.

6.8 Operadores de incremento e decremento


++ - incremento decremento

Tabela 8: Operadores lgicos

Esses operadores podem ser usados antes ou depois da varivel.

Quando usados antes, retornam o

valor da varivel antes de increment-la ou decrement-la. Quando utilizados depois, retornam o valor da varivel j incrementado ou decrementado.

<? $a = $b = 10; // ambas recebem 0 valor 10. $c = $a++; // $c recebe 10 e $a passa a ter 11 $d = ++$b; // $d recebe 11, valor de $b j incrementado ?>

17

Estruturas de controle
As estruturas de controle que veremos a seguir so comuns para as linguagens de computao impe-

rativas, bastando, portanto, descrever a sintaxe de cada uma delas, resumindo o funcionamento.

7.1 Blocos
Um bloco consiste de vrios comandos agrupados com o objetivo de relacion-los com determinada estrutura de controle ou funo. Em estruturas de controle como

if, for , while , switch

e em declaraes

de funes blocos podem ser utilizdos para permitir que um comando faa parte do contexto desejado. Blocos em PHP sao delimitados pelos caracteres  { e  }. Por exemplo:

<? if ($x == $y) comando1; comando2; ?>


Para que o comando2 estaja relacionado ao

if

preciso utilizar um bloco:

<? if ($x == $y) { comando1; comando2; } ?>


As vrias estruturas de controle sero explicadas a seguir:

7.2 If
O mais simples e de grande importncia para muitas linguagens o

if,

inclusive PHP. Ele testa a

condio e executa o comando indicado se o resultado for verdadeiro (diferente de zero). Ele possui duas sintaxes:

if (expresso) comando1; if (expresso): comando1; comando2; . . . comando3; endif;

18

Para incluir mais de um comando no por chaves. O

if

da primeira sintaxe, preciso utilizar um bloco, demarcado

else

complemnta o if (se necessrio). Seus comandos so executados caso a expresso avaliada pelo

if

seja falsa (zero).

if ($x == $y) comando1; else comando2;

if (expresso): comando1; comando2; . . . comando3; else comando4; comando5; . . . comando6; endif;


Exemplo de

if

usado com

else :

if ($x > $y) $maior = $x; else $maior = $y;


O

elseif

uma combinao de

bloco se a expresso avaliada pelo

if e else . if for falsa.

Ele estende um

if para executar um diferente comando ou

Nesse caso, ele avalia outra expresso e executa o comando

ou bloco indicado se tal expresso for verdadeira. Por exemplo:

if ($a > $b) print "a } elseif ($a print "a } else { print "a }

{ maior que b"; == $b) { igual a b"; menor que b";

19

7.3 While
O loop

while

a maneira mais fcil de se fazer um loop em PHP. A maneira bsica de se fazer um

loop while :

while (expresso) comando;


A expresso checada a cada vez que o comando ou bloco de instrues termina, alm do teste inicial. Se o valor da expresso passar a ser falso no meio do bloco de instrues, a execuo segue at que o bloco termine. Se no teste inicial a expresso for falsa, o bloco no ser executado. Uma outra sintaxe para o uso do

while

while (expresso): comando1; . . . comando2; endwhile;


Um exemplo simples de um loop

while

com as duas sintaxes pode ser:

/* exemplo 1 */ $i = 1; while ($i <= 10) { print $i++; /* o valor de $i deve ser impresso antes de ser incrementado */ } /* exemplo 2 */ $i = 1; while ($i <= 10): print $i; $i++; endwhile;

7.4 do..while
O lao

do..while

muito parecido com o

while

exceto que a expresso checada no nal de cada

execuo do bloco e no no comeo. A principal diferena de um loop um

while

que a primeira iterao de

do..while

executada de qualquer maneira.

Existe apenas uma sintaxe para o

do..while .

Que a seguinte:

20

$i = 0; do { print $i; } while ($i>0);


O loop acima dever rodar apenas uma vez. Quando a expresso for avaliada, ser entendida como falsa e a execuo do lao acabar.

7.5 for
O

for

o lao mais complexo em PHP. As sintaxes para o lao

for

so:

for (inicializao; condio; incremento) comando; for (inicializao; condio; incremento): comando1; comando2; . . . comando3; endfor;
Onde:

inicializao :
variveis.

comando que ser executado antes do incio do lao. Usado para inicializar as

condio :
executados.

expresso avaliada a cada iterao, que dene se os comandos que esto dentro Enquanto a expresso for verdadeira os comandos sero

do lao sero executados ou no.

incremento :
as variveis.

comando executado ao nal de cada execuo do lao. Usado para incrementar

7.6 break
O comando um

break

pode ser utilizados em laos

do, for

while , alm do uso no switch .

Ao encontrar

break

dentro de um desses laos, o interpretador PHP pra imediatamente a execuo do lao, O

seguindo normalmente o uxo do script.

break

ainda aceita um argumento numrico opcional que

indica o nvel de laos que ele ir sair. Por exemplo:

$i = 0; while (++$i) { switch ($i) { case 5: echo "At 5<br>\n"; break 1; /* ou apenas break, sai apenas do switch. */
21

case 10: echo "At 10<br>\n"; break 2; /* sai do switch e do while. */ default: break; } }

7.7 continue
O

continue

tambm usado dentro de laos. Ele serve para indicar ao interpretador PHP para ignorar

o restante do bloco corrente e comear no incio da prxima iterao. Assim como o

break ,

continue

tambm aceita um argumento numrico opcional que serve para indicar quantos nveis de encapsulamento ele deveria ignorar. Por exemplo:

while (list ($key, $value) = each ($arr)) { if (!($key % 2)) { // pular valores pares continue; } fazer_algo_com_o_valor_mpar($value); } $i = 0; while ($i++ < 5) { echo "Fora<br>\n"; while (1) { echo "Fronteira<br>\n"; while (1) { echo "Dentro<br>\n"; continue 3; } echo "Isso nunca ser impresso.<br>\n"; } echo "Nem isso.<br>\n"; }

7.8 switch
O comando

switch

atua de maneira semelhante a uma srie de comandos

if

na mesma expresso.

Em muitas ocasies o programador pode querer comparar a mesma varivel (ou expresso) com muitos diferentes valores, e executar um diferente pedao de cdigo dependendo de qual valor a varivel corresponde.

22

Os seguintes exemplos mostram duas maneiras de se escrever a mesma coisa. Uma usando uma srie de

if's e

a outra usando o

switch .

if ($i == print } if ($i == print } if ($i == print }

0) { "i equals 0"; 1) { "i equals 1"; 2) { "i equals 2";

switch ($i) { case 0: print "i equals 0"; break; case 1: print "i equals 1"; break; case 2: print "i equals 2"; break; }
Nesse caso o linha a linha os

break cases

utilizado quando se executar apenas uma das opes, visto que o

switch

testa

encontrados, e a partir do momento que encontra um valor igual ao da varivel

testada, passa a executar todos os comandos seguintes, mesmo os que fazem parte de outros testes.

23

Funes
A sintaxe bsica para denir uma funo :

8.1 Denindo funes


function nome_da_funo([arg1, arg2]) { comanos; . . . [return <valor de retorno>]; }
Como a checagem de tipos em PHP dinmica, o tipo de retorno no deve ser declarado.

8.2 Valor de retorno


O retorno de uma funo em PHP opcional, ou seja a funo pode tanto devolver um resultado de uma operao, como simplesmente executar um pedao de cdigo. No possvel que uma funo retorne mais de um valor, mas pode se fazer a funo retornar um valor composto, como listas ou arrays.

8.3 Argumentos
Opcionalmente, pode-se passar dados de entrada para as funes. Tais dados so chamados argumentos. Quando so usados, so declarados logo aps o nome da funo, e tronam-se variveis pertencentes ao escopo local da funo. Assim como o tipo de retorno da funo, os tipos dos argumentos no devem ser especicados.

function imprime($texto) { echo ``$texto''; } imprime(``III Sinec'');

Passagem de parmetros por referncia


Normalmente a passagem de parmetros em PHP feita por valor, ou seja, se o contedo da varivel for alterado, essa alterao no afeta a varivel original.

function incrementa($num) { $num++; } $a = 5; incrementa($a); // $a ainda vale 5


No caso acima, como a passagem de parmetros por valor, o valor da varivel $a no alterado. Se a passagem fosse por referncia, a varivel $a teria assumido o valor 6, depois da execuo da funo.

24

Existem duas maneiras de se passar valores por referncia: pode-se indicar na declarao da funo, ou na chamada da mesma. Quando se indica a passagem por referncia na declarao da funo, tal

passagem de argumentos sempre ser por referncia. Em ambos os casos se utiliza o caracter & para indicar que a passagem ser por referncia.

function incrementa(&$num1, $num2) { $num1++; $num2++; } $a = $b = 5; incrementa($a, $b); /* neste caso $a vale 6 e $b continua a valer 5 no trmino da execuo da incrementa($a, &$b); /* aqui, as dus variveis tero seus valores alterados */

Argumentos com valores pr-denidos (default)


Em PHP possvel ter valores

default

para argumentos de funes, ou seja, valores que sero assumidos

em caso de nada ser passado no lugar do argumento. Quando um parmetro declarado desta maneira, a passagem do mesmo na chamada da funo torna-se opcional. Por exemplo:

function imprime($texto = ``III Sinec'') { echo ``$texto''; } imprime(); // imprime ``III Sinec'' imprime(``123 testando''); // imprime ``123 testando''

Contexto
O contexto o conjunto de variveis e seus respectivos valores num determinado ponto do programa. Na chamada de uma funo, ao iniciar a execuo do bloco que contm a implementao da mesma criado um novo contexto, contendo as variveis declaradas dentro do bloco, ou seja, todas as variveis utilizadas dentro daquele bloco sero eliminadas ao trmino da execuo da funo.

Escopo
O escopo de uma varivel em PHP dene a poro do programa onde ela pode ser utilizada. Na

maioria dos casos todas as variveis tm escopo global. Entretanto, em funes denidas pelo usurio um escopo local criado. Uma varivel de escopo global no pode ser utilizada no interior de uma funo sem que haja uma declarao. Por exemplo:

$texto = ``III Sinec''; function imprime() {


25

echo ``$texto''; } imprime();


A chamada a funo imprime() no produzir nada na sada, pois a varivel $texto de escopo global, e no pode ser referida num escopo local, mesmo que no haja outra com nome igual que cubra a sua visibilidade. Para alcanar o objetivo do script acima, a varivel global deve ser declarada. Por exemplo:

$texto = ``III Sinec''; function imprime() { global $texto; echo ``$texto''; } imprime();
Uma outra maneira de acessar variveis de escopo global dentro de uma funo utilizando um array pr-denido pelo PHP cujo nome $GLOBALS. O ndice para a varivel referida o prprio nome da varivel, sem o caracter $. O exemplo abaixo produz um resultado semelhante ao anterior.

$texto = ``III Sinec''; function imprime() { echo ``$GLOBALS[texto]''; } imprime();

26

Variveis e Constantes
Como a vericao de tipos em PHP dinmica, as variveis no precisam ser declaradas. Uma

9.1 Declarao de uma varivel


varivel iniciada no momento em que feita a primeira atribuio. O tipo da varivel ser denido de acordo com o valor atribudo.

9.2 O modicador static


Uma varivel esttica visvel num escopo local, mas ela inicializada apenas uma vez e seu valor no perdido quando a execuo do script deixa esse escopo. Por exemplo:

function imprime() { $a = 0; echo $a; $a++; }


Como a varivel $a ser destruda no nal da execuo da funo, intil tentar increment-la. Com o modicador

static

a varivel $a ter o seu valor impresso e ser incrementada. Veja o exemplo abaixo:

function imprime() { static $a = 0; echo $a; $a++; }


O modicador

static

muito utilizado em funes recursivas, j que o valor de algumas variveis

precisam ser mantidos.

Esses valores so recuperados quando encontrado novamente a declarao

static .

9.3 Variveis variveis


As vezes conveniente ter nomes de variveis que so variveis. Que um nome de uma varivel que pode ser mudado e usado dinamicamente. O PHP permite essa caracterstica e sua utilizao feita atravs do duplo cifro $$.

$a = "III"; $$a = "Sinec"; echo "$a ${$a}";


A sada do script acima ser: III Sinec.

27

9.4 Variveis enviadas pelo navegador


Uma das maneiras do navegador enviar dados para o interpretador PHP atravs da URL. Por exem-

plo: se o script est localizado em http://localhost/teste.php pode-se cham-lo com a url  `http://localhost/teste.ph Neste caso o PHP criar automaticamente uma varivel com o nome $texto contendo a string IIISinec. Este formato conhecido como

urlencode .

Os formulrios HTML j enviam informaes automatica-

mente nesse formato, e o PHP trata esses dados como variveis comuns, sem precisar de um tratamento especial por parte do programador. O formato

urlencode

obtido substituindo os espaos pelo caracter + e todos os outros caracteres

no alfa-numricos (com exeo de  _) pelo caracter % seguido do cdigo ASCII em hexadecimal.

9.5 Utilizando arrays


Cada elemento de um formulrio HTML submetido a um script cria no ambiente do mesmo uma varivel cujo nome o mesmo nome do elemento. Por exemplo

<input type=''text'' name=''email''>


O cdigo acima far com que seja criada uma varivel com o nome $email no script ao qual esse cdigo foi submetido. Uma boa tcnica de programao utilizar a notao de arrays para itens de um formulrio HTML. Para um conjunto de checkboxes, por exemplo, pode-se utilizar a seguinte notao:

<input type=''checkbox'' name=''teste[]'' value=''valor1''>Opo 1 <input type=''checkbox'' name=''teste[]'' value=''valor2''>Opo 2 <input type=''checkbox'' name=''teste[]'' value=''valor3''>Opo 3
Ao submeter o formulrio, o script que recebe os valores criar uma varivel chama $teste contendo os valores num array, com ndices a partir do zero.

9.6 Variavveis de ambiente


O PHP possui diversas variveis de ambiente, como a $PHP_SELF, por exemplo, que contm o nome e o path do prprio arquivo. Algumas outras contm informaes sobre o navegador do usurio, o servidor http, a verso do PHP e diversas outras informaes. Para ver a listagem completa dessas variveis e seus respectivos contedos, deve-se utilizar a funo

phpinfo() .

9.7 Vericando se uma varivel possui um valor


Existem duas funes que podem ser usadas para saber se a varivel est setada. So elas a funo

isset

e a funo

A funo

empty . isset possui

o seguinte prottipo:

int isset(mixed var);

28

Ela retorna caso contrrio. A funo

true

se a varivel estiver setada (mesmo com uma string vazia ou o valor zero), e

false

empty

possui o seguinte prottipo:

int empty(mixed var);


Ela retorna contrrio,

true se a retorna false .

varivel no contiver um valor ou possuir valor zero ou uma string vazia. Caso

9.8 Constantes pr-denidas


Assim como as variveis de ambiente, o PHP possui algumas constantes pr-denidas, contendo a verso do PHP, o sistema operacional do servidor, etc. Para uma listagem completa dessas constantes pode-se usar a funo

phpinfo() .

9.9 Denindo constantes


A funo

define

usada para denir o valor de uma constante, que uma vez setada, no poder

mais ser alterado. Uma constante pode apenas conter um valor escalar, no podendo guardar arrays ou objetos. A assinatura da funo

define

a seguinte:

int define(string nome_da_constante, mixed valor);


A funo retorna

true

se for bem sucedida. Por exemplo:

define (``pi'', 3.1415926536); $circunf = 2*pi*$raio;

29

10

Utilizando cookies
Cookies so variveis gravadas no cliente (browser) por um determinado site. Somente o site que

10.1 O que so?


gravou o cookie pode ler a informao contida nele. Este recurso muito til para que determinadas

informaes sejam fornecidas pelo usurio apenas uma vez. Exemplos de utilizao de cookies so sites que informam a quantidades de vezes que voc j visitou, ou alguma informao fornecida numa visita anterior. Existem cookies persistentes e cookies de sesso. Os persistentes so aqueles gravados em arquivo, e que permanecem aps o browser ser fechado, e possuem data e hora de expirao. Os cookies de sesso no so armazenados em disco e permanecem ativos apenas enquanto a sesso do browser no for encerrada. Por denio exostem algumas limitaes para o uso de cookies, listadas a seguir:

300 cookies no total; 4 kilobytes por cookie; 20 cookies por servidor ou domnio.

10.2 Gravando cookies


Para gravar cookies no cliente, deve ser utilizada a funo setcookie, que possui a seguinte assinatura:

int setcookie(string nome, string valor, int exp, string path, string domnio, int secure);
Onde o nome o nome da varivel, o valor o contedo da varivel, exp opcional e indica a data de expirao no formato Unix. Se no for denida o cookie ser de sesso; path o path do script que gravou o cookie; o domnio o domnio responsvel pelo cookie; e secure se tiver valor 1 indica que o cookie s pode ser transferido por uma conexo segura (https). Um cookie no pode ser recuperado na mesma pgina que a gravou, a menos que ela seja recarregada pelo browser. Cookies s podem ser gravados antes do envio de qualquer informao para o cliente. Portanto todas as chamadas a funo setcookie devem ser feitas antes do envio de qualquer header ou texto.

10.3 Lendo cookies gravados


Os cookies lidos por um script PHP cam armazenados em duas variveis. No array

$HTTP_COOKIE_VARS[] ,

tendo como ndice a string do nome do cookie, e numa varivel cujo nome o mesmo do cookie, precedido pelo smbolo $. Por exemplo:

Um cookie foi gravado numa pgina anterior pelo seguinte comando: setcookie(``teste'', ``III Sinec''); Pode ser lida das seguintes formas:
30

$HTTP_COOKIE_VARS[teste]; ou $teste;

31

11

A Histria do PostgreSQL
Tudo comeou com o desenvolvimento do Ingres, ancestral do

PostgreSQL ,

na Universidade da Cali-

frnia de Berkeley, entre os anos de 1977 a 1985. Aps isso, o cdigo do Ingres foi aumentado pela

Ingres

Corporation ,

o qual produziu um dos principais servidores de banco de dados relacionais que tiveram

sucesso comercialmente. Tambm em Berkeley, Michael Stonebraker liderou uma equipe que desenvolveu um servidor de banco de dados relacional chamado Informix ) herdou o cdigo

Postgres , entre os anos de 1986 a 1994. A Illustra( Postgres e desenvolveu-o em um produto comercial.

comprada depois pela

Dois estudantes de graduao, Jolly Chen e Andrew Yu, adicionaram mais outras caractersticas, de forma que interpretasse SQL no Postgres. O projeto resultante foi chamado de 1994 a 1995. Aps a sada dos desenvolvedores de Berkeley, o projeto continuou com a incluso de novos desenvolvedores at o lanamento de uma nova verso, no nal de 1996 com o nome de

Postgres95 , desenvolvido no perodo

PostgreSQL .

32

12

Software Open Source


PostgreSQL um software open source.
O termo software open source geralmente confunde as pessoas.

Com um software comercial, uma companhia contrata programadores, desenvolve um produto, e vende aos usurios. Com a internet, entretanto, novas possibilidades existem. Software open source no tem companhia. Em vez, programadores capazes com interesses e algum tempo livre se unem via internet e trocam idias. Algum escreve um programa e coloca o mesmo em um lugar que todos possam ver. Outros programadores olham e fazem as mudanas necessrias para melhorar o software. Quando o programa se encontra em fase funcional, os desenvolvedores lanam o programa a outros usurios da internet. Usurios acham erros e caractersticas que no existem e enviam background aos desenvolvedores, os quais, por sua vez, fazem as mudanas necessrias. Para um ciclo que parece no ser funcional, ele possui algumas vantagens sobre o modo antigo de desenvolvimento. - Uma estrutura de empresa no requerida, dessa forma no existe overhead (sobrecarga) e no existem restries econmicas. - O desenvolvimento de programas no ca limitado aos programadores da empresa, usando a capacidade e a experincia de um largo nmero de programadores. - O retorno do usurio facilitado, permitindo os testes de programa por um nmero grande de usurios em pouco tempo. - O encarecimento do programa pode ser distribudo rapidamente aos usurios.

33

13

Stored Procedures
Uma stored procedure , em suma, um programa com comandos SQL, que armazenado em um banco

de dados lgico.

PostgreSQL . A stored procedure composta por comandos SQL, variveis e comandos de uxo

34

14

Trigger
So blocos de comandos em SQL que so automaticamente executados quando um comando INSERT,

DELETE ou UPDATE executado em uma tabela. A principal aplicao de um trigger a criao de consistncias e restries de acesso ao banco de dados, como por exemplo, rotinas de segurana. Em vez de deixar o controle da aplicao para a prpria tabela, por meio de triggers o banco passa a executar esses controles, tornando muito mais seguro o manuseio do banco de dados.

14.1 Aplicaes
- Criar o contedo de uma coluna derivada de outras colunas; - Criar mecanismos de validao que envolvam pesquisas em mltiplas tabelas; - Criar logs para registrar a utilizao de uma tabela; - Atualizar outras tabelas em funo da incluso ou alterao da tabela atual;

15

Alguns comandos no banco de dados


PostgreSQL
usa um modelo de cliente/servidor de comunicao. Um servidor

15.1 Comeando uma sesso de banco de dados


PostgreSQL
sempre ca rodando, esperando conexes. O servidor processa a requisio e retorna a sada ao cliente.

15.2 Escolhendo qual interface


PostgreSQL
possui vrias interfaces de comunicao com o servidor. A que ser usada no curso ser o PSQL, por ser a mais utilizada e por ter a maior documentao.

15.3 Comeando uma sesso


Para iniciar uma sesso PSQL, devemos digitar PSQL no prompt de comando. Ao iniciar um menu em modo texto aparecer, indicando alguns comandos bsicos. -

\ \ \ \ \ \

h > help para comandos SQL; q > para sair; g > terminar uma query, equivalente; ? > mostra todos os comandos do prompt PSQL; p > mostra o buer; r > reseta o buer;

35

16

Comandos bsicos em SQL


Antes de criarmos aplicaes exemplo no curso, daremos alguns comandos bsicos que so os mais

utilizados em criao, consulta, alterao e deleo em um banco de dados padro SQL.

Os dados em um banco de dados relacional so guardados em estruturas chamadas tabelas, que podem ser relacionar entre si, surgindo em razo disso o termo banco de dados relacional, derivado de uma linguagem matemtica baseada em conjuntos.

16.1 Criando tabelas


O comando para criar uma tabela em SQL o comando CREATE TABLE. Sua sintaxe ser demonstrada atravs do seguinte exemplo.

php=> CREATE TABLE noticia ( php(> id php(> noticia php(> datains php(> chamada php(> foto php(> link php(> datapub php(> );

serial, varchar(800) NOT NULL, date, varchar(300) NOT NULL, varchar(300), varchar(300), date

Como visto aqui, e na maioria dos comandos SQL, um pouco de conhecimento da lngua inglesa necessrio para entender o que o comando faz. O resto da requisio tem um formato especco que reconhecido pelo servidor de banco de dados. Espaamento e capitalizao so funcionais.

O comando CREATE TABLE segue um formato especco: primeiro, as duas palavras CREATE TABLE; depois o nome da tabela; aps isso um parntese de abertura; uma lista de nomes de colunas e seus respectivos tipos; seguido por um parntese de fechamento.

O comando

\d

permite enxergar informao sobre uma tabela ou sobre todas as tabelas existentes no

banco de dados corrente.

16.2 Adicionando dados com Insert


Para adicionar registros em uma tabela, necessrio usar o comando INSERT. Assim como o Create, o INSERT possui um formato especco, a ser descrito.

INSERT INTO noticia (noticia, datains,chamada,foto,link,datapub) values ( 'A bezerra morreu na br 101',
36

data(06/11/2001), 'A morte da bezerra', '', '', data(07/11/2001));


Para usar strings, necessrio usar aspas simples. Aspas duplas no funcionam. Espaamento e

capitalizao so opcionais, exceto dentro de aspas simples, onde o texto considerado literalmente. Para colunas numricas, no necessrio o uso de aspas simples.

16.3 Visualizando dados com Select


Para reaver dados no banco de dados, o comando utilizado o SELECT. O comando a seguir mostra todos os campos e todos os registro da tabela noticia.

SELECT * FROM noticia;


O comando SELECT seleciona registro do banco de dados. na consulta pedido todas as colunas da tabela. consultar a tabela noticia. O asterisco usado para indicar que

O FROM noticia, indica que a tabela que queremos

O SELECT tem um grande nmero de variaes.

Por exemplo, se quissemos apenas o campo cha-

mada da tabela noticia, o comando utilizado seria o seguinte

SELECT chamada FROM noticia;

, onde o

asterisco foi substiudo apenas pelo campo requerido. Se mais de um for necessrio, deve-se usar vrgulas para separar os mesmos.

16.4 Selecionando linhas especcas com a clusula Where


Na seo 16.3 na pgina 32, ao utilizarmos o comando SELECT, temos todos os registros como resposta. Mas, de fato, dependendo da situao, existem casos em que queremos apenas um registro ou um conjunto de registros que sejam retornados e no todos os registros da tabela. Nesse caso, devemos usar a clusula WHERE. Ela deve vir logo aps ao nome da tabela, e aps o WHERE deve-se colocar um ltro de pesquisa.

SELECT * FROM noticia WHERE id>65;


O comando produz uma sada onde todos os registros possuem um id maior que 65.

16.5 Removendo dados com Delete


Depois de aprender como incluir dados no banco, necessrio saber como se deleta a informao. A remoo bem simples, como todos os outros comandos j mostrados. rapidamente apagar um, mais de um ou todos os registros. O comando DELETE pode

Vale lembrar que o comando DELETE

usado para apagar registro e no tabelas. Abaixo teremos alguns exemplos.

DELETE FROM noticia WHERE id=32;


37

Esse comando deleta o registro da tabela notcia que contenha em seu id o nmero 32;

DELETE FROM noticia;


Esse comando apaga

todos os registros da tabela noticia.

16.6 Modicando dados com Update


Para modicar dados, o comando utilizado UPDATE. Ele segue um formato semelhante a outros comandos utilizados em SQL. Como acima daremos dois exemplos um pouco distintos.

UPDATE noticia set chamada='O dirio de Fabita' WHERE id=24;


Esse comando atualiza o campo chamada para 'O dirio de Fabita' onde o id do registro for igual a 24. Se for necessrio atualizar mais de um campo, eles devem ser separados por vrgulas.

UPDATE noticia set link='/sinec/index.html'


J essa instruo, atualiza o link de

todos os registros

para

'/sinec/index.html' .

Deve-se tomar cuidado com esse comando para, por um descudo de esquecer de

colocar a clusula WHERE, atualizar todos os registros quando se queria atualizar apenas parte deles.

16.7 Ordenando dados com Sort by


Em uma consulta SQL, registros so dipostos de uma forma indeterminada. Para garantir que os registros sero retornados de uma consulta SELECT em uma ordem especca, necessrio que se use a clusula ORDER BY no nal do comando SELECT.

Se quiser, pode-se usar aps o ORDER BY condio, o argumento DESC que inverte a ordem de como foi disposta a sada.

SELECT id,noticia,chamada FROM noticia WHERE id>2 ORDER BY noticia;


Esse comando seleciona os campos id, noticia e chamada, para os registros que tiverem o id maior que 2 ordernando pelo campo noticia. alfabtica. Como o campo noticia string, a ordenao feita por ordem

SELECT * FROM noticia where foto like 'j%' ORDER BY chamada DESC;
Esse comando seleciona todos os campos da tabela noticia, reavendo apenas os registros que tenham foto comecando com j, ordenando a sada pelo campo chamada por ordem alfabtica inversa.

16.8 Destruindo tabelas


Para completar esta parte de noes de SQL, devemos mostrar como apagar tabelas em si, no s os registros localizados nela. comando Esta tarefa realizada com o comando DROP TABLE. Por exemplo o apagaria toda a tabela noticia. Convm dizer que toda a estrutura e os

DROP TABLE noticia

dados existentes na tabela sero apagados.

38

17

Tipos de Dados
Postgres
apresenta imensa variedade de tipos de dados disponveis para o usurio, estes tipos esto

listados na tabela 17. O usurio pode livremente criar novos tipos com o comando

CREATE TYPE .

Nome do tipo

bigint bit bit varying( n ) boolean character( n ) character varying( n ) date double precision integer interval money numeric( p, s ) smallint real serial time[sem fuso horrio] time with time zone timestamp[com fuso horrio]

Apelidos
int8 varbit( n ) bool char( n ) varchar( n ) oat8 int,int4 decimal( p, s ) int2 oat4

Descrio

inteiro de oito byts bit string bit string de tamanho varivel booleano lgico(true/false) string de caracteres bit string de tamanho varivel data(year, month, day) nmero de ponto utuante,preciso maior inteiro de quatro bytes uso geral de time stamp monetrio estilo americano nmero exato com preciso varivel inteiro de dois bytes nmero de ponto utuante inteiro de quatro bytes autoincremental time of day hora do dia, sem fuso horrio data e hora

Tabela 9: Tipos de dados

17.1 Tipos Numricos


Os tipos numricos abrangem os inteiros de dois, quatro e oito decimais de preciso xa.

bytes ,

nmeros de ponto utuante e

17.1.1 Tipo Serial


O tipo

serial

um tipo especial do

Postgres

construdo atravs de outros componentes existentes.

usado para criar inteiros nicos em um determinado campo.

CREATE TABLE tabela (coluna SERIAL);


Isso equivalente :

CREATE SEQUENCE tabela_coluna_seq; CREATE TABLE tabela (coluna integer DEFAULT nextval('tabela_coluna_seq')); CREATE UNIQUE INDEX tabela_coluna_key on tabela(coluna);
O tipo

serial

cria uma sequncia independente da tabela, isto , se a tabel for apagada.

A sua

sequncia no ser automticamente removida. maneira:

Para apagar a sequncia deve-se proceder da seguinte

DROP SEQUENCE tabela_coluna_seq;

39

17.1.2 Tipo Monetrio

17.2 Tipos caracter


Alm dos tipos padres suportados pelo SQL: reconhece o tipo

caracter

caracter varying . Postgres


Descrio

tambm

text .
Nome do Tipo Armazenamento
(4+n) bytes (4+n) bytes (4+n) bytes

character(n),char(n) character varying(n),varchar(n) text

Compatibilidade
SQL SQL Mais exvel

Tamanho xo Tamanho varivel com limite tamanho varivel e ilimitado

Tabela 10: Tipos Caracter

17.3 Tipo data/hora


Postgres
suporta todos os seguintes tipos de datas e horas do SQL. Data e hora Data e hora com fuso horrio

timestamp :

timestamp with timezone : interval : date : time :

Intervalos de tempo

Apenas datas Apenas horas Apenas horas

time with time zone :


Tipo

timestamp timestamp com fuso horrio interval date time time with time zone

Armazenamento
8 bytes 8 bytes 12 bytes 4 bytes 4 bytes 4 bytes

4713 AC 1903 DC -178000000 anos 4713 DC 00:00:00.00 00:00:00.00+12

Incio

1465001 DC 2037 DC 178000000 anos 32767 DC 23:59:59.99 23:59:59.99-12

Fim

1 microsegundo/ 14 dgitos 1 microsegundo/ 14 dgitos 1 microsegundo 1 dia 1 microsegundo 1 microsegundo

Resoluo

Tabela 11: Tipos de Data/hora

Em verses anteriores eram usadas os tipos

datetime

timespan ,

que so euivalentes

timestamp

interval ,

respectivamente. Atualmentesses tipos no so mais usados.

17.3.1 Entrada de Data/hora


As maiorias das entradas de data/hora conhecidos so aceitos no

Postgres .

O comando

SET DateStyle
e o comando

to 'US' ou SET DateStyle to 'NonEuropean' especica o estilo da data como ms dia ano SET DateStyle to 'European' especica o estilo da data para dia ms ano.

Nota:A entrada de data e/ou hora precisa ser feita com estas entre aspas simples.
type 'value'

como o seguinte:

40

17.3.2 Hora sem Fuso Horrio


Esse tipo pode ser chamado como entradas vlidas para o

time

ou

time without timezone .

A tabela 17.3.2 mostra as

time .

17.3.3 Hora com Fuso Horrio


Este tipo foi denido pelo SQL92, mas sua denio contem algumas decincias que diculta o uso deste tipo como padro. Na tabela 16 mostrada todas as entradas vlidas. Note que este tipo aceita todos as entradas do tipo

time

com o acrscimo de um fuso horrio vlido.

17.3.4 interval
O tipo

interval

pode ser especicado usando a seguinte

syntax .

Exemplo
1/8/2001 8/1/2001

Estilo americano; 1 de agosto Estilo europeu; 1 de agosto

Descrio

Tabela 12: Entrada de datas

Abril Agosto Dezembro Fevereiro Janeiro Julho Junho Maro Novembro Outubro Setembro

Ms

Abreviao
Apr Aug Dec Feb Jan Jul Jun Mar Nov Oct Sep, Sept

Tabela 13: Abreviao dos meses

Domingo Segunda Tera Quarta Quinta Sexta Sbado

Dia

Sun Mon Tue, Tues Wed, Weds Thu, Thur, Thurs Fri Sat

Abreviao

Tabela 14: Abreviao dos dias da semana

04:05:06.789 04:05:06 04:05 040506 04:05 AM 04:05 PM z zulu allballs

Exemplo

ISO-8601 ISO-8601 ISO-8601 ISO-8601 O mesmo que 04:05 O mesmo que 16:05; entrada de horas devem ser menores que 12 o mesmo que 00:00:00 o mesmo que 00:00:00 o mesmo que 00:00:00

Descrio

Tabela 15: Entrada de horas sem fuso horrio

41

Quantity Unit [Quantity Unit...] [Direction] @ Quantity Unit [Direction] Quantity qualquer nmero inteiroe Unit second, minute, hour, day, week, month, year, dacade, century, millenium ou suas abreviaes ou o plural dessas unidades. Direction pode ser ago ou vazio.
Onde:

17.3.5 Valores Especiais


As funes

CURRENT_DATE , CURRENT_TIME , CURRENT_TIMESTAMP

podem ser usadas como entrada de

data/hora, assim como constantes especiais listadas na tabela 18.

17.3.6 Sada de data/hora


O sada pode ser formatada para um dos quatro tipos citados na tabela

DateStyle .

??.

Usando o comando

SET

O valor

default

o formato ISO.

A estilo da sada dos tipos os estilos apresentados. O estilo da sada do tipo

time

date

so as partes de hora e data, respectivamente, de acordo com

interval

assemelha-se com a entrada, exceto que unidades como

week

ou

century

so convertidos para anos e dias. No modo ISO a sada se assemelha :

[ Quantity Units [ ... ] ] [ Days ] Hours:Minutes [ ago ]


04:05:06.789-8 04:05:06-08:00 04:05-08:00 040506-08

Exemplo

Descrio
ISO-8601 ISO-8601 ISO-8601 ISO-8601

Tabela 16: Entrada de horas com fuso horrio

Constante
current epoch innity -innity invalid now today tomorrow yesterday

Hora corrente da transao(obsoleto) 1970-01-01 00:00:00+00 (hora zero do sistema Unix) Maior que qualquer hora vlida Menor que qualquer hora vlida Entrada ilegal Hora corrente da transao Meia-noite de hoje meia-noite de amanh meia-noite de ontem

Descrio

Tabela 17: Constantes especias de data/hora

Especicao de estilo
'ISO' 'SQL' 'Postgres' 'German'

ISO-8601 standard (padro) estilo tradicional estilo original estilo regional

Descrio

1997-12-17 07:37:16-08 12/17/1997 07:37:16 1997 PST Wed Dec 17 07:37:16 1997 PST 17.12.1997 07:37:16.00 PST

Exemplo

Tabela 18: Estilos de sada de data/hora

42

17.4 Tipo Booleano


O

Postgres
true

oferece suporte para o tipo

boolean .

O tipo

boolean

pode assumir um dos dois valores

vlidos:

(verdadeiro) ou

false

(falso).

Valores vlidos para o estado verdadeiro: -

TRUE

- 't' - 'y' - 'yes' - '1' E para o estado falso: -

FALSE

- 'f ' - 'n' - 'no' - '0'

43

18

Alguns comandos adicionais em SQL


Nesta seo, mostraremos alguns recursos adicionais existente na linguagem SQL, e alm disso, algumas

caractersticas existentes apenas no PostgreSQL.

18.1 Aspas dentro de um texto


Quando temos que utilizar aspas dentro de um texto, como por exemplo, na insero de um campo do tipo char, onde o dado

'Leca's' , a insero no funcionaria.

A presena de uma aspa simples dentro de

uma string cercada por aspas simples, geraria um parser error. O mtodo correto para incluir esse tipo de dado seria o uso de duas aspas simples juntas como em da contrabarra para incluir esse dado

'Lecas''s' .

Outro mtodo possvel seria o uso

'Leca\'s' .

O uso da contrabarra ignora o sentido da aspa simples.

18.2 Usando valores nulos


Suponha que se queira incluir uma notcia mas que ela no contenha um link. A pergunta que ca qual o valor assinalado ao campo link ? A reposta que o campo link possui um valor nulo.

NULL

um

valor especial que valido em qualquer coluna. Usa-se quando uma entrada vlida para um campo no conhecida ou no aplicvel.

Os testes lores

IS NULL

IS NOT NULL

foram desenvolvidos especicamente para testar a existncia de va-

NULL . NULL .

Abaixo, colocaremos um exemplo que ilustra bem a confuso que pode existir com o uso de valores

INSERT INTO noticia (noticia,datains,chamada,link,foto,datapub) values ( 'Felipe viajou para o Marrocos e acabou comprando um Dromedrio', '08/11/2001', 'O dromedrio de Felipe', NULL, NULL, '10/11/2001' );
Neste exemplo, tanto o campo fazendo uma consulta do tipo:

LINK

como o campo

FOTO

possuem um valor nulo. Podia-se pensar que

SELECT * FROM noticia WHERE link=noticia;


teramos como resposta a incluso feita no exemplo anterior. O fato que o retorno de query igual a zero registros. O campo que contm se dois valores

NULL ,

signica desconhecido, desse modo no temos como saber

NULL

so iguais. PostgreSQL no adivinha ou imprime o resultado. Convm dizer que  e

NULL

so diferentes.

44

18.3 O uso de valores DEFAULT


Como mostrado na seo 18.2, colunas no especicadas no comando INSERT possuem valor nulo. Voc pode mudar isso usando a palavra chave DEFAULT. Quando na criao de uma tabela, a palavra DEFAULT e um valor podem ser usados logo aps o tipo da coluna. Este valor ser usado toda vez que no for colocado nenhum dado na coluna com o valor DEFAULT na insero do registro.

CREATE TABLE ultima ( id serial, noticia varchar(800) DEFAULT 'Seminrio de Informtica e Engenharia de Computao', hora time, chamada varchar(300) DEFAULT 'SINEC', link varchar(300), data date );
Quando for includo um registro sem notcia e sem chamada, o valor default acima descrito ser colocado nos campos noticia e chamada.

18.4 Comentrios
Os comentrios podem ser usados em qualquer lugar no prompt psql. Dois estilos de comentrio so possveis. A presena de dois traos () marca todo o texto da linha como um comentrio. O estilo da programao C++ tambm aceito, onde o comentrio comea com /* e s termina com o */.

18.5 Uso de OR e AND


O uso de OR e AND possibilita a realizao de consultas mais poderosas. Suponhamos que queremos todos os registros da tabela ultima, onde a data seja '08/11/2001' e a hora seja '16:00'. utilizado assim seria: O comando

SELECT * FROM ultima WHERE data='08/11/2001' AND hora='16:00';


De forma semelhante o OR pode ser usado em querys.

18.6 Alcance de Valores


Para reaver registros que tenham datas entre os dias '02/11/2001' e '07/11/2001'. Devemos usar os operadores

> => < <=

para determinar um alcance de valores.

SELECT * FROM ultima WHERE data=>'02/11/2001' AND data<='07/11/2001';


A tabela 19 na pgina 41, mostra os operadores existentes no

PostgreSQL .

45

Comparador
menor que menor ou igual igual maior ou igual maior que diferente

Operador
< <= = >= > <> ou !=

Tabela 19: Operadores de Comparao

18.7 Comparao Like


Maior que e menor que so combinaes possveis usando-se os operadores descritos na tabela 19. Mas, comparaes mais complexas podem ser feitas. Por exemplo, usurios geralmente precisam comparar strings para saber se as mesmas combinam com um certo modelo. Algumas vezes necessrio reaver apenas strings que comecem com uma certa letra ou uma certa palavra. A palavra chave comecem com A.

LIKE

possibilita tais comparaes.A consulta abaixo retorna todos as notcias que

SELECT * FROM noticia WHERE noticia like 'A%';


O smbolo (%) signica que qualquer quantidade de caracteres pode seguir o A.

18.8 Clusula CASE


Muitas linguagens de programao possuem comandos de deciso, especicando se uma condio for verdadeira faa algo, seno faa outra coisa. Apesar de SQL no ser uma linguagem de programao

procedural, ele permite controle condicional sobre dados retornados de uma query. A clusula WHERE usa comparao para controlar a seleo de registros. O comando CASE permite comparaes na sada de uma coluna. Aqui foi criado uma tabela de administradores para demonstrar um exemplo do comando CASE.

php=> CREATE TABLE administrador ( php(> id serial, php(> nome varchar(300), php(> identidade varchar(15), php(> idade integer php(> );

46

19

Unindo Tabelas
Nesta seo, mostraremos como armazenar dados em mais de uma tabela. Assim como o armazena-

mento, a seleo de dados em vrias tabelas so fundamentais para bancos de dados relacionais. Primeiro examinaremos tabelas e referncias colunas, que so importantes em consultas que usam mais de uma tabela. Depois, mostraremos quais so as vantagens de dividir os dados em mltiplas tabelas.

Aqui, faremos a construo das tabelas que sero responsveis pelo controle da enquete.

19.1 Tabelas e referncias colunas


Antes de lidar com agrupamentos, necessrio mencionar uma importante caracterstica. At agora, todos os comandos s envolveram uma tabela. Quando uma

query

envolve mais de uma tabela, os nomes

de colunas podem ser tornar confusas ou mesmo ambguas, quando, por exemplo existe mais de uma tabela usada na query com nomes de colunas iguais. Para evitar essa confuso, existe o que chamamos de nome completamente qualicado da coluna, onde o nome da mesma antecido pelo nome da tabela a qual faz parte seguida por um ponto. Por exemplo, a coluna com

noticia

da tabela

noticia

seria referenciado

noticia.noticia .

Outro modo de referenciar o nome da coluna de uma tabela atravs da criao de um apelido para a tabela. Vide exemplo.

SELECT noticia.noticia,noticia.chamada FROM noticia;


Nesse caso, recuperamos todas as noticias e chamadas da tabela noticia. Aqui, no necessrio o

uso do nome completamente especicado, j que no existem dvidas sobre a origem das colunas, pois s existe uma tabela sendo consultada.

SELECT n.noticia,n.chamada FROM noticia n;


Aqui houve o uso do apelido para a tabela noticia, que passou a ser referenciada como n, pois aps seu nome na query a letra que seguiu foi n, dizendo assim ao servidor que houve a criao de um apelido.

19.2 Tabelas Agrupadas


At os exemplos passados, na criao das tabelas ultima e noticia, no houve a necessidade de criar tabelas relacionadas, pois toda a informao necessria podia existir em uma nica tabela. Mas ao fazer a parte de enquete para o portal a situao muda. Em um primeiro impulso, poderamos pensar que toda a informao poderia car armazenada em uma tabela s como se segue na tabela 20 na pgina 43. Cometemos erros ao pensar assim. O primeiro deles assumir que teremos sempre trs respostas.

Se tivermos menos respostas, a tabela car subutilizada, ocupando espao desnecessrio. Se quisermos em algum dia aumentar o nmero de respostas, ser invivel, j que todo o banco de dados foi criado para receber sempre trs respostas. Umas de regras de criao de um bom banco de dados, que no existam campos com o mesmo signicado dentro de uma tabela. Nesse exemplo, temos os campos voto* e resposta* que se repetem por trs vezes na tabela. Considerando isso, a tabela enquete caria como na tabela 21 na pgina 43.

47

Tabela Enquete

Campos id enquete data resposta1 voto1 resposta2 voto2 resposta3 voto3

Tipos Serial char(300) date char(100) int char(100) int char(100) int

Tabela 20: Tabela errada de enquete Tabela Enquete Campos id enquete data Tabela 21: Tabela enquete Tipos serial char(300) date

Aps os campos voto* e resposta* terem sido retirados, a tabela obedece as leis de criao de um bom banco de dados. A pergunta que ca : Onde caro as respostas dessa pergunta ? Logicamente, em uma outra tabela ! Essa tabela ter o nome resposta e ser criado de acordo com a tabela 22 na pgina 43. Tabela Resposta Campos id resposta contador idpergunta Tabela 22: Tabela resposta Tipos serial char(300) integer integer

Resumindo, as vantages do uso de mltiplas tabelas incluem as seguintes: - A modicao de dados torna-se mais fcil; - Os dados so armazenados em um nico espao; - Economia no armazenamento de dados; - Procura de dados mais fcil A nica condio para que dados duplicados no se movam para outra tabela ocorre quando as seguintes condies esto presentes: - O tempo para a realizao do agrupamento proibitivo; - A procura de dados desnecessria;

todas

48

- A duplicao de dados exige pouco espao no armazenamento; - muito pouco provvel que os dados mudem.

19.3 Criando tabelas agrupadas


Realizada a criao das tabelas enquete e resposta, veremos como podemos realizar o agrupamento das tabelas. Na criao das mesmas todas as colunas esto com letras minsculas, podendo ter sido feito com letras maisculas, mas o PostgreSQL ignora e considera todos os nomes de coluna em letra minscula. O nico modo de fazer com que o nome da tabela ou o nome da coluna seja considerada em caixa alta na denio da tabela, usar aspas duplas no nome do campo, como em "Nome do usurio", inclusive sendo permitido usar espaos. No recomendado essa prtica pois cada vez que deve-se referenciar a coluna, devemos colocar as aspas duplas, dicultando a leitura dos comandos. Sem o uso das aspas duplas, nomes de coluna s podem ter letras, nmeros e underscore. Qualquer outro caractere no permitido. Em

seguida, teremos os comandos de criao das tabelas antes desenhadas.

php=> CREATE TABLE enquete ( php(> id serial, php(> enquete char(300), php(> data date php(> ); NOTICE: CREATE TABLE will create implicit sequence 'enquete_id_seq' for SERIAL column 'enquete.id' NOTICE: CREATE TABLE/UNIQUE will create implicit index 'enquete_id_key' for table 'enquete' CREATE php=> CREATE TABLE resposta ( php(> id serial, php(> resposta char(200), php(> contador integer, php(> id_resposta integer php(> ); NOTICE: CREATE TABLE will create implicit sequence 'resposta_id_seq' for SERIAL column 'resposta.id' NOTICE: CREATE TABLE/UNIQUE will create implicit index 'resposta_id_key' for table 'resposta' CREATE
Como j explanado anteriormente, o tipo serial ser explicado mais a frente. Essas duas tabelas tem uma relao de um pra n, pois uma enquete pode ter vrias respostas mas uma resposta de apenas uma enquete. Agora, adicionaremos uma pergunta e colocaremos duas respostas.

php=> INSERT INTO enquete (enquete,data) VALUES


49

php-> ('Quando ser que a greve acabar','07/11/2001'); INSERT 19013 1 php=> INSERT INTO resposta (resposta,contador,id_enquete) VALUES php-> ('No natal',0,1); INSERT 19073 1 php=> INSERT INTO resposta (resposta,contador,id_enquete) VALUES php-> ('Quando Paulo Renato morrer',0,1); INSERT 19074 1 php=> INSERT INTO resposta (resposta,contador,id_enquete) VALUES php-> ('Quando a universidade acabar',0,1); INSERT 19075 1

Neste exemplo, o id_enquete na tabela 1 pois a primeira resposta recebe esse nmero com o uso do serial.

19.4 Realizando agrupamentos


Quando os dados esto separados atravs de mltiplas tabelas, recuperar os dados nessas tabelas se torna uma importante questo. Outro exemplo mostra como encontrar a enquete para dada resposta na tabela resposta.

php=> SELECT id,id_enquete FROM resposta WHERE resposta='No natal'; id | id_enquete ----+-----------1 | 1 (1 row) php=> SELECT enquete FROM enquete WHERE id=1; enquete --------------------------------Quando ser que a greve acabar (1 row)
Na primeira consulta, achamos qual o nmero da enquete a qual pertence a resposta 'No Natal' (o campo id_enquete). O id_enquete foi 1. O campo id_enquete tem o mesmo dado do campo id na tabela enquete. Achado esse valor, consultamos em uma segunda query, qual era a enquete que tinha o id igual a 1. Ns chamamos essas consultas de agrupamento manual, devido ao fato do usurio ter tomado o resultado da primeira query e ter colocado o resultado na clusula WHERE na segunda query. J esta query mostra quais so os elementos necessrios para realizar o agrupamento direto.

50

php=> SELECT enquete FROM resposta, enquete php-> WHERE resposta.id_enquete=enquete.id AND resposta='No natal'; enquete --------------------------------Quando ser que a greve acabar (1 row)
- As duas tabelas envolvidas no agrupamento so especicadas na clusula FROM; - As duas colunas necessrias para realizar o agrupamento esto especicadas na clusula WHERE; - A resposta testada na clusula WHERE; - A pergunta retornada pela query SELECT. Internamente, o banco de dados realiza as seguintes tarefas: - resposta='No natal': Encontra o registro que contm essa resposta; - resposta.id_enquete=enquete.id: Do registro encontrado, pegue o campo id_enquete. Encontre na tabela enquete o registro que possua esse nmero; - enquete: Retorna o nome da enquete procurada. Ou seja, o banco de dados realiza as mesmas operaes antes realizadas por ns manualmente, s que bem mais rpido. Constate que na maioria dos campos utilizados na ltima consulta, o nome foi

completamente qualicado para evitar ambiguidades como seria se tivssemos colocados s o campo id sem especicar a tabela, j que nas duas tabelas, existe o campo com o mesmo nome (id). A ordem em que aparece as tabelas ou as condies de consulta no so relevantes.

19.5 Escolhendo uma chave de agrupamento


Uma chave de agrupamento o valor usado para ligar registros entre tabelas. Por exemplo, 1 a chave da enquete, identicando unicamente o registro. Algumas pessoas questionam se um nmero de identicao necessrio. A resposta deveria ser usado como chave ? Usar strings como chave no uma boa idia por vrias razes: - Letras so mais fceis de serem digitadas incorretamente; - Duas respostas com o mesmo contedo seriam impossveis de distiguir uma da outra; - Se a resposta tiver que ser mudada, todas as referncias aquela resposta devem ser mudadas; - Agrupamentos com nmeros so mais ecientes do que agrupamentos de caracteres; - Nmeros requerem menos espao de armazenamento que strings. Pensando em uma tabela que tivesse todos os estados do brasil com as suas respectivas siglas. siglas poderiam As

sim

ser usadas como chave, pelos seguintes fatores:

51

- O cdigo de duas letras fcil para os usurios digitarem e de fcil memorizao; - Os cdigos dos estados so nicos; - Cdigos de estados no mudam; - Agrupamento usando chave com 2 caracteres no so muito mais lentos que agrupamento numrico; - A diferena de armazenamento no muito maior para guardar dois caracteres em vez de nmeros. Essencialmente, duas escolhas para chaves de agrupamento existem: nmeros de indenticao ou pequenos cdigos numricos.Nenhuma regra universal dita quando voc dever escolher cdigos alfanumricos ou nmeros de identicao. Os estados do Brasil so claramente um exemplo em que melhor o uso de cdigos de caracteres, por que s 27 existem. Os cdigos resultantes so pequenos, nicos, e

bem conhecidos pela maioria dos usurios. Geralmente melhor usar cdigos a nmeros de identicao quando o campo exige poucos registros.

19.6 Agrupamentos um-para-muitos


At agora, no agrupamento de duas tabelas, uma linha de uma tabela combinou exatamente com uma linha de outra tabela, realizando o chamado agrupamento um-para-um. Mas se unirmos agora todas as respostas que fazem parte de uma nica enquete ? Mltiplas respostas seriam impressas. No agrupamento um-para-muitos, uma linha na tabela enquete seria agrupada a mais de uma linha na tabela respostas. Agora suponha que nenhuma resposta existe para dada enquete. Mesmo que existe uma enquete vlida, se no existir nenhuma resposta para essa enquete, nenhuma linha ser retornada. Ns podemos chamar esse caso de agrupamento de um-para-nenhum, o chamado

outer join .

php=> SELECT resposta FROM enquete,resposta WHERE enquete.id=1; resposta ---------------------------------No natal Quando Paulo Renato morrer Quando a universidade acabar (3 rows)
Para a enquete com o cdigo igual a 1, houve o retorno de 3 linhas, indicando claramente o agrupamento um para muitos.

19.7 Chaves primrias e Chaves estrangeiras


Um agrupamento realizado pela comparao de duas colunas, como em enquete.id e resposta.id_enquete. A enquete.id chamada de enquete.

chave primria

porque ela o identicador nico e primrio para a tabela

A resposta.id_enquete chamada de

chave estrangeira

por que ela armazena dados de uma

chave primria de outra tabela.

52

Esta seo lidou com tcnica  a tcnica de criar uma disposio organizada usando mltiplas tabelas. Para adquirir esta habilidade necessrio prtica. Sempre espere mudar o seu banco de dados vrias vezes para a criao de um banco de dados organizado e denitivo. Uma boa disposio pode fazer seu trabalho car mais fcil. A m disposio pode tornar seu trabalho em consultas um inferno. Ao comear a criar suas tabelas para uma necessidade real, voc ser capaz de identicar os bancos de dados bem planejados. No tenha preguia ou medo de recomear seu banco de dados do zero, pois um duro

trabalho, mas quando feito apropriadamente, as consultas tornam-se mais fceis de serem realizadas.

53

20

Numerando linhas
Nmeros nicos e cdigos pequenos alfanumricos permitem referncias linhas especcas em uma

tabela. Elas foram bem discutidas na seo 19.5. Por exemplo, a tabela enquete tinha um campo chamado id que identicava unicamente um registro na tabela. A tabela resposta tinha um campo com o mesmo nome responsvel pela mesma funo. Enquanto caracteres de cdigos devem ser inseridos pelo usurio, a numerao de linhas de uma tabela pode ser geradas automaticamente usando-se dois mtodos. Esta seo descreve como usar esses dois mtodos.

20.1 Nmeros de Identicao de Objetos (OIDs)


PostgreSQL atribudo um nico nmero normalmente invisvel chamado de nmero de identicao de objeto (OID) . Quando o programa inicializado com initdb 1 , um contador
A toda e qualquer linha no criado e atribudo a ele um valor prximo aos dezessete mil. O contador usado para descrever unicamente toda linha. Apesar de banco de dados serem criados e destrudos, o contador continua a incrementar. Ele usado por todos os bancos de dados, por essa razo ele sempre nico. Nenhuma linha em qualquer tabela em qualquer banco de dados tero o mesmo nmero de identicao de objeto. Nessa apostila voc j viu alguns OIDs. So aqueles nmeros que aparecem depois de cada comando o comando que foi executado, 19073 o OID e um o

INSERT ,

como em

INSERT 19073 1 . INSERT

nmero de linhas inseridas. Normalmente, os OIDs s aparecem aps cada comando um comando que no o

INSERT .

Entretanto, se o OID especicado por

INSERT , ele ser mostrado. Apesar de nenhuma coluna OID ter sido mencionada no comando CREATE TABLE , toda tabela PostgreSQL inclui uma coluna invisvel chamada OID. Essa coluna s mostrada caso seja especicamente acessada. Qualquer query do tipo SELECT * FROM "alguma tabela" no mostrar a coluna OID. Entretanto, algo como SELECT OID,* FROM "alguma tabela" mostrar o
campo. O OID pode ser usado como chave primria ou chave estrangeira em agrupamentos (

joins ).

1 cria um banco de dados template1 usado por todos os outros banco de dados
54

php=> SELECT OID,* FROM enquete; oid | id | enquete | data -------+----+---------+-----------19013 | 1 | Quando ser que a greve acabar | 2001-07-11 (1 row)
Caso queiramos usar uma tabela que contenha chave estrangeira do tipo OID, temos que na sua criao, em vez de usar o tipo integer ou mesmo char, usar o tipo OID como no exemplo abaixo.

php=> CREATE TABLE teste php(> id php(> nome php(> chave php(> ); CREATE

( integer, char(100), oid

Uma coluna do tipo OID semelhante a uma coluna do tipo integer, mas denindo-a como um tipo OID documenta que a coluna receber valores OID. No confunda uma coluna com o tipo OID com a coluna chamada OID. Toda linha tem uma coluna chamada OID, a qual normalmente invisvel. Uma linha pode ter zero, uma ou mais colunas com o tipo OID. Uma coluna do tipo OID no automaticamente atribuda valor especial a ela. Somente a coluna OID atribuda um valor especial.

20.2 Limitaes dos Nmeros de Identicao de Objetos


Esta seo cobre as trs limitaces dos OIDs.

20.2.1 Numerao no sequencial


A natureza global de um OID signica que a maioria dos OIDs de uma tabela no so sequenciais. Por exemplo, se for inserida uma resposta hoje e um outra s amanh, as duas respostas no tero nmeros sequenciais. De fato, os seus OIDs podem ser diferentes em milhares por que qualquer comando

INSERT

em outros banco de dados em outras tabelas incrementariam o contador de objetos. Se o OID no est visvel aos usurios isso no um problema. A numerao no sequencial no interfere o processamento de query's. Entretanto, se os usurios podem ver esses nmeros, parece estranho os grandes buracos entre esses nmeros.

20.2.2 No modicvel
Um OID atribudo para cada linha no comando gerado pelo sistema.

INSERT . UPDATE

no pode modicar esse campo

20.2.3 No feito o back up por padro


Durante a cpia de segurana do banco de dados, o OID normalmente no copiado. Um ag deve ser usado para habilitar essa cpia.

55

20.3 Sequncias
PostgreSQL
como um oferece outro mtodo de numerao de linhas  sequncias. Sequncias so contadores nomeados criados por usurios. Aps sua criao, uma sequncia pode ser atribuda para uma tabela

DEFAULT

para a coluna. Usando sequncias, nmeros nicos podem ser automaticamente gerados

durante o comando

INSERT .

A vantagem das sequncias que elas evitam os buracos como no caso dos OIDs . Sequncias so ideais para o uso de um nmero de identicao visvel pelo usurio. Se uma resposta criada hoje e outra

amanh, as duas linhas tero nmeros sequenciais porque nenhuma outra tabela reparte o contador .

20.4 Criando Sequncias


Sequncias no so criadas automaticamente, como os OIDs. Ao invs, necessrio usar o comando

CREATE SEQUENCE .

Trs funes controlam o contador, como mostrado na tabela 23.

Funo

nextval('nome') curval('nome') setval('nome','valor')

Ao

Retorna o prximo valor da sequncia e atualiza o contador Retorna o valor corrente da sequncia Muda o valor do contador para o especicado no segundo argumento

Tabela 23: Funes de Acesso aos contadores

Abaixo, alguns exemplos na criao de sequncias e do uso das funes acima descritas.

php=> CREATE SEQUENCE ph_teste; CREATE php=> SELECT nextval('ph_teste'); nextval --------1 (1 row) php=> SELECT currval('ph_teste'); currval --------1 (1 row) php=> SELECT setval('ph_teste','20'); setval -------20 (1 row)
2 Os buracos podem ocorrer quando uma transao abortada 3 Tabelas diferentes podem usar o mesmo contador
56

20.5 Usando Sequncias para numerar linhas


Congurar uma sequncia para identicar unicamente as linhas envolvem vrios passos:

1. Criar a sequncia; 2. Criar a tabela, denindo 3. Durante o comando

nextval()

como sendo o valor padro para a coluna;

INSERT ,

no incluir um valor na coluna em questo ou usar o valor

nextval() .

php=> CREATE SEQUENCE aluno_id; CREATE php=> CREATE TABLE aluno ( php(> id INTEGER php(> nome CHAR(300), php(> tel CHAR(15) php(> ); CREATE

DEFAULT nextval('aluno_id'),

php=> INSERT INTO aluno VALUES (nextval('aluno_id'),'Osama','666666'); INSERT 19182 1 php=> INSERT INTO aluno (nome,tel) VALUES ('Saddam','666'); INSERT 19183 1
Como podemos ver, o primeiro comando cria a sequncia chamada cria a tabela aluno, e dene

aluno_id.

O segundo comando

nextval('aluno_id')

como sendo o valor padro para essa coluna. Os outros

comandos mostram como deve ser realizada a insero de dois modos diferentes mas, corretos.

20.6 Tipo Serial


Outro mtodo de se usar sequncias existe, sendo bem mais fcil o uso. Se voc denir uma coluna do tipo

SERIAL , uma sequncia ser automaticamente criada com o nome de nomedatabela_nomedocampo_seq ,

e um valor

nextval('nomedatabela_nomedocampos_seq')

ser denido como padro.

No se preocupe com os avisos que na criao da tabela com o tipo serial iro ocorrer. O primeiro indica que o banco de dados est criando implicitamente a sequncia para a coluna do tipo serial, e o segundo aviso indicando que um ndice est sendo criado, assunto que ser dado

EM ALGUM LUGAR NA FRENTE .

php=> CREATE TABLE professor ( php(> id serial, php(> nome char(300), php(> tel char(15) php(> ); NOTICE: CREATE TABLE will create implicit sequence 'professor_id_seq' for SERIAL column 'professor.id'
57

NOTICE: CREATE TABLE/UNIQUE will create implicit index 'professor_id_key' for table 'professor' CREATE
Algumas pessoas imaginam porque OIDs e sequncias so necessrias. Por que um usurio do banco de dados no pode encontrar o maior nmero em uso, adicionar um, e usar o resultado para numerar a prxima linha a ser adicionada ? Realmente, OIDs e sequncias so preferidas devidos a vrios fatos:

- Performance; - Concorrncia; - Padronizao.

Primeiramente, usualmente um processo demorado procurar todos os nmeros que esto sendo usados correntemente para encontrar o prximo nmero possvel. Referir-se a um contador localizado

separadamente mais rpido. Segundo, se um usurio achar o nmero mais alto, e um outro usurio est procurando pelo nmero mais alto ao mesmo tempo, os dois usurios podem achar o mesmo nmero. claro, neste exemplo, o nmero deixaria de ser nico. Tal problema de concorrncia no ocorre com OIDs e sequncias. Terceiro, mais convel usar um nmero dado pelo bando de dados do que um nmero baseado em uma consulta manual.

58

21

Performance
Quando acessando uma tabela,

21.1 ndices
PostgreSQL
normalmente l do comeo para o nal da tabela, procurando por registros relevantes. Com um ndice, possvel achar rapidamente valores especcos no ndice, podendo assim ir diretamente para os registros procurados. Desse modo, ndices permitem uma procura rpida de linhas especcas em uma tabela. Por exemplo, considere a query

SELECT * FROM aluno where id=145;

. Sem um ndice,

PostgreSQL deve

procurar em toda a tabela procurando por linhas que tenham 145 no campo 145. Com um ndice em id, o banco de dados pode ir direto para as linhas onde o id 145. Para tabelas grandes, pode-se levar minutos para checar cada linha. Usando um ndice, encontrar a linha desejada leva apenas segundos.

PostgreSQL

no cria ndices automaticamente .

Em vez disso, usurios

devem criar ndices em colunas muito utilizadas em clusulas WHERE. Para criar um ndice, usa-se o comando

CREATE INDEX nome ,

como mostrado abaixo.

php=> CREATE INDEX aluno_nome_idx ON aluno (nome); CREATE


Onde nome_aluno o nome do ndice criado, aluno a tabela a qual o ndice vai se referenciar, e nome o campo a ser indexado. Apesar de ser liberado o uso de qualquer nome para o ndice, um bom uso de criao de nome de ndices como foi mostrado. O nome do ndice contm a informao da tabela que ele se faz parte aluno, contm o nome da coluna indexada, nome, e aps isso, o underscore idx para indicar que foi criado um ndice.

Voc pode criar quantos ndices desejar.

claro, porm, um ndice em uma coluna raramente usada

desperdcio de espao de disco. Tambm, a performance na verdade pode diminuir caso existam muitos ndices, por que qualquer mudana de registros necessria uma atualizao em cada ndice.

Tambm possvel a criao de um ndice que indexe mais de uma coluna.

A nica mudana do co-

mando anterior na criao de um ndice simples a incluso de mais uma coluna entre os parentses. Esse tipo de ndice indicado quando indexamos as linhas de uma tabela, mas mesmo assim, temos muitas linhas com o mesmo valor da primeira linha indexada. Nesse caso, comea a ser feito a indexao pela segunda coluna do ndice.

ndices podem ser teis tambm em agrupamentos. quando usado clusulas ORDER BY.

Eles podem aumentar a velocidade na pesquisa

21.2 Indces nicos


A nica diferena para o ndice ordinrio, como o prprio nome diz, eles previnem valores duplicados de ocorrerem na tabela, na coluna indexada. O comando semelhante, apenas com o acrscimo da palavra

4 exceo quando se utiliza o campo do tipo serial

59

UNIQUE logo aps a palavra CREATE. s vezes, ndices nicos so criados apenas para evitar valores duplicados, no por questes de performance.

php=> CREATE UNIQUE INDEX aluno_tel_idxuni ON aluno (tel); CREATE


ndices nicos PERMITEM mltiplos valores NULL, entretanto. ndices nicos aumenta a velocidade e proibem a duplicata de valores.

60

22

Controlando Resultados
Quando uma query

SELECT

digitada no psql, o comando vai at o servidor de banco de dados,

executado, e o resultado enviado de volta ao psql para ser mostrado. um controle sobre quais linhas so retornadas.

PostgreSQL

permite que seja feito

22.1 Limites
As clusulas retornadas.

LIMIT

OFFSET

do comando

SELECT

permitem ao usurio escolhes quais linhas a serem

php=> SELECT COUNT(id) FROM aluno; count ------2 (1 row)


A funo count conta todos os registros existentes na tabela. indicando que existem apenas dois registros existem na tabela. Como visto, ela retornou o valor 2,

php=> SELECT * FROM aluno ORDER BY id LIMIT 2; id | nome | tel ----+------+----------------1 | Osama | 666666 2 | Saddam | 666 (2 rows) php=> SELECT * FROM aluno ORDER BY id LIMIT 2 OFFSET 1; id | nome | tel ----+--------+---2 | Saddam | 666 (1 row)
Constate que na segunda consulta apenas uma linha foi retornada. Isso ocorreu devido a existncia de apenas dois registros. Portanto, quando a sada da consulta foi deslocadas usando

OFFSET ,

mesmo com o

LIMIT

indicando duas linhas, apenas uma linha surgiu como resposta.

Verique que as duas query usam

ORDER BY . Apesar dessa clusula no ser necessria, LIMIT sem ORDER BY

retorna linhas randmicas da consulta, o que no muito til.

LIMIT

aumenta a performance reduzindo o nmero de linhas retornadas ao cliente.

61

23

Administrao de Tabelas
Essa seo mostra como criar tabelas temporrias e como realizar a alterao de tabelas ou de colunas.

23.1 Tabelas Temporrias


Tabelas temporrias so tabelas de curta durao de vida  elas s existem durante a sesso do banco de dados. Quando a sesso de banco de dados termina, suas tabelas temporrias so automaticamente destrudas. O exemplo na tabela 24ilustra esse conceito. Nele,

CREATE TEMPORARY TABLE

cria uma ta-

bela temporria. Na sada do programa psql, a tabela temporria destruda. Quando for reiniciado o programa psql, vericamos que no existe mais tal tabela.

As tabelas temporrias so visveis apenas para a sesso onde foi criada, elas permanecem invisveis para os outros usurios. De fato, vrios usurios podem criar tabelas temporrias com o mesmo nome, e cada usurio ver apenas a tabela criada por ele.

CREATE TEMPORARY TABLE temptest (col INTEGER) INSERT INTO temptest VALUES (1) SELECT col FROM temptest retorna 1

Usurio1

CREATE TEMPORARY TABLE temptest (col INTEGER) INSERT INTO temptest VALUES (2) SELECT col FROM temptest retorna 2

Usurio 2

Tabela 24: Duas sesses diferentes

Seu uso ideal para armazenar dados intermedirios usado pela sesso. Por exemplo, suponha que necessrio realizar vrias consultas para uma query complexa. Uma estratgia eciente realizar a

consulta uma vez, e depois guardar o valor em uma tabela temporria.

SELECT * INTO TEMPORARY telfonern FROM aluno WHERE tel like '84%'
Esse comando criou uma tabela temporria com dados 'herdados' da tabela aluno contendo os registros que tenham 84 no comeo do nmero do telefone.

23.2 Alteraes de Tabelas


ALTER TABLE
permite as seguintes operaes: - Renomear tabelas; - Renomear colunas; - Adicionar colunas; - Adicionar colunas com valores padro; - Remover colunas com valores padro.

62

Abaixo temos alguns exemplos do uso do comando

ALTER TABLE .

php=> CREATE TABLE altertest (col INTEGER); CREATE php=> ALTER TABLE altertest RENAME TO alterdemo; ALTER php=> ALTER TABLE alterdemo RENAME COLUMN col to democo; ALTER php=> ALTER TABLE alterdemo ADD COLUMN col2 INTEGER; ALTER

63

24

Chaves e constantes
Essa seo cobrir a ltima parte a ser vista no curso. Referncias e chaves so os tpicos mais

importantes para a criao de um banco de dados relacional, evitando assim a criao de um bando de dados sem utilidade.

24.1 Not Null


A palavra

NOT NULL

evita o aparecimento de valores nulos de aparecer em uma coluna. Essa clusula

deve ser colocada aps o tipo da coluna. Aps isso, qualquer insero que tente colocar um valor nulo na coluna descrita, falhar, gerando um erro de execuo. Uma boa sada para evitar esse tipo de erro colocar um valor padro para a coluna, podendo ser assim a denio.

php=> CREATE TABLE notenull ( php(> id INTEGER NOT NULL DEFAULT 32); CREATE

24.2 Unique
A clusula

UNIQUE

evita a existncia de valores duplicados de aparecerem na coluna. implementado

pela criao de um ndice nico na coluna. O exemplo abaixo ilustra o uso da clusula.

php=> CREATE TABLE unico (numero INTEGER UNIQUE); NOTICE: CREATE TABLE/UNIQUE will create implicit index 'unico_numero_key' for table 'unico' CREATE

24.3 Chave Primria


PRIMARY KEY , dene a coluna que identicar unicamente cada linha, uma combinao do uso das clusulas NOT NULL e UNIQUE . Com esses tipos de restries, UNIQUE evita duplicao enquanto NOT NULL evita a incluso de valores nulos. Abaixo temos a criao de uma chave primria .
A palavra

php=> CREATE TABLE chaveprimaria (col INTEGER PRIMARY KEY); NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index 'chaveprimaria_pkey' for table 'chaveprimaria' CREATE php=> \d chaveprimaria Table "chaveprimaria" Attribute | Type | Modifier -----------+---------+---------col | integer | not null Index: chaveprimaria_pkey

64

Note que um ndice criado automaticamente, e a coluna denida como sendo no nula. Se uma chave primria tiver mais de uma coluna, a clsula deve ser denida em uma linha separada para formar a chave.

php=> CREATE TABLE chaveprimaria ( php(> chave1 INTEGER, php(> chave2 INTEGER, php(> PRIMARY KEY(chave1,chave2) php(> ); NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index 'chaveprimaria_pkey' for table 'chaveprimaria' CREATE
Uma tabela no pode ter mais que uma chave primria. quando usamos relaes (chaves estrangeiras). Chaves primrias tm um valor especial

24.4 Chave Estrangeira, REFERENCES


Chaves estrangeiras so mais complexas que chaves primrias. Chaves primrias fazem uma coluna ser no nula e nica. Chaves estrangeiras, por sua vez, armazenam dados baseados em outras tabelas. Elas so assim chamadas por que seus dados no as pertecem, e sim a outra tabela. Para exemplicar iremos escrever as tabelas enquete e resposta com suas chaves e relaes.

php=> CREATE TABLE enquetef ( php(> id SERIAL PRIMARY KEY, php(> enquete CHAR(300), php(> data DATE php(> ); NOTICE: CREATE TABLE will create implicit sequence 'enquetef_id_seq' for SERIAL column 'enquetef.id' NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index 'enquetef_pkey' for table 'enquetef' CREATE
O comando acima cria a tabela enquetef, sendo a chave primria o campo com o tipo serial.

php=> CREATE TABLE respostaf ( php(> id SERIAL PRIMARY KEY, php(> resposta CHAR(200), php(> contador INTEGER, php(> id_enquete INTEGER REFERENCES enquetef php(> ); NOTICE: CREATE TABLE will create implicit sequence 'respostaf_id_seq' for SERIAL column 'respostaf.id'
65

NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index 'respostaf_pkey' for table 'respostaf' NOTICE: CREATE TABLE will create implicit trigger(s) for FOREIGN KEY check(s) CREATE
O comando acima cria a tabela respostaf, criando a chave estrangeira referenciando-se a tabela enquetef. Observe que a sintaxe de criao simples mas o conceito envolvido complexo. Esperamos com essa apostila clarear algumas dvidas sobre o SQL em si e o prprio

PostgreSQL .

66

25

Php e sua interao com PostgreSQL


Nesta seo veremos como acessar o banco de dados atravs do Php usando funes de fcil entenTodos os comandos abaixo so assumidos e testados nas verses PHP 4 ou acima

dimento e clareza. dela.

25.1 Abrir Conexo com o banco de dados


A funo usada para abrir uma conexo com o banco de dados

PostgreSQL

a funo

pg_connect .

Vrios parmetros so necessrios e alguns so opcionais. A seguir temos vrias possibilidade do uso da funo. int int int int pg_connect pg_connect pg_connect pg_connect (string host, string port, string dbname) (string host, string port, string options, string dbname) (string host, string port, string options, string tty, string dbname) (string conn_string)

Tabela 25: Alguns exemplos do cabealho da funo

A seguir, temos o signicado de cada um dos argumentos listados na Tabela 25.

host port tty

Indica qual mquina deseja-se conectar; Indica a porta utilizada na conexo; Indica o nome do banco de dados a ser aberta a conexo;

dbname options

Indica qual terminal a conexo deve ser realizada; Dene vrios outros argumentos tal como usurio e senha.

<?php $open = pg_Connect ("dbname=php"); //abre conexo com o banco de dados chamado "php" $open2 = pg_Connect ("host=arrobinha port=5460 dbname=php"); //abre conexo com o banco de dados chamado php na mquina arrobinha pela porta "5460" $open3 = pg_Connect ("host=newarrobinha port=5460 dbname=php user=sinec password=Ceni$"); //abre conexo com o banco de dados chamado php, na mquina newarrobinha, pela porta "5460" , com usurio e senha determinados ?>
A funo

pg_connect

retorna um ndice em caso de sucesso, ou falso se a conexo no puder ser aberta.

Os argumentos devem ser passados usando-se aspas duplas. Se uma segunda chamada feita pelo

pg_connect

com os mesmo argumentos, nenhuma nova conexo

ser aberta, mas em vez disso, ser retornado apenas o ndice da conexo j aberta anteriormente.

67

25.2 Executar uma consulta


A funo usada para realizar uma consulta a funo

pg_exec .

Dois parmetros so necessrios para

a conexo, a varivel que guarda o ndice da conexo e uma string, que no caso a query a ser executada. int pg_exec (int connection, string query)

Tabela 26: Cabealho da funo

pg_exec

A seguir, temos o signicado de cada um dos argumentos listados na Tabela 26.

connection query

Indica qual ndice de conexo previamente aberto deseja-se conectar;

Indica a porta utilizada na conexo.

Abaixo, temos exemplos do uso da funo

pg_exec .

<?php $open=pg_connect("user=sinec,dbname=php,host=localhost") or die("Impossvel abrir conexo"); $consulta="select chamada,noticia from noticia"; $exec=pg_exec($open,$consulta) or die("Impossvel executar consulta"); ?>
Usamos primeiramente a funo meamos o seu ndice com a varivel

pg_connect para open . Aps isso,

abrir uma conexo com o banco de dados, e nousamos uma varivel para guardar toda a string

da consulta, prtica indicada para facilitar o entendimento no uso das funes, no sendo preciso digitar todo o comando SQL dentro da funo responsvel pela execuo da query, a funo

pg_exec ,

que recebe

apenas duas variveis, a primeira sendo o identicador da abertura da conexo e a segunda sendo a prpria query a ser executada. Retorna como resultado um ndice se a query for executada, e falso se a conexo falhar ou o ndice da conexo no for vlido. Detalhes sobre erros podem ser recuperados usando a funo se a conexo for vlida. O valor de retorno da funo

pg_ErrorMessage()

pg_exec

um ndice que pode ser usado para

acessar resultados da query por outras funes

PostgreSQL .

25.3 Tratamento dos dados enviados na consulta


Tendo aprendido como abrir e executar comandos SQL por uma pgina PHP, temos que saber como tratar esses dados vindos do banco de dados, para poder utiliz-los de forma eciente. Existem vrias funes que podem tratar os dados, mas aqui por questo de simplicidade veremos apenas uma funo, que suciente para adquirir os dados de uma forma simples e clara. A funo

pg_result

tem como

entrada a execuo de uma query, a linha desejada e a coluna. Seu cabealho denido na tabela 27. mixed pg_result (int result_id, int row_number, mixed eldname)

Tabela 27: Cabealho da funo

pg_result

68

pg_result()

retornar valores de um identicador de ndice produzido pela funo

pg_exec() .

O nmero da linha e o

fieldname

especicam que clula da tabela ser retornada.

Nmeros de linha

comeam do zero. Ao invs de usar o nome do campo, pode-se usar um nmero como ndice, comeando do zero.

25.4 Exibir os dados


A exibio dos dados a sada do programa propriamente dita. aqui que vamos gerar o documento HTML com os resultados do programa PHP. Para isso, faz-se uso das funes

echo

ou

print

que tem

como propsito imprimir dados no documento HTML. Para melhor compreenso, veja o exemplo abaixo:

$coneccao = pg_connect("user=sinec dbname=php host=arrobinha"); $SQL = "SELECT * FROM noticia"; $resultado_geral = pg_exec($coneccao, $SQL); $id1 = pg_result($resultado_geral, 0, '"id"'); /* a varivel $id1 receber o id da notcia da primeira linha da consulta */ echo "$id1"; /* esta linha de cdigo faz com que seja impresso no documento HTML o contedo da varivel $id1 */

25.5 Fechar Conexo com o banco de dados


O ltimo passo necessrio na interao zada a funo

PostgreSQL

PHP o fechamento da conexo. A funo utili-

pg_close .

Ela recebe como argumento um ndice de uma conexo vlida e retorna uma

varivel booleana. Retorna falso caso o ndice no seja vlido ou verdadeiro caso a conexo seja fechada.

bool

pg_close (int connection)

Tabela 28: Cabealho da funo

pg_close
5
so auto-

Nota:
pg_close

O uso dessa funo usualmente no necessria, por que conexes no persistentes

maticamente fechadas no trmino da execuo do script. no fecha conexes persistentes geradas pela funo

pg_pconnect .

5 Aquelas conexes geradas com o uso da funo pg_connect


69

Referncias
[1] Barreto, Maurcio Vivas de Souza, [2] Pgina ocial do PHP,

Aplicaes Web com PHP ,


www.php.net, 2001.

2000.

PHP Manual,

[3] Castagnetto Jesus, Rawat Harish, Schumann, Scollo Chris, Veliath Deepak,

Professional PHP Pro-

gramming ,

2001.

[4] Momjian Bruce,

PostgreSQL: Introduction and Concepts ,

2000.

70

Você também pode gostar