Você está na página 1de 17

Apostila do FireBird 2.

0
com IBExpert

1
Criando o banco de dados no IbExpert

Um novo banco de dados pode ser criado simplesmente usando o menu Database/Create
DataBase ou usando o respectivo ícone na barra de ferramentas. A tela para criar o banco de
dados aparecerá:

(1) Server - Aqui você indica onde o banco de dados será armazenado:
1. Remote – indica uma conexão remota
2. Local – indica que o banco de dados será armazenado localmente.
(2) Server name - precisa ser conhecido caso o acesso seja remoto. As seguinte sintaxes
podem ser usadas:
1. Windows – SERVER_NAME:C:\path\database.fdb
2. Linux – SERVER_NAME:/path/database.fdb
(3) Protocol - o protocolo usado na conexão com o servidor: TCP/IP, NetBEUI ou SPX
(4) Database - Caminho e nome do arquivo de banco de dados no servidor
(5) Username - Nome do usuário. Padrão: SYSDBA
(6) Password - Senha do usuário. Padrão: masterkey
(7) SQL Dialect - Dialeto do banco. Padrão: 3
(8) Page Size - Especifica o tamanho de pagina do banco de dados em bytes
(9) Charset - Conjunto de caracteres. Brasil – ISO8859_1
(10) Marque para registra o banco de dados após cria-lo.
(11) Client Library File – Informa a API cliente para acesso ao banco de dados. Para o
firebird iremos usar o fbclient.dll

2
Registrando o banco de dados

Registrar o banco de dados é necessário para que o IBExpert reconheça o banco. É possível
especificar certas configurações durante o registro. O Editor de Registro de Banco de dados
pode ser aberto usando o menu Database/Register Database.

3
Tipos de Dados do Firebird

O Firebird Dialect 3, suporta a maioria dos tipos de Dados do SQL. O Firebird, apenas não tem
como tipo de dado, o tipo Boolean. Mas, isto não é uma falha do Firebird, outro SGDB´s
também não tem este tipo de dado. Apesar de não ter este tipo de dado, podemos criar o
nosso “tipo boolean” através de DOMAINS.

BLOB

O tipo de Dado BLOB, tem o tamanho variável, isto é, não sabemos na hora da criação do
campo BLOB qual será o seu tamanho realmente, mas, o limite do campo Blob que está na
documentação do Firebird, é de 64k por segmento.

Este tipo de campo é o tipo indicado para armazenar Textos Grandes “Memos”, Fotos,
Gráficos, Ícones, isto é, aparentemente não tem um tipo de dado que não possa ser
armazenado no Campo Blob. Campos Blob´s não podem ser indexados.

Saber qual o sub-tipo correto utilizar é essencial para criar aplicativos que se utilizem dos
campos BLOBs. Os BLOBs se apresentam em 3 versões :

Sub-tipo 0 - Armazena dados em formato binário – Fotos, etc.


Sub-tipo 1 - Armazena dados em formato texto – Memos.
Sub-tipos definidos pelo usuário.

Além dos 2 Sub-tipos pré-definidos, também existem os Sub-tipos definidos pelo usuário.
Esses tipos são determinados com o uso de valores negativos logo após a palavra SUB_TYPE.
O número utilizado é um inteiro determinado arbitrariamente pelo usuário de acordo com sua
preferência, desde que seja negativo.

A única consideração que deve ser tomada é a de se certificar de sempre armazenar o tipo pré-
determinado de informação no respectivo sub-tipo de BLOB. O Firebird não faz nenhuma
análise dos dados que estão sendo gravados, portanto essa é uma responsabilidade do
aplicativo. Nenhum erro será retornado pelo Firebird se um tipo errado de dado for inserido em
um BLOB de sub-tipo incorreto, mas um aplicativo pode ser prejudicado se ao recuperar as
informações do BLOB, a mesma não corresponder ao formato esperado.

Sintaxe :

Estas declarações é na criação da tabela :


MEMO BLOB SUB_TYPE 1;
FOTO BLOB SUB_TYPE 0;

Ex :

CREATE TABLE FUNCIONARIOS (


ID INTEGER NOT NULL PRIMARY KEY,
NOME VARCHAR(50) NOT NULL,
....,
FOTO BLOB SUB_TYPE 0,
EXPERIENCIA BLOB SUB_TYPE 1 SEGMENT SIZE 80,
)

Dica :

O tamanho de segmento (Segment Size), é um pequeno pedaço de informação, tipo um


