Академический Документы
Профессиональный Документы
Культура Документы
1. INTRODUO---------------------------------------------------------------------------------------------------------3 1.1 TIPOS DE DECLARAO -----------------------------------------------------------------------------------------------3 1.2 OUTROS OBJETOS DE BANCO DE DADOS-------------------------------------------------------------------------------3 2. CRIANDO E INSERINDO------------------------------------------------------------------------------------------4 3. QUERIES ---------------------------------------------------------------------------------------------------------------4 3.1 RESTRINGINDO--------------------------------------------------------------------------------------------------------4 3.1.1 Outros predicados relacionais------------------------------------------------------------------------------5 3.2 UTILIZANDO QUERIES PARA MANIPULAR DADOS-------------------------------------------------------------------6 3.2.1 Operadores Aritmticos--------------------------------------------------------------------------------------6 3.2.2 Funes Agregadas-------------------------------------------------------------------------------------------7 3.2.3 Funes No Agregadas-------------------------------------------------------------------------------------8 3.3 SELECIONANDO CONSTANTES-----------------------------------------------------------------------------------9 3.4 ORGANIZANDO O RESULTADO----------------------------------------------------------------------------------9 3.5 EXCLUINDO LINHAS DA CONSULTA-------------------------------------------------------------------------------9 3.6 CLASSIFICANDO O RESULTADO-------------------------------------------------------------------------------11 3.7 J O I N S (JUNES) - CONSULTAS COM MAIS DE UMA TABELA-----------------------------------------------11 3.7.1 Equijuno----------------------------------------------------------------------------------------------------11 3.7.2 Consulta externa --------------------------------------------------------------------------------------------11 3.7.3 Autojuno ---------------------------------------------------------------------------------------------------12 3.7.4 Outros tipos de juno--------------------------------------------------------------------------------------12 3.7.5 UNION --------------------------------------------------------------------------------------------------------13 3.8 SUBQUERIES---------------------------------------------------------------------------------------------------------13 3.8.1 Aninhamento de Queries compostas----------------------------------------------------------------------14 3.8.2 Subqueries CORRELATAS--------------------------------------------------------------------------------14 3.9 UTILIZANDO QUERIES PARA INCLUIR DADOS-------------------------------------------------------------------------15 4. TABELAS VIRTUAIS: VISES----------------------------------------------------------------------------------15 5. ALTERANDO TABELAS, VISES E DADOS---------------------------------------------------------------16 5.1 ATUALIZANDO DADOS ----------------------------------------------------------------------------------------------17 5.2 APAGANDO DADOS--------------------------------------------------------------------------------------------------17 5.3 DECLARAES DE DEFINIO DE DADOS----------------------------------------------------------------------------18 6. UTILIZANDO NDICES PARA MELHORAR A PERFORMANCE-----------------------------------19 7. SQLTALK-------------------------------------------------------------------------------------------------------------20 8. O CATLOGO DO SISTEMA E O COMPARTILHAMENTO DE UM BD-------------------------21 8.1 TABELAS DO CATLOGO---------------------------------------------------------------------------------------------21 8.2 NVEIS DE AUTORIDADE E PRIVILGIOS------------------------------------------------------------------------------21 8.3 SINNIMOS----------------------------------------------------------------------------------------------------------23 8.4 PERMITINDO O ACESSO AO CATLOGO DO SISTEMA------------------------------------------------------------------24 8.5 REVOGANDO AUTORIDADE E PRIVILGIOS----------------------------------------------------------------------------24 8.6 ALTERANDO SENHAS------------------------------------------------------------------------------------------------25
SQL
9. UTILITRIOS E RECUPERAO DO BANCO DE DADOS-------------------------------------------25 9.1 LOAD--------------------------------------------------------------------------------------------------------------25 9.2 UNLOAD --------------------------------------------------------------------------------------------------------26 9.3 REORGANIZE---------------------------------------------------------------------------------------------------27 9.4 JOURNALING (ACOMPANHAMENTO)----------------------------------------------------------------------------------27 10. CONCEITOS DE PROGRAMAO EM SQL-------------------------------------------------------------28 10.1 PROCESSAMENTO LINHA A LINHA----------------------------------------------------------------------------------28 10.2 SUBSTITUIO DE VARIVEIS--------------------------------------------------------------------------------------28 10.3 TRATAMENTO DE ERROS-------------------------------------------------------------------------------------------29 10.4 FASES DO PROCESSAMENTO DE DECLARAES SQL---------------------------------------------------------------29 10.4.1 COMPILAO em 4 passos:-----------------------------------------------------------------------------29 10.4.2 EXECUO-------------------------------------------------------------------------------------------------30 10.4.3 CARGA -----------------------------------------------------------------------------------------------------31 10.4.4 Conectando e desconectando----------------------------------------------------------------------------32 10.5 UTILIZANDO UMA INTERFACE DE CHAMADA DE FUNO (API)----------------------------------------------------34 10.5.1 CONEXO--------------------------------------------------------------------------------------------------35 10.5.2 COMPILAO---------------------------------------------------------------------------------------------35 10.5.3 ASSOCIAO DOS DADOS (bind)---------------------------------------------------------------------36 10.5.4 DEFINIO DE BUFFERS DE SADA---------------------------------------------------------------37 10.5.5 EXECUO-------------------------------------------------------------------------------------------------38 10.5.6 CARGA-------------------------------------------------------------------------------------------------------38 10.5.7 COMMIT-----------------------------------------------------------------------------------------------------38 10.5.8 DESCONEXO---------------------------------------------------------------------------------------------39 10.6 UTILIZANDO UMA INTERFACE DE PR-COMPILADOR----------------------------------------------------------------39 10.6.1 Utilizando um pr-compilador SQL-COBOL----------------------------------------------------------40 10.6.2 SELECTs que retornam vrias linhas------------------------------------------------------------------41 10.6.3 CARGA-------------------------------------------------------------------------------------------------------43 10.6.4 Variveis principais---------------------------------------------------------------------------------------44 11. A N E X O-------------------------------------------------------------------------------------------------------------46 11.1 TIPOS DE DADOS (EXTRADO DO MANUAL DE DB2):-------------------------------------------------------46 11.2 OPERADORES RELACIONAIS----------------------------------------------------------------------------47 11.3 PERFORMANCE (EM DB2)----------------------------------------------------------------------------------47
SQL
1.
Introduo
SQL uma linguagem usada para gerenciar um sistema de banco de dados relacional. EXTENSES so recursos externos SQL padro. SQL INTERATIVA executada a partir do teclado. SQL EMBUTIDA inserida em programas aplicativos. QUERIES so expresses que recuperam dados das tabelas. As declaraces so executadas por intermdio de um programa escrito em C chamado SQLTalk que complementa a SQL padro com comandos e funes e atua junto ao sistema de banco de dados mesmo nas declaraes mais comuns.
SQL
2.
CRIANDO E INSERINDO
CREATE TABLE HOSPEDES (NOME VARCHAR(25) NOT NULL, SEXO VARCHAR(1), BIOTIPO VARCHAR(1), ALTURA DECIMAL(3,2)); TABLE CREATED. INSERT INTO LISTA_DE_HOSPEDES (NOME,QUARTO, TECNICO, CHEGADA, SAIDA, DESCONTO) VALUES (JEAN PAUL BROWN, 3, JULIO, 15-MAI-1996, NULL, 0.2); 1 ROW INSERTED OBS.: o nome das colunas OPCIONAL quando so includos contedo para todas elas e OBRIGATRIO quando apenas algumas colunas so preenchidas. No caso, a meno das colunas dispensvel visto que a nica coluna que no seria preenchida teve seu contedo definido com a expresso NULL.
3.
QUERIES
So apresentadas em forma de tabelas e por isso tambm podem ser chamadas de tabela resultado. SELECT * FROM HOSPEDES; SELECT NOME, QUARTO FROM HOSPEDES; SELECT DISTINCT NOME FROM LISTA_DE_HOSPEDES; A clusula DISTINCT elimina linhas repetidas de nomes, neste caso se o JOS esteve hospedado mais de uma vez, seu nome aparecer apenas uma vez na tabela resultado.
3.1 Restringindo
SELECT NOME FROM LISTA_DE_HOSPEDES WHERE TECNICO=TODD TECNICO=TODD um predicado relacional, e; o sinal = um operador relacional simples. SELECT NOME FROM LISTA_DE_HOSPEDES WHERE DESCONTO>.15;
SQL
SQL
+, -, *, /
Tambm existem as palavras: SYSDATETIME e SYSTIME YEAR(S) MONTH(S) HOURS(S) MINUTE(S) SECOND(S) MICROSECOND(S) OBS.: No caso do DB2, estas palavras so equivalentes a: CURRENT TIMESTAMP, CURRENT DATETIME, CURRENT DATE e CURRENT TIME
IMPORTANTE: Funes agregadas no podem aparecer em clusulas WHERE. S possvel incluir um nome de coluna juntamente com uma funo agregada incluindo a clusula GROUP BY. EXEMPLOS: SELECT AVG(DESCONTO), MAX(DESCONTO), MIN(DESCONTO) FROM LISTA_DE_HOSPEDES; SELECT MIN(DESCONTO) * AVG(SAIDA-CHEGADA) FROM LISTA_DE_HOSPEDE WHERE TECNICO=SERENA;
SQL
SELECT COUNT(*), COUNT(SAIDA), COUNT(NOME), COUNT(DISTINCT NOME) FROM LISTA_DE_HOSPEDES; SELECT TECNICO, NOME, COUNT(NOME) FROM LISTA_DE_HOSPEDES GROUP BY TECNICO, NOME;
SQL
@MONTHBEG() Idem para ms; @QUARTERBEG() Idem para trimestre; @YEARBEG() Idem para ano;
SQL
Obs2: S possvel usar HAVING com nomes de colunas que aparecem no GROUP BY; Obs3: HAVING aceita funes agregadas, pois no est no GROUP BY.
SQL
10
3.7.1 Equijuno
uma juno baseada numa condio de igualdade SELECT HOSPEDES.NOME, ALTURA, TECNICO FROM HOSPEDES, LISTA_DE_HOSPEDES WHERE HOSPEDES.NOME=LISTA_DE_HOSPEDES.NOME;
SQL
11
Ainda que no haja linhas na tabela 2 correspondentes as linhas da tabela 1, as linhas da tabela 1 sero exibidas. OBS.: A tabela 2 que poder conter linhas em branco determinada com o smbolo (+) na clusula WHERE. SELECT HOSPEDES.NOME, ALTURA, TECNICO FROM HOSPEDES, LISTA_DE_HOSPEDES WHERE HOSPEDES.NOME=LISTA_DE_HOSPEDES.NOME(+);
3.7.3 Autojuno
a juno de uma tabela com ela mesma. SELECT A.NOME, A.DESCONTO FROM LISTA_DE_HOSPEDES A, LISTA_DE_HOSPEDES B WHERE A.DESCONTO = B.DESCONTO AND B.NOME = JOAO
OBS.: A expresso FROM LISTA_DE_HOSPEDES A faz com que possamos chamar LISTA_DE_HOSPEDES de A. Isto reduz a digitao no resto da declaraco SQL.
SQL
12
3.7.5 UNION
Vincula queries sucessivas e une os seus resultados. As linhas duplicadas so suprimidas. SELECT NOME FROM HOSPEDES UNION SELECT NOME FROM LISTA_DE_HOSPEDES; OBS.: O resultado no repete nomes. SELECT NOME FROM HOSPEDES WHERE BIOTIPO= M UNION SELECT NOME FROM LISTA_DE_HOSPEDES WHERE TECNICO = TODD UNION SELECT HOSPEDE FROM HOSPEDE_PS WHERE PESO BETWEEN 59 AND 70 ORDER BY 1 DESC;
3.8 Subqueries
Uma subquerie uma declarao SELECT embutida na clusula WHERE ou HAVING de uma outra querie. SELECT TECNICO, COUNT(NOME) FROM LISTA_DE_HOSPEDES GROUP BY TECNICO HAVING COUNT(NOME) > (SELECT COUNT(NOME) FROM LISTA_DE_HOSPEDES WHERE TECNICO = JULIO); SELECT NOME FROM HOSPEDES A WHERE EXISTS (SELECT * FROM LISTA_DE_HOSPEDES WHERE A.NOME = NOME);
SQL
13
WHERE TECNICO = A.TECNICO); Obs.: Est querie retorna o nome, tcnico e o tempo de estada de cada hspede que tiver ultrapassado o tempo de estada mdio das pessoas orientadas pelo mesmo tcnico.
4.
Uma viso pode ser usada por diversas razes: 1. Substituir queries complexas e demoradas; 2. Permitir o uso de funes agregadas na clusula de pesquisa (where); 3. Restringir o acesso aos dados (segurana); 4. Consistir as incluses e atualizaes dos dados atravs do comando CHECK; 1. CREATE VIEW VISAO_PS_CERTO (NOME, SEXO, BIOTIPO, ALTURA, PS_MIN, PS_MAX) AS SELECT NOME, A.SEXO, A.BIOTIPO, A.ALTURA, PS_MIN, PS_MAX FROM HOSPEDES A, QUADRO_DE_PESOS B WHERE A.SEXO = B.SEXO AND A.BIOTIPO = B.BIOTIPO AND A.ALTURA = B.ALTURA: 2. CREATE VIEW VISAO_PS_MEDIO (HOSPEDE, PS_MEDIO) AS SELECT HOSPEDE, AVG(PESO) FROM HOSPEDE_PS GROUP BY HOSPEDE; 4. CREATE VIEW HOSPEDES_PREFERENCIAIS AS SELECT NOME, DESCONTO FROM LISTA_DE_HOSPEDES
SQL 15
WHERE DESCONTO !< .15 AND NOME IN (SELECT NOME FROM HOSPEDES) WITH CHECK OPTION; OBS1.: Quando quisermos inserir dados nesta VIEW, s poderemos incluir quando DESCONTO for igual ou maior a 15%. OBS2.: A consistncia do nome s ser efetuada quando a linguagem for a SQLBase, pois a SQL Padro no verifica subqueries que contenham mais de uma linha no resultado. As REGRAS para que a consistncia funcione so: a) no contiverem subqueries (para SQL Padro); b) se referirem somente a colunas da tabela original, ou seja, de onde veio a viso Para que a VIEW seja ATUALIZVEL preciso atender as seguintes regras: 1. Deve originar de apenas uma tabela; 2. Nenhuma coluna pode derivar de uma funo agregada ou expresso aritmtica; 3. No pode existir as palavras-chave DISTINCT, GROUP BY ou HAVING na clusula SELECT de criao da view; 4. O usurio deve ter autoridade; Existem ainda: VIEWs READ-ONLY: aquelas que no podem ser atualizadas, pois no foram criadas conforme as regras anteriores; VIEWs PARCIALMENTE ATUALIZVEIS: aquelas que possuem colunas que obdecem a regra 2 e colunas que no obdecem; Error: not enough non-null values a mensagem de erro emitida quando incluimos dados inconsistentes.
5.
SQL
16
Declaraes de manipulao de dados (DML): usadas para alterarem o contedo dos campos; Declaraes de definio de dados (DDL): usadas para alterarem a definio da estrutura do banco de dados.
SQL
17
ROLLBACK Desfaz todas as atualizaes ocorridas desde o ltimo COMMIT; COMMIT Grava ou efetiva todas a atualizaes ocorridas desde o ltimo COMMIT; Obs.: Se no houve COMMIT, o parametro o momento em que o usurio se conectou ao banco de dados. Uma transao o conjunto de declaraes SQL executadas entre 2 COMMITs. Se uma transao finalizada com um COMMIT diz-se que a transao terminou com sucesso, mas se ela termina com um ROLLBACK considera-se que finalizou sem sucesso.
5.3
ALTER TABLE LISTA_DE_HOSPEDES e os complementos em SQL Base: ADD inclui uma nova coluna MODIFY modifica as caractersticas da coluna (tamanho e null ou not null) DROP elimina uma coluna existente RENAME renomeia uma coluna RENAME TABLE renomeia uma tabela OBS.: SQL Padro s aceita ADD e MODIFY. ALTER TABLE LISTA_DE_HOSPEDES DROP DESCONTO, QUARTO, SAIDA; Obs.: 1. As vises que contiverem colunas eliminadas sero deletadas automaticamente; 2. No possvel eliminar uma coluna que seja ndice a menos que se elimine o ndice antes. ALTER TABLE LISTA_DE_HOSPEDES ADD DESCONTO DECIMAL(2,2) NOT NULL, SAIDA DATE; Obs.: 1. As vises derivadas de tabelas que receberam novas colunas no so afetadas. 2. Pode-se criar uma coluna NOT NULL;
SQL
18
ALTER TABLE LISTA_DE_HOSPEDES MODIFY TECNICO VARCHAR(30) NOT NULL, NOME NULL; Obs.: 1. No possvel reduzir o tamanho ou alterar o tipo 2. Nem mudar uma coluna para NOT NULL quando esta possui campos nulos. ALTER TABLE LISTA_DE_HOSPEDES RENAME GARCOM, SERVENTE; ALTER TABLE LISTA_DE_HOSPEDES RENAME TABLE LISTA; Obs.: 1. Se uma tabela ou coluna for renomeada, as vises que delas se originam desaparecero automaticamente. DROP TABLE QUARTOS; Obs.: 1. Vises, ndices, sinnimos e privilgios da tabela apagada tambm desaparecem DROP VIEW VISAO_PS_MEDIO; Obs.: 1. Vises que se originam da viso eliminada tambm desaparecem Observao geral: Para efetivar a atualizao, utilizar COMMIT;
6.
Otimizador o subsistema do SGBD que seleciona os caminhos de acesso do dado e resolve qual a melhor maneira de atender uma query. Portanto, se houver um ndice este ser utilizado automaticamente sempre que necessrio. Muitos ndices: - podem confundir o otimizador; - ocupam muito espaco em disco; - precisam ser atualizados a cada atualizao da coluna de origem; ndice concatenado ou composto aquele que se refere a mais de uma coluna. Quando h dados duplicados em uma coluna talvez seja preciso usar um ndice desse tipo.
SQL
19
A PESQUISA SELECT A.NOME, TECNICO, ALTURA FROM LISTA_DE_HOSPEDES A, HOSPEDES B WHERE A.NOME = B.NOME pode ser otimizada, com os ndices a seguir: CREATE INDEX NOME_IND ON LISTA_DE_HOSPEDES (NOME); Obs1.: o ndice anterior otimiza a pesquisa num AT em 13% (h 23 linhas na tabela e apenas 2 linhas duplicadas); Obs2.: pode-se colocar ao lado do nome da coluna a expresso DESC ou ASC (que default); CREATE INDEX UNIQUE NOME1_IND ON HOSPEDES (NOME); Obs1.: UNIQUE garante que no exista dados duplicados na(s) coluna(s) que o originaram; Obs2.: o ndice anterior otimiza ainda mais a pesquisa que pula para 20% (h 24 linhas na tabela); CREATE INDEX PESO_IND ON QUADRO_DE_PESOS (ALTURA, SEXO, BIOTIPO); DROP INDEX PESO_IND; Obs.: um ndice eliminado automaticamente quando a tabela de origem deletada; Obs geral.: para se criar um ndice necessrio que o usurio tenha privilgio
7.
SQLTalk
Quando estiver sendo utilizado o SQLTalk possvel executar o comando COLUMN 5 WIDTH 20; para customizar o tamanho da coluna que aparece na tela (aps um Select, por exemplo). Para voltar ao normal digite: COLUMN 5 WIDTH OFF;
SQL
20
8.
SQL
21
RESOURCE - permite criar, deletar e conceder privilgios sobre tabelas e vises; DBA - tem poderes absolutos diferenciando-se do SYSADM quando no pode criar um usurio ou alterar as senhas ou nveis j existentes; Os privilgios so: SELECT, INSERT, DELETE, UPDATE, INDEX, ALTER, ALL (todos os privilgios) GRANT CONNECT TO IDUSUARIO1, IDUSUARIO2 IDENTIFIED BY SENHA1, SENHA2; GRANT DBA TO USUARIO4; Obs.: Ainda necessrio conceder privilgios a estes usurios, caso contrrio obtero a resposta tabela no criada ao executar um select, por exemplo; isto porque o banco de dados procurar a tabela criada pelo usurio que ainda no criou nenhuma nem tem autorizao s tabelas do SYSADM. Obs.: Quando o usurio se conecta ao BD, uma transao aberta no nome do usurio ou ID de autorizao. Obs.: A clusula WITH GRANT OPTION deixa o usurio que recebe o privilgio apto a conceder este privilgio a outros usurios. GRANT UPDATE (NOME, CHEGADA) ON LISTA_DE_HOSPEDES TO USUARIO1, USUARIO2; GRANT ALL ON LISTA_DE_HOSPEDES TO PUBLIC; Obs1.: concede todos os privilgios para todos os usurios; Obs2.: quando se tem privilgio para uma tabela, tambm se tem para suas vises. GRANT (extrado do manual IBM DATABASE 2 Version 2- Reference Summary-Release 2) PARA TABELAS E VIEWS GRANT <privilgio> ON TABLE <nome da tabela ou view name> TO <chave ou PUBLIC ou PUBLIC AT ALL LOCATIONS>
SQL
22
<WITH GRANT OPTION> Os privilgios podem ser: ALL PRIVILEGES DELETE INDEX INSERT SELECT UPDATE UPDATE <nome da coluna1, nome da coluna2, ...> GRANT ALL PRIVILEGES ON TABLE DB2BIC.MUNICIPIO TO ST2406; GRANT UPDATE (COD,NOME_MUN) ON TABLE DB2BIC.MUNICIPIO TO PUBLIC; PARA USO DE PRIVILGIOS GRANT USE OF BUFFERPOOL <bp0,bp1,bp2,bp32k> TO <chave ou PUBLIC > <WITH GRANT OPTION> GRANT USE OF STORGROUP <nome do storage group> TO <chave ou PUBLIC > <WITH GRANT OPTION> GRANT USE OF TABLESPACE <nome do database.-opcional> <nome do tablespace> TO <chave ou PUBLIC > <WITH GRANT OPTION>
8.3 Sinnimos
Toda tabela tem implicitamente no nome um prefixo que o USERID do usurio como por exemplo SYSADM.LISTA_DE_HOSPEDES. Quando acessamos uma tabela o SQL coloca automtica e implicitamente o usurio antes do nome da tabela. Um sinnimo tambm tem esse prefixo e portanto s pode ser usado pelo usurio que o criou com excesso de um sinnimo pblico cujo prefixo SYSADM. Sendo assim, pode-se criar um sinnimo repetido visto que o prefixo faz a diferenciao. CREATE SYNONYM LISTA
SQL
23
FROM SYSADM.LISTA_DE_HOSPEDE; CREATE PUBLIC SYNONYM H_PESO FOR HOSPEDE_PS; Obs.: esta ltima declarao executada por SYSADM. DROP SYNONYM USUARIO1.LISTA;
ON LISTA_DE_HOSPEDES FROM USUARIO1, USUARIO2; REVOKE ALL ON HOSPEDE_PS FROM PUBLIC; REVOKE CONNECT FROM USUARIO1, USUARIO2; Obs.: No possvel revogar a autoridade CONNECT para um usurio que possua tabelas;
9.1 LOAD
Colocam dados externos no BD corrente. Os arquivos de origem podem ser nos formatos SQL, ASCII ou DIF; ou ainda dados de planilhas, outros banco de dados, etc. LOAD SQL STAFF.SQL;
SQL
25
obs1: l o arquivo STAFF.SQL no formato SQL; obs2: arqs. SQL possuem declaraes INSERT, variveis de programas e ainda podem conter CREATE TABLE e CREATE INDEX; LOAD ASCII STAFF.ASC STAFF; obs1: l o arquivo STAFF.ASC e carrega a tabela STAFF; obs2: os dados devem estar separados por vrgula e variveis string envolvidos por aspas ( ); obs3: usado especialmente para copiar dados de um outro BD; LOAD DIF STAFF.DIF STAFF; obs1: DIF (Data Interchange Format); obs2: se o comando indicar o nome da tabela destino, os dados sero carregados nela; seno contiver, dever existir o nome da tabela e opcionalmente dos campos dentro do arquivo DIF para criao automtica da tabela antes da carga; obs3: este arquivo muito usado em planilhas;
9.2 UNLOAD
Finalidade 1: trasferir dados para outros BD; Finalidade 2: backup que tambm podem conter declaraes para criar tabelas, ndices, etc. aconselhvel fazer o backup no formato SQL e quando ningum o estiver acessando o que evita que uma alterao no seja copiada. Alguns SGBD possuem recursos para realizar esta operao sem que todos sejam desconectados. UNLOAD DATA DIF LISTA_DE_HOSPEDES.DIF LISTA_DE_HOSPEDES; Obs1.: o arquivo no formato DIF LISTA_DE_HOSPEDES.DIF criado com dados da tabela LISTA_DE_HOSPEDES; Obs2.: a palavra-chave DATA faz com sejam excludos do arquivo destino os nomes da tabela e das colunas mantendo assim apenas os dados; UNLOAD SQL SPA.SQL ALL; Obs1.: faz um backup de todas (ALL) as tabelas do BD corrente; Obs2.: somente o SYSADM pode usar a palavra ALL para evitar que usurios vejam tabelas que no possam acessar; UNLOAD ALL MINHAS_TABELAS.SQL;
SQL
26
Obs.: serve para descarregar todas as tabelas e ndices do usurio em um arquivo de formato SQL e pode ser usado por qualquer usurio; UNLOAD DATABASE SPA.SQL; Obs.: s pode ser usado pelo SYSADM e descarrega todo o DB, inclusive vises e sinnimos;
9.3 REORGANIZE
REORGANIZE SPA; Obs.: desfragmenta o BD SPA. O comando age como se estivesse descarregando e em seguida recarregando o banco de dados;
SQL
27
executamos um ROLLBACK chamamos a restaurao de retorno explcito e quando o sistema executa automaticamente denominamos retorno implcito. Existem 2 tipos de paradas: A primeira no afeta o sistema. Um exemplo quando o terminal perde a fora, ento todas as alteraes da transao corrente do usurio so canceladas. A segunda quando o sistema pra. Nesse caso todas as transaes de todos os usurios so canceladas e perde-se todas as atualizaes desde o ltimo COMMIT.
SQL
28
10.4.1
COMPILAO em 4 passos:
RECONHECIMENTO: verifica a validade de uma declarao SQL, se as tabelas, usurios, etc, existem. Se houver erro, o processamento pra com uma mensagem de erro. Com relao as declaraes com substituio de variveis, as variveis servem apenas para marcar o lugar dos dados e a substituio s ocorre na EXECUO; VERIFICAO DE SEGURANA: certifica-se de que o usurio tem autoridade para as declaraes SQL; CAMINHO DE ACESSO: determina o melhor caminho para o dado e os ndices a utilizar caso existam; MDULOS EXECUTVEIS: a declarao convertida em uma srie de procedimentos, pequenos pseudo-programas ou modulos executveis. O sistema os armazena na memria at a fase de execuo;
SQL
29
Importante: Em algumas implementaes, como o SQLBase, podemos armazenar a verso compilada da declarao no banco de dados e execut-la quando acharmos adequado. Compilando antecipadamente (pr-compilao), principalmente as mais complexas, reduzimos o tempo de compilao e o de execuo.
10.4.2
EXECUO
Definio dos buffers: Buffers de entrada so reas da memria reservadas para armazenar dados para a substituio de variveis. Buffers de sada ou buffers select so usados para guardar resultados de queries. Ambos devem associar o nome da varivel ao dado que est no buffer para que seja possvel acess-los. Depois disso as variveis so substituidas pelos dados e a declarao EXECUTADA. A tarefa se repete para a mesma declarao at que todos os dados sejam processados. No caso das queries o processo o mesmo mas tambm se estende fase de carga.
SQL
30
A fase da execucao
NAO
NAO
NAO
Carga de dados
Exixtem mais dados p/ substituir?
NAO
FIM
10.4.3
resultado.
CARGA
preciso efetuar a carga de cada linha que se deseja ter no conjunto A finalidade da carga transferir linha a linha o resultado de uma querie
SQL
31
para reas de trabalho, ou buffers, onde voc pode manipular as linhas de uma forma que no poderia em SQL. A fase de carga
NAO
NAO
FIM Voltar a execucao, associar novas variaveis, reiniciar a carga CURSORES: so ponteiros que servem para indicar ao sistema a posio dentro de um conjunto resultado. As 4 declaraes FETCH so: DECLARE: associa um cursor a uma querie; OPEN: inicializa o cursor e o posiciona na primeira linha; FETCH: o cursor avana uma linha at chegar ao fim do conjunto; CLOSE: desativa o cursor.
10.4.4
Conectando e desconectando
SQL
32
Antes de um programa submeter uma declarao SQL preciso conectar-se ao banco de dados. Para isso necessrio ter uma ID de conexo chamada de handle (aquele que executa). Em algumas implementaes damos o nome ao handle, em outras o sistema que o atribui. Alm disso o usurio precisa fornecer seu nome de usurio e senha e identificar o banco de dados quando se conecta a mais de um banco de dados simultaneamente. Importante: um handle s criado caso a implementao permita conexo a mais de um banco de dados. Quando uma declarao SQL submetida o sistema associa o handle a ela e ento pode devolver o resultado. Desconectar-se do sistema consiste em desconectar todos os handles ou desativar todos os cursores.
SQL
33
NAO
Associacao do dados
NAO
NAO
SQL
34
OBSERVAO: Os prximos tpicos apresentam comandos de baixo nvel para programao em SQL e no precisam ser programados, para isto existe um prcompilador que converte comandos SQL alto nvel para baixo nvel (veja tpico Utilizando uma interface de pr-compilador
10.5.1
CONEXO
/* contem definies de tipos de dados, comandos sql e defaults do sistema */
# include <sql.h>
static char critem[] = CREATE TABLE ITEM (NUM_ITEM NUMBER NOT NULL, DESCRICAO\ CHAR (25), PRECO DECIMAL (5,2), OBS LONG VARCHAR); static char selitem[] = SELECT * FROM ITEM WHERE PRECO > :preco; ....etc. /* define declaraes SQL utilizadas no codigo como variveis staticas */ SQLTCUR cur; char errmsg[80]; short ret; /* handle que fica na varivel cur */ /* buffer para mensagem de erro */
if (ret = sqlcnc (&cur, estoque/st2406/senha,0)) { sqlerr(ret, errmsg); printf (Falha no CONNECT: %s\n, errmsg); } /* sqlcnc estabelece a conexo e um handle */ /* &cur e o ponteiro da varivel que conter o handle */ /* estoque/st2406/senha - nome do BD, usurio e senha */ /* 0 - tamanho dos dados do 2.o argumento, significa uma sequencia de caracteres terminada em nulo - obs.: o tamanho e definido automaticamente*/
10.5.2
COMPILAO
Uma declarao SQL deve ser compilada antes de ser executada. short errpos; if (ret = sqlcom (cur, critem, 0))
SQL 35
{ sqlerr (ret, errmsg); sqlepo (cur, &errmsg); printf (Erro no COMPILE: %s na %d \n, errmsg, errpos); } /* sqlcom compila a declarao sql do create */ if (ret = sqlcex (cur, critem, 0)) { sqlerr (ret, errmsg); printf (Erro CEX: %s\n, errmsg); } /* sqlcex compila e executa e se no houver mais acessos o commit ocorre automaticamente (sqlcmt) */ Obs.: declaraes de definio e controle e queries que no tenham variveis de programa podem ser compiladas e executadas em um unico passo.
10.5.3
As declaraes INSERT e SELECT contem variveis de programa que substituiro (ou se associaro a) os dados do programa a cada execuo. SELECT MAX (NUM_ITEM) FROM ITEM int item; int maxitem; int len; int cols; char dadositem [2] [26]; /* nmero do item */ /* maior nmero de item */ /* tamanho dos dados associados */ /* nmero da varivel de programa */ /* vetor de ponteiro dos dados */
/* Associar item */ if (ret = sqlbnn (cur, 1, &maxitem, sizeof (int), o, SQLPUIN) { /* processa erro */ } sqlbnn - associa dados do programa que no so do tipo LONG VARCHAR; SQLPUIN - program unsigned integer number - tipo de dado da varivel de programa; unsigned char nbv; sqlnbv (cur, &nbv); /* nmero de variveis de programa */
SQL
36
for (I = 0, cols = 2; cols < nbv; I++, cols++) { len = strlen (dadositem [I]; if (ret = sqlbnn (cur, cols, dadositem [I], len, 0, SQLSTR)) { /* processa erro */ } sqlnbv - retorna nmero de variveis que tem o programa; sqlbnn - associa variveis 2 e 3 if (ret = sqlbln (cur, 4)) { /* processa erro */ } sqlbln - associa 4.a varivel que LONG VARCHAR char precobuf [25]; if (ret = sqlbnd (cur, preco, 0, precobuf, 0, 0, SQLTSTR)) { /* processa erro */ } Obs.: este um bind que trabalha com nome ao inves de nmero para se referir a varivel);
10.5.4
Cada item resultado de uma querie necessita de um buffer. char selbuf [2] [26]; int col, I; unsigned char nsi; /* buffers para dados obtidos */ /* nmero de itens selecionados */
/* Obter o nmero de itens selecionados */ sqlnsi (cur, &nsi); /* Estabelecer buffers para as colunas de caracteres, ignorar a ltima coluna que do tipo LONG */ for (col = 1, I = 0; col < nsi; I++, col++) {
SQL
37
if (ret = sqlssb (cur, col, SQLPSTR, selbuf[i], 0, 0, SQLNPTR, SQLNPTR)) { sqlerr (ret, errmsg); sqlepo (cur, &errpos); printf (Erro SSB: %s na %d col %d\n, errmsg, errpos, col); } } Obs.: A funo sqldes (describe) fornece as seguintes caracteristicas de uma coluna: tipo, tamanho, nome, preciso e escala
10.5.5
EXECUO
10.5.6
CARGA
Quando uma querie executada, seu resultado deve ser movido (carregado) linha a linha para o buffer de sada. Valor de retorno: 0-a linha foi lida com sucesso, 1-fim das linhas, outros valores-codigo de erro. char line [80]; short ret; /* Codigo de retorno */ for (; ;) { if (ret = sqlfet(cur)) break; sprintf (line, %s %s %s\n, selbuf[0]. se;bif[1], selbuf[2]; } if (ret != 1) { sqlerr (ret, errmsg); printf (Erro FETCH: %s\n, errmsg); }
10.5.7
COMMIT
Pode-se efetuar o commit atraves do comando sqlcmt ou executando e compilando o comando SQL COMMIT.
SQL
38
if (ret = sqlcmt(cur)) { /* Codigo para processar erros */ } OU if (ret = sqlcex(cur, COMMIT)) { /* Codigo para processar erros */ } E para ignorar atualizaes ocorridas: if (ret = sqlrbk(cur)) { /* Codigo para processar erros */ }
10.5.8
DESCONEXO
Antes de sair do programa devemos desconectar todos os handles ativos. Ao desconectarmos do ltimo handle de uma transao o COMMIT executado automaticamente pelo sistema caso isto no tenha sido feito. if (ret = sqldis(cur)) { /* Codigo para processar erros */ }
<No foi incluido o capitulo 15: Programao avanada com uma interface de chamadas de funo: long var char, bloqueio, varios handles >
SQL
39
Neste caso, o pr-compilador substitui declaraes SQL pelas funes dos tpicos anteriores (que criam buffers, carregam linha a linha, etc). Todas as implementaes SQL possuem pr-compiladores para as linguagens mais usadas como COBOL e C. O uso de um pr-compilador simplifica e reduz o tamanho do programa tornandoo mais facil de entender, mais rapido de se escrever e menos passvel de erros. Praticamente todos os pr-compiladores reconhecem a sintaxe dos prcompiladores SQL DB2 da IBM. Ento, sendo a sintaxe padro, possvel utilizar o codigo fonte em variado nmero de maquinas e sistemas (no em todos) bastando utilizar o pr-compilador adequado. Exemplo em COBOL: EXEC-SQL SELECT COUNT(*) INTO :CONTA-FUNC WHERE DEPT=1 END-SQL DISPLAY FUNCIONARIOS DEPT1: , CONTA-FUNC. Mas o pr-compilador no perfeito e pode, por exemplo, usar convenes de nomenclaturas desconhecidas. Uma outra limitao mais significativa o fato de que ele compila 1 declarao para cada linha de dado sem fazer uso de um loop. Pode-se contornar esta situao de 2 maneiras: 1 - adicionando-se um recurso avanado chamado SQL Dinamico e que tem os comandos PREPARE (que compila o comando) e o PERFORM (que declarado dentro de um loop); 2 - escrever manualmente (sem uso do pr-compilador) a compilao do comando que serah utilizado em loop; Obs.: pode-se misturar chamadas de funo com comandos do pr-compilador num mesmo programa.
10.6.1
Variveis principais so variveis de programa que aparecem dentro de uma declarao SQL e so precedidas do sinal : (dois pontos); EXEC SQL UPDATE FUNC SET SAL_FUNC = SAL_FUNC * (1 + :aumento) WHERE NUM_FUNC = :funcionrio END-EXEC.
SQL
40
As palavras EXEC SQL e END-SQL dizem ao pr-compilador que as declaraes que estas delimitam devem ser convertidas em chamadas de funo. Observao: Evitar o uso de SELECT *, pois
a) ao incluir colunas nas tabelas precisamos alterar os programas para que estes possam utilizar as novas colunas; b) especificando cada coluna, o programa fica mais fcil de entender; c) diminui a performance uma vez que o pr-compilador converte o asterisco em nomes de colunas.
CONEXO: depende de cada pr-compilador. Obs.: o DB2 permite apenas uma conexo e s h um banco de dados, portanto no h handles.
10.6.2
Para gerar um conjunto resultado em um programa preciso declarar um cursor e depois efetuar uma carga. O sistema de banco de dados posiciona o cursor na primeira linha ou linha corrente e espera uma instruo de carga. EXEC SQL DECLARE FETCUR CURSOR FOR SELECT NUMFUNC PRENOME, INICIAL,SOBRENOME, ADMISSAO, PAGTO_HORA FROM FUNC WHERE DEPT = 2 FOR UPDATE OF PAGTO_HORA END-EXEC. Obs1.: esta sequencia apenas define o cursor, sua execuo acontece com o comando OPEN; Obs2.: declara um cursor FETCUR para atualizar a coluna PAGTO_HORA; se PAGTO_HORA no for declarada ocorrera o erro quando da atualizao; PAGTO_HORA no precisa fazer parte da declarao SELECT. Obs3.: sero cosideradas apenas para leitura declaraes com as palavras DISTINCT, UNION, HAVING, GROUP BY, ORDER BY; funo agregada, duas tabelas ou viso que no pode ser atualizada.
SQL
41
EXEC SQL OPEN FETCUR END-EXEC. Obs.: o programa solicita a SQL que execute o SELECT da definio do cursor. Ao final do processamento, o cursor posicionado na primeira linha do conjunto resultado. EXEC SQL WHENEVER NOT FOUND GO TO 800-FECHA-CURSOR END-EXEC. Obs1: as condies podem ser NOT FOUND, SQLERROR ou SQLWARNING. Obs2.: CONTINUE pode ser usado no lugar do GO TO; Estas condies e outros return codes so obtidos de uma rea informativa chamada SQLCA. 01 SQLCA. 05 SQLCAID PIC X(8) VALUE SQLCA. 05 SQLCABC PIC S9(9) COMP VALUE 136. 05 SQLCODE PIC S9(9) COMP. 05 SQLERRM. 49 SQLERRML PIC S9(4) COMP. 49 SQLERRMC PIC X(70). 05 SQLERRP PIC X(8). 05 SQLERRD OCCURS 6 TIMES PIC S9(9) COMP. 05 SQLWARN. 10 SQLWARN0 PIC X(1). 10 SQLWARN1 PIC X(1). 10 SQLWARN2 PIC X(1). 10 SQLWARN3 PIC X(1). 10 SQLWARN4 PIC X(1). 10 SQLWARN5 PIC X(1). 10 SQLWARN6 PIC X(1). 10 SQLWARN7 PIC X(1). 05 SQLEXT PIC X(8). Obs.: Alguns pr-compiladores exigem a definio destes campos, outros incluem automaticamente. SQLCAID: cabecalho de identificao (constante); SQLCABC: tamanho da area informativa (constante);
SQL 42
SQLCODE: codigo de retorno da ltima declarao SQL; 0 (zero) indica sucesso, nmero negativo que houve erro e positivo que houve uma exceo; o nmero 100 um caso especial e significa que uma operao de carga no encontrou a primeira ou proxima linha ou ainda que uma instruo de INSERT, DELETE ou UPDATE no foi efetuada porque nenhuma linha atendia aos criterios de pesquisa; SQLERRM: descrio do erro: SQLERRML: tamanho da sequencia SQLERRMC: sequencia ou descrio SQLERRP: sequencia de caracteres no utilizados; SQLERRD: vetor de campos sendo o que interessa (ocorrencia 3) guarda o nmero de linhas incluidas, alteradas ou excluidas; 05 SQLWARN: warning SQLWARN0: se tiver um W h valores em um dos outros warnings; SQLWARN1: se W, o dado movido para uma varivel foi truncado, geralmente porque seu tamanho no comporta o dado; SQLWARN2: se W, ento um ou mais valores NULLs foram desconsiderados em funes como AVG, SUM, MIN ou MAX; SQLWARN3: se W, ento o nmero de variveis principais diferente do nmero de colunas em uma mesma instruo SQL; SQLWARN4: se W, o programa tentou executar um DELETE ou UPDATE sem WHERE, e se ela tiver sido compilada com a declarao PREPARE da SQL dinamica; SQLWARN5: se W, o programa tentou executar uma declarao vlida apenas no ambiente SQL/DS; SQLWARN6: se W, a SQL ajustou uma data derivada de um TIMESTAMP para indicar o ltimo dia do mes; SQLWARN7: reservada; SQLEXT: sequencia de caracteres no utilizada.
10.6.3
CARGA
EXEC SQL FETCH FETCUR INTO :NUMFUNC, :PRENOME, :INICIAL-MEIO, :SOBRENOME, :ADMISSAO, :PAGTO-HORA END SQL. Obs.: move o cursor para a proxima linha, carrega e na sequencia possvel submeter um DELETE ou UPDATE:
SQL
43
EXEC SQL DELETE FROM FUNC WHERE CURRENT OF FETCUR END-EXEC. Obs.: apos uma deleo ou atualizao a linha deixa de ser corrente. EXEC SQL CLOSE FETCUR END-SQL. IMPORTANTE: A linha marcada pelo cursor perdida quando ocorre um COMMIT OU ROLLBACK. SELECT INTO EXEC SQL SELECT NOME_FUNC INTO : FUNCIONARIO FROM FUNC WHERE NUM_FUNC = :num-func END-SQL. A clausula INTO serve para recuperar apenas uma linha de resultado e evita o processo de carga. Obs.: permitido omitir os : (dois pontos) da varivel principal que vem na clausula INTO. Existem outros casos em que a omisso aceita, dependendo do contexto.
10.6.4
Variveis principais
So usadas de 3 maneiras: para carregar dados (como destino), inserir dados (como origem) e para pesquisa (numa clausula WHERE). No possvel us-las como nome de tabelas, vises e outros. Uma varivel principal deve ser compatvel quanto ao tipo e tamanho com a coluna do banco. Alguns bancos de dados convertem automaticamente quando possvel. No o caso do DB2. Estruturas principais
SQL
44
01 DADOS-FUNCIONARIO. 02 PRENOME-FUNCIONARIO PIC X(20). 02 INICIAL-FUNCIONARIO PIC X(01). 02 SOBRENOME-FUNCIONARIO PIC X(20). ... EXEC SQL SELECT PRENOME, INICIAL, SOBRENOME INTO :DADOS-FUNCIONARIO FROM FUNC WHERE NUMFUNC= :funcionario END-SQL. Declarando as definies de vises e tabelas No preciso definir tabelas e vises nos programas COBOL porm esta prtica pode trazer os beneficios: h maior documentao dentro do programa e o compilador verifica com base na definio se a codificao est correta quanto aos nomes das colunas e se os tipos de dados das declaraes SQL esto corretos. Muitos pr-compiladores fornecem uma ferramenta chamada declaration generator que gera a declarao DECLARE automaticamente a partir das tabelas e vises. O pr-compilador DB2 possui o DCLGEN e tambem cria uma estrutura na Data Division. EXEC SQL DECLARE FUNC TABLE (PRENOME INICIAL SOBRENOME NUMFUNC END-SQL.
Obs.: a palavra TABLE obrigatria mesmo que se trate de uma viso, pois s assim que o pr-compilador reconhece.
SQL
45
11.
ANE X O
SQL
46
11.2 OPERADORES RELACIONAIS = != <> > !> < !< >= <= 11.3 PERFORMANCE (em DB2)
- Colocar as colunas mais acessadas a esquerda, pois esta prtica melhora a performance. diferente diferente
no maior que
no menor que
SQL
47
BIBLIOGRAFIA: Guia de Programao SQL Umang GUPTA, William Gietz Editora Campus Manual de DB2 - Mainframe
SQL
48