conselho, que é mantido com a definição de um Blob. Quando se abre um Blob, pode-se
perguntar por segmentos de qualquer tamanho, mas para alguns Blobs um determinado
tamanho é mais conveniente que um outro. Blobs que armazenam texto, por exemplo,

4
freqüentemente utilizam segmentos de tamanho 80. O pré-processador e outros programas
utilitários usam o tamanho do segmento para determinar o tamanho de buffers que são
necessários para transferência de dados para e do Blob.

CHAR(n)

O tipo de Dado CHAR, tem o seu tamanho definido na hora da criação da tabela. Seu tamanho
máximo é de 32767, 32k. Este tipo tem o seu tamanho fixo.

Ex :
CREATE TABLE FUNCIONARIOS (
ID INTEGER NOT NULL PRIMARY KEY,
NOME VARCHAR(50) NOT NULL,
...
SEXO CHAR(01)
)

Este tipo de dado é usado quando você realmente souber o tamanho da coluna/campo a ser
criada. Outro exemplo, é criar o coluna de DOMAIN BOLLEAN.

VARCHAR(n)

O tipo de Dado VARCHAR, tem o seu tamanho definido na hora da criação da tabela. Seu
tamanho máximo é de 32767, 32k. Este tipo tem o seu tamanho variado na tabela. Isto é, se
você criar uma coluna de 45 Caracteres, mas, a coluna tenha apenas 20 Caracteres gravados,
o restante, os 25 Caracteres são descartados.

Ex :
CREATE TABLE FUNCIONARIOS (
ID INTEGER NOT NULL PRIMARY KEY,
NOME VARCHAR(50) NOT NULL
)

Este tipo de dado é usado quando você realmente não souber o tamanho da coluna/campo a
ser criada.

Outros exemplos, são criar campos Descrições, Inscrições Estaduais.

DATE

O tipo de Dado DATE, no DIALECT 3, armazena a Data, e seu tamanho é de 32 bits inteiros
longos.

Ex :
CREATE TABLE FUNCIONARIOS (
ID INTEGER NOT NULL PRIMARY KEY,
NOME VARCHAR(50) NOT NULL,
...,
DATA_ADMISSAO DATE
)

O Tipo Date, no Dialect 1, armazena Data e Hora ao mesmo tempo.

TIME

O tipo de Dado TIME, no DIALECT 3, armazena a hora, e seu tamanho é de 32 bits inteiros
longos.

5
Ex :
CREATE TABLE FUNCIONARIOS (
ID INTEGER NOT NULL PRIMARY KEY,
NOME VARCHAR(50) NOT NULL,
...,
HORA_ENTRADA TIME,
HORA_SAIDA TIME
)

O Tipo Time, no Dialect 1, não existia.

TIMESTAMP

O tipo de Dado TIMESTAMP, no DIALECT 3, armazena a Data e a hora ao mesmo tempo, e


seu tamanho é de 32 bits inteiros longos.

Ex :
CREATE TABLE PRODUTOS (
ID INTEGER NOT NULL PRIMARY KEY,
DESCRICAO VARCHAR(50) NOT NULL,
...,
DATA_HORA_MOVIMENTACAO TIMESTAMP
)

O Tipo TimeStamp, no Dialect 1, não existia.

DECIMAL

O tipo de Dado DECIMAL, armazena dígitos a serem gravados na precisão especificada na


criação da tabela.

Ex :
CREATE TABLE FUNCIOARIOS (
ID INTEGER NOT NULL PRIMARY KEY,
DESCRICAO VARCHAR(50) NOT NULL,
...,
SALARIO DECIMAL(15,02)
)

NUMERIC

O tipo de Dado NUMERIC, armazenas dígitos a serem gravados na precisão especificada na


criação da tabela.

Ex :
CREATE TABLE FUNCIOARIOS (
ID INTEGER NOT NULL PRIMARY KEY,
DESCRICAO VARCHAR(50) NOT NULL,
...,
SALARIO NUMERIC(15,02)
)

SMALLINT

O tipo de Dado SMALLINT, armazena dígitos a serem gravados, mas, com o limite de : -32768
a 32767.

Serve para armazenar dados numéricos pequenos.

6
Ex :
CREATE TABLE FUNCIOARIOS (
ID INTEGER NOT NULL PRIMARY KEY,
DESCRICAO VARCHAR(50) NOT NULL,
...,
ALTURA SMALLINT
)

INTEGER

O tipo de Dado INTEGER, armazena dígitos a serem gravados, mas, diferente do SMALLINT,
não existe um limite aparentemente, este tipo é de 32 bits, tem a escala de valores em :
-2.147.483.648 até 2.147.483.648

Ex :
CREATE TABLE FUNCIOARIOS (
ID INTEGER NOT NULL PRIMARY KEY,
DESCRICAO VARCHAR(50) NOT NULL,
...)

BIGINT

O tipo de Dado BIGINT, armazena dígitos a serem gravados, não existe um limite
aparentemente, este tipo é de 64 bits.

Ex :
CREATE TABLE FUNCIOARIOS (
ID BIGINT NOT NULL PRIMARY KEY,
DESCRICAO VARCHAR(50) NOT NULL,
...)

FLOAT

O tipo de Dado FLOAT, armazena dígitos a serem gravados, mas, com precisão simples de 7
dígitos.

Ex :
CREATE TABLE PRODUTOS (
ID INTEGER NOT NULL PRIMARY KEY,
DESCRICAO VARCHAR(50) NOT NULL,
VLR_ULT_CMP_ITEM FLOAT
...)

DOUBLE PRECISION

Este é o tipo de campo no qual eu recomenda para uso monetário/valores no Firebird, Dialect
3. Sua precisão é de 64 bits, na documentação fala em usar apenas para valores científicos,
mas, eu o uso em todos os sistemas, e obtenho sempre o arredondamento e precisão
desejada.

Ex :
CREATE TABLE MOV_FINANCEIRA (
IDCODMOEDA CHAR(03) NOT NULL PRIMARY KEY,
DATA_MOVIMENTACAO DATE NOT NULL PRIMARY KEY,
VALOR_TOTAL_MOVIMENTACAO_DIA DOUBLE PRECISION
);

7
Domínios

Conjunto de valores permitidos para um dado.

Cria uma definição de um “novo tipo de dado”. Onde pode ser feito também, checagem de
valor, isto é, regras para o dado ser gravado neste “novo tipo de dado”. Quando falo em novo
tipo de dado, não é possível no Firebird “sem alterar os fontes do mesmo”, criar um novo tipo
de dado, mas, com DOMAINS, nós usamos dados já existentes, mas, especificando o tamanho
e a regra a ser seguida.

Usando DDL:

CREATE DOMAIN domain [AS] ALTER DOMAIN <domain_name> DROP DOMAIN <domain_name>;
<datatype> SET DEFAULT <default_value>
[DEFAULT { literal | NULL | | NULL | USER
USER}] DROP DEFAULT
[NOT NULL] [CHECK ADD CHECK
( <dom_search_condition>)] <domain_search_condition>
[COLLATE collation]; DROP CONSTRAINT;

Exemplo:

CREATE DOMAIN SEXO


AS INTEGER
DEFAULT 'M'
NOT NULL
CHECK (VALUE IN
('M','F');

CREATE DOMAIN QUANTIDADE


AS NUMERIC (15,3)
DEFAULT 0
NOT NULL
CHECK (VALUE >= 0);

Usando IBExpert

Um novo domínio pode ser criado para o banco de dados conectado, usando o menu
Database/New Domain, ou clicando com o botão direito do mouse no DB Explorer –
Domains/New Domain.

(1) Name – Nome do domínio


(2) Field Type – Tipo do campo
(3) Size – Tamanho do campo

8
(4) Scale – Número de lugares decimais que pode ser especificado para todos campos
numéricos
(5) Not Null – Determina se o campo poderá ter nulo ou não
(6) SubType – Precisa ser especificado para campos tipo BLOB
(7) Charset – Especificando um charset ele sobrescreverá o charset default do banco de
dados. Use ISO8859_1
(8) Collate – Determina o collate para o charset especificado. Use PT_BR
(9) Default Source – Valor que será armazenado caso o campo esteja como nulo.
(10) Check – Verifica a integridade do domínio
Ex: VALUE > 0, VALUE IN ('ES','RJ')
(11) Array – Determina um campo como array, digite aqui a faixa para o array.
Ex: 1:100
(12) Description – Descrição para o domínio

Depois de definido o domínio basta clicar no botão Compile na barra de ferramentas.

Nome Tipo de Tamanho Escala Não Charset Collate Default Check


campo Nulo Source
DOM_CEP VARCHAR 10 ISO8859_1 PT_BR
DOM_CODIGO INTEGER X
DOM_CPF VARCHAR 15 ISO8859_1 PT_BR
DOM_DATA DATE
DOM_DATA_HORA TIMESTAMP CURRENT
_TIME
DOM_DESCRICAO VARCHAR 40 ISO8859_1 PT_BR
DOM_DINHEIRO NUMERIC 15 2 0
DOM_DOCUMENTO VARCHAR 20 ISO8859_1 PT_BR
DOM_EMAIL VARCHAR 100 ISO8859_1 PT_BR
DOM_ENDERECO VARCHAR 40 ISO8859_1 PT_BR
DOM_ESTADO CHAR 2
DOM_HORA TIME
DOM_IDENTIDADE VARCHAR 15 ISO8859_1 PT_BR
DOM_NOME VARCHAR 60 X ISO8859_1 PT_BR
DOM_TELEFONE VARCHAR 20 ISO8859_1 PT_BR
DOM_TIPO_MOVIMENTO CHAR 1 X VALUE IN ('E','S')

9
Tabelas

Estrutura composta por linhas e colunas que serve para armazenar os dados em um banco de
dados relacional. A linha indica uma ocorrência do objeto do mundo real, e a coluna serve para
qualificar o objeto. Dessa forma, se imaginarmos uma tabela PESSOA, ela teria em cada linha
uma pessoa e em cada coluna as informações relevantes dessa pessoa, como nome, peso,
altura, data de nascimento, documento de identidade etc. A idéia central é que as
características do objeto permitam identificar uma única pessoa em cada linha da tabela

Usando DDL:
CREATE TABLE TABLE_NAME ( ALTER TABLE <table_name> DROP TABLE
COLUMN_NAME1 <COLUMN_DEFINITION>, ADD <field_name> <field_definition> <table_name>;
COLUMN_NAME2 <COLUMN_DEFINITION>, ADD CONSTRAINT <constraint_name>
... <constraint_definition>
COLUMN_NAMEn <COLUMN_DEFINITION>; DROP CONSTRAINT <constraint_name>
TABLE_CONSTRAINT1,TABLE_CONSTRAINT2, DROP <field_name>;
...
TABLE_CONSTRAINTn);

Exemplo:

CREATE TABLE cliente (


codigo INTEGER,
nome VARCHAR(30) NOT NULL,
sexo VARCHAR(1),
CPF VARCHAR(11) UNIQUE,
endereco VARCHAR(40),
cidade VARCHAR(20),
dt_nascimento DATE,
idade COMPUTED BY ((CURRENT_DATE -
dt_nascimento) / 360),
primary key (codigo),
CHECK ( (sexo = 'M') AND (idade > 18) )
)

Usando IBExpert

Uma nova tabela pode ser criada para o banco de dados conectado, usando o menu
Database/New Table, ou clicando com o botão direito do mouse no DB Explorer – Tables/New
Table.

(1) Name – Nome da tabela


(2) Primary e Foreing Key - Na primeira coluna PK um ou mais campos podem ser
definidos como chave primária (duplo clique). Uma chave primária indica uma
identificação única para o conjunto de dados.
(3) Field Name – Nome do campo
(4) Field Type – Tipo do campo
(5) Domain – Aqui pode ser usado um domínio anteriormente cadastrado
(6) Size – Tamanho do campo
(7) Scale – Número de lugares decimais que pode ser especificado para todos campos
numéricos

10
(8) SubType – Precisa ser especificado para campos tipo BLOB
(9) Array – Determina um campo como array, digite aqui a faixa para o array.
Ex: 1:100
(10)Not Null – Determina se o campo poderá ter nulo ou não
(11) Charset – Especificando um charset ele sobrescreverá o charset default do banco de
dados. Use ISO8859_1
(12) Collate – Determina o collate para o charset especificado. Use PT_BR
(13) Description – Descrição para o domínio
(14) AutoInc – Usando a barra de espaço ou um duplo clique, uma caixa de diálogo
aparecerá para definir o campo auto-incremento.

(15) Check – Verifica a integridade do domínio


Ex: VALUE > 0, VALUE IN ('ES','RJ')
(16) Computed Source – Permite definir um campo calculado, a partir dos campos da
tabela.
Ex: NOME_COMPLETO = PRIMEIRO_NOME ||' '|| SEGUNDO_NOME
TOTAL = QUANTIDADE * PRECO_UNITARIO
(17) Computed Source – Valor que será armazenado caso o campo esteja como nulo
Ex: 0 para campos numéricos

11
Seqüência ou Generator

Cria um Generator de número inteiros e seqüenciais. O Generator em conjunto com Trigger e


ou Stored Procedure, é usado para simular um campo auto-incremento dos Bancos Desktop's.
Serve também para evitar chaves duplicadas em campos numéricos.

O valor default é Zero, mas, é atualizado toda vez que é chamado a função GEN_ID(). O
Generator pode ser usado para incrementar ou decrementar valores. Para se saber o código
atual do Generator você passa o valor Zero "0 para o Gen_ID().

Usando DDL:
DDL Retorna o próximo valor da Exibe seqüências
Seqüência
CREATE SEQUENCE <name>; SELECT NEXT VALUE FOR SHOW SEQUENCE
ALTER SEQUENCE <name> RESTART WITH <SequenceName> FROM RDB$DATABASE; <SequenceName>;
<value>; SHOW SEQUENCES;
DROP SEQUENCE <name>; NEXT VALUE FOR GEN_CLIENTE;

CREATE GENERATOR <name>; <intvar> = GEN_ID( SHOW GENERATOR


SET GENERATOR <name> TO <value>; <GeneratorName>, <increment> ); <GeneratorName>;
DROP GENERATOR <name>; SHOW GENERATORS;

Ex: Simulando um auto-incremento para a tabela de CLIENTES na coluna CODIGO.

CREATE GENERATOR GEN_CLIENTE;

CREATE TRIGGER "TR_AUTO_INCREMENTO_CLIENTE" FOR "CLIENTE" BEFORE INSERT POSITION 0


AS
BEGIN
NEW.CODIGO = NEXT VALUE FOR GEN_CLIENTE;
END

Usando IBExpert

Um novo GENERATOR ou SEQUENCE pode ser criado para o banco de dados conectado,
usando o menu Database/New Generator, ou clicando com o botão direito do mouse no DB
Explorer – Tables/New Generator.

12
Visões - Views

Uma visão, na terminologia SQL, é uma tabela única derivada de outra tabela, que pode ser
uma tabela básica ou uma visão previamente definida. Uma visão não existe de forma física,
ela é considerada uma tabela virtual, em contraste com as tabelas básicas, cujas tuplas são
realmente armazenadas no banco de dados. Isso limita as operações de atualização possíveis
para as visões, embora não imponha nenhuma limitação para as consultas.

Existem apenas dois tipos de visões:


– Visões apenas para leitura – quando seus dados não podem ser editados
– Visões de atualização – quando é possível a alteração do estado do banco de dados

As visões são utilizadas para realizar tarefas como:


– Restringir o acesso dos usuários
– Mostrar apenas as colunas “X”
– Filtragem de dados já pré formatados

Em resumo, podemos fazer as seguintes observações:

– Uma visão de uma única tabela de definição é atualizável se a visão contiver, entre seus
atributos, a chave primária da relação básica, bem como todos os atributos com restrição
NOT NULL que não contiverem valores default especificados.
– As visões definidas a partir de diversas tabelas utilizando-se as junções, em geral, não são
atualizáveis.
– As visões definidas usando-se as funções de agrupamento e agregadas não são
atualizáveis.

Usando DDL:

CREATE VIEW name [(view_col [, view_col …])]


AS <select> [WITH CHECK OPTION];

Ex : CREATE VIEW TELEFONES


( NOME, TELEFONE )
AS
SELECT
NOME, TELEFONE
FROM
CLIENTES;

Usando IBExpert

Um nova VIEW pode ser criada para o banco de dados conectado, usando o menu
Database/New View, ou clicando com o botão direito do mouse no DB Explorer – Tables/New
View.

13
Exception

É uma mensagem de erro definida pelo usuário, escrita especificamente para um banco de
dados e armazenada no banco, e só pode ser usada em Stored Procedure e ou Trigger.

Usando DDL:

CREATE EXCEPTION <Exception_Name>


"Exception_Text";

Usando IBExpert

Um nova Exception pode ser definida para o banco de dados conectado, usando o menu
Database/New Exception, ou clicando com o botão direito do mouse no DB Explorer –
Tables/New Exception.

14
15
16
Referências Bibliográficas
C. J. Date. Introdução a Sistemas de Banco de Dados, 8ª Edição, Editora Campus, 2004

Coleção Info 2006, Banco de dados.

Elmasri, R.; Navath, S. B. Sistemas de Banco de Dados, 4ª Edição, Editora Pearson, 2005.

Rodrigues, A. H. Apostila de Firebird 1.0. Adaptação de Interbase para Firebird por um


colaborador da CFLP.

Tradução de informações, IBExpert Documentation, disponível através do endereço


eletrônico: http://www.ibexpert.info/documentation/index.html, acessado em 15/04/2007.

17