Вы находитесь на странице: 1из 48

S Q L - Structured Query Language

Por Rogerio Primon

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.

1.1 Tipos de declarao


Definico de dados ou DDL (Data Definition Language): definem a estrutura do banco de dados. Ex.: CREATE TABLE, CREATE VIEW, CREATE INDEX, ALTER TABLE, DROP.., ETC. Manipulao de dados ou DML (Data Manipulation Language): alteram o contedo do banco de dados. Ex.: INSERT, UPDATE e DELETE. Controle de dados: cadastram outros usurios ou determinam nveis de autoridade. Ex.: GRANT (para o banco de dados e para tabelas).

1.2 Outros objetos de banco de dados


ndices. Vises: so criadas a partir de tabelas e gravadas com o comando CREATE VIEW. Aps criada pode receber o mesmo tratamento de uma tabela, inclusive alterada e cujas atualizaes refletiro na tabela base. Catlogo do sistema: um grupo de tabelas que guardam informaes sobre o banco. Para listar tabelas ou consultar acesso de usurios necessrio acess-lo. Sinnimo: um nome que o usurio atribui a uma tabela criada por outro usurio.

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

3.1.1 Outros predicados relacionais


SELECT NOME, DESCONTO FROM LISTA_DE_HOSPEDE WHERE DESCONTO BETWEEN .10 AND .20; OBS.: serve para nmeros e datas e considera inclusive os limites da faixa (no caso o 10 e o 20). SELECT NOME, SAIDA FROM LISTA_DE_HOSPEDE WHERE SAIDA IS NULL; SELECT NOME FROM LISTA_DE_HOSPEDES LIKE JOAN%; OBS.: % vale por qualquer sequncia de caracteres; _ vale por um qualquer caracter nico; Para utilizar ambos com seus valores reais, basta colocar uma / antes. Exemplo: LIKE 50/%. SELECT NOME, TECNICO, QUARTO FROM LISTA_DE_HOSPEDE WHERE TECNICO IN (MICHAEL, TODD); OBS.: Exibe linhas onde TECNICO=MICHAEL ou TECNICO=TODD SELECT NOME, TECNICO, QUARTO FROM LISTA_DE_HOSPEDE WHERE TECNICO NOT IN (MICHAEL, TODD); EXEMPLO AND, OR SELECT NOME, TECNICO, CHEGADA FROM LISTA_DE_HOSPEDE WHERE SAIDA IS NULL AND (TECNICO=SERENA OR CHEGADA < 21-JUN-1988);

SQL

3.2 Utilizando QUERIES para manipular dados


3 elementos viabilizam estas operaes: Operadores Aritmticos: Funes Agregadas Funes No Agregadas EXEMPLOS de:

+, -, *, /

3.2.1 Operadores Aritmticos


SELECT NOME, (DESCONTO + .05) / 2 FROM LISTA_DE_HOSPEDE WHERE NOME LIKE MARC%; SELECT QUARTO + 5 FROM LISTA_DE_HOSPEDE; OBS.: apesar de QUARTO ser do tipo VARCHAR seu conteudo numrico. SELECT NOME, SAIDA - CHEGADA FROM LISTA_DE_HOSPEDE; OBS.: SAIDA e CHEGADA so datas e o resultado dado em nmero de dias Algumas palavras chaves: SELECT NOME, SYSDATE + 7 FROM LISTA_DE_HOSPEDE SELECT NOME, SYSDATE - CHEGADA FROM LISTA_DE_HOSPEDE WHERE SAIDA IS NULL; OBS.: SYSDATE representa a data atual. SELECT NOME, SAIDA, SAIDA + 3 MONTHS FROM LISTA_DE_HOSPEDES; SELECT NOME, CHEGADA - 36 HOURS FROM LISTA_DE_HOSPEDES WHERE CHEGADA - 36 HOURS !< 14-MAI-96;
SQL 6

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

3.2.2 Funes Agregadas


Retornam apenas um valor. AVG(argumento) MAX(argumento) MIN(argumento) SUM(argumento) COUNT(argumento) Retorna a mdia dos valores do argumento Retorna o maior valor do argumento Retorna o menor valor do argumento Retorna o somatrio dos valores do argumento Retorna o nmero de linhas do argumento

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;

3.2.3 Funes No Agregadas


Retornam um valor para cada linha e podem ser declaradas tanto na clusula SELECT quanto na WHERE. SELECT NOME, @LENGTH(NOME) FROM LISTA_DE_HOSPEDE; Retorna o tamanho da string NOME. SELECT NOME, @PROPER(@LEFT(NOME,5) FROM LISTA_DE_HOSPEDE; @LEFT: Retorna os 5 primeiros caracteres da string NOME; @PROPER: Retorna a string com a primeria letra maiscula e as demais minsculas; SELECT MIN(@VALUE(QUARTO)), MAX(@VALUE(QUARTO)) FROM LISTA_DE_HOSPEDE; Retorna o valor numrico que a string representa. Na declarao, se no houvesse a funo @VALUE, seria mostrado o min e o max considerando a string e cujo resultado seria diferente, pois seria considerado o primeiro caracter sem considerar os outros a direita. SELECT NOME || ainda no saiu do sp FROM LISTA_DE_HOSPEDE WHERE SAIDA IS NOT NULL;

|| ou duas barras concatena uma string a outra.


SELECT NOME, CHEGADA, @DAY(CHEGADA) FROM LISTA_DE_HOSPEDE; Retorna o dia da data CHEGADA. SELECT NOME, @WEEKDAY(CHEGADA + 4) FROM LISTA_DE_HOSPEDE; Retorna um valor de 0 a 6 sendo que o 0 representa o dia da semana sbado SELECT NOME, @WEEKBEG(CHEGADA) FROM LISTA_DE_HOSPEDE; Retorna a data de inicio da semana que possui a data CHEGADA;

SQL

@MONTHBEG() Idem para ms; @QUARTERBEG() Idem para trimestre; @YEARBEG() Idem para ano;

3.3 Selecionando CONSTANTES


SELECT 2+2 FROM LISTA_DE_HOSPEDE; Mostra o resultado tantas vezes quantas forem as linhas selecionadas. SELECT NOME, @WEEKDAY(20-MAI-1996) FROM LISTA_DE_HOSPEDE; SELECT Sr(a) || NOME FROM LISTA_DE_HOSPEDES;

3.4 ORGANIZANDO o resultado


SELECT TECNICO, NOME FROM LISTA_DE_HOSPEDE GROUP BY TECNICO, NOME; Agrupa todas as linhas que contenham o mesmo TECNICO e dentro deste as linhas que contenham o mesmo nome. SELECT TECNICO, SAIDA - CHEGADA FROM LISTA_DE_HOSPEDE GROUP BY 1, 2; O 2 indica a posio da expresso no comando SELECT a ser agrupada uma vez que esta no um nome de coluna. OBS.: O Resultado no apresenta linhas repetidas.

3.5 EXCLUINDO linhas da consulta


SELECT TECNICO, COUNT(NOME) FROM LISTA_DE_HOSPEDE GROUP BY TECNICO HAVING COUNT(NOME) < 3; Obs1: Exclui TCNICOs que aparecem menos de 3 vezes;

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.6 CLASSIFICANDO o resultado


SELECT DISTINCT NOME FROM LISTA_DE_HOSPEDE ORDER BY NOME DESC; SELECT DISTINCT NOME FROM LISTA_DE_HOSPEDE ORDER BY NOME DESC; Obs.: DESC significa em ordem decrescente. O default a ordem crescente e no precisa ser declarada. SELECT TECNICO, SAIDA FROM LISTA_DE_HOSPEDE ORDER BY TECNICO, SAIDA; SELECT SAIDA - CHEGADA, TECNICO FROM LISTA_DE_HOSPEDE ORDER BY 1, 2; SELECT DISTINCT NOME FROM LISTA_DE_HOSPEDE ORDER BY NOME DESC;

3.7 J O I N S (JUNES) - Consultas com mais de uma tabela

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;

3.7.2 Consulta externa

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.

3.7.4 Outros tipos de juno


SELECT A.NOME, B.PESO, C.PS_MIN, C.PS_MAX FROM HOSPEDES A, HOSPEDE_PS B, QUADRO_DE_PESOS C WHERE NOME = B.NOME AND A.SEXO = B.SEXO AND A.BIOTIPO = C.BIOTIPO AND A.ALTURA = C.ALTURA AND B.PESO BETWEEN PS_MIN AND PS_MAX; SELECT A.NOME, MAX(B.PESO - C.PS_MAX) FROM HOSPEDES A, HOSPEDE_PS B, QUADRO_DE_PESOS C WHERE NOME = B.HOSPEDE AND A.SEXO = C.SEXO AND A.BIOTIPO = C.BIOTIPO AND A.ALTURA = C.ALTURA AND A.SEXO = F AND PESO > PS_MAX GROUP BY NOME;

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

OBS.: A clausula EXISTS retorna um valor falso ou verdadeiro.

3.8.1 Aninhamento de Queries compostas


Denominao para um conjunto de subqueries na mesma querie. As subqueries podem estar no mesmo nvel - por exemplo, vinculadas por um AND - ou embutidas umas nas outras. SELECT NOME, DESCONTO, TECNICO FROM LISTA_DE_HOSPEDES WHERE DESCONTO = (SELECT DESCONTO FROM LISTA_DE_HOSPEDES WHERE NOME = JOANNI) AND TECNICO != (SELECT TECNICO FROM LISTA_DE_HOSPEDES WHERE NOME = JOANNI); SELECT NOME, TECNICO FROM LISTA_DE_HOSPEDES WHERE NOME IN (SELECT NOME FROM HOSPEDES WHERE SEXO = M AND BIOTIPO = M AND ALTURA IN (SELECT ALTURA FROM QUADRO_DE_PESOS WHERE SEXO = M AND BIOTIPO = M AND PS_MAX BETWEEN 66 AND 77.5);

3.8.2 Subqueries CORRELATAS


quando a subquerie INterna necessita ser executada para cada linha da subquerie EXterna. Essa necessidade determinada pelo argumento de pesquisa. SELECT NOME, TECNICO, SAIDA-CHEGADA FROM LISTA_DE_HOSPEDES A WHERE SAIDA-CHEGADA > (SELECT AVG(SAIDA-CHEGADA) FROM LISTA_DE_HOSPEDES
SQL 14

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.

3.9 Utilizando queries para incluir dados


INSERT INTO HOSPEDES_MULHERES SELECT NOME, BIOTIPO, ALTURA FROM HOSPEDES WHERE SEXO=F Condies para incluso: o nmero de colunas das tabelas origem e destino devem ser iguais e o tipo dos campos devem ser compativeis.

4.

Tabelas Virtuais: VISES

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.

Alterando Tabelas, Vises e Dados

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.

5.1 Atualizando dados


UPDATE LISTA_DE_HOSPEDES SET NOME = VIRGINIA WHERE NOME=MARCIA UPDATE LISTA_DE_HOSPEDES SET QUARTO = 11, DESCONTO = DESCONTO + .02 WHERE NOME = VIRGINIA AND CHEGADA = 14-JUN-1996; UPDATE LISTA_DE_HOSPEDES SET DESCONTO = DESCONTO +.05 WHERE NOME IN (SELECT NOME FROM HOSPEDES WHERE SEXO = F) Observaes: 1. Se no houver a clusula WHERE, a atualizao ocorrer em todas as linhas da tabela; 2. No possvel alterar mais de uma tabela na mesma declarao UPDATE; 3. No possvel alterar uma coluna derivada de uma funo ou expresso aritmtica; 4. No possvel usar funes agregadas para indicar o novo valor; 5. Atualizaes nos dados das vises refletem na tabela original para INSERT, UPDATE e DELETE;

5.2 Apagando dados


DELETE FROM LISTA_DE_HOSPEDES WHERE SAIDA IS NOT NULL; DELETE FROM HOSPEDES_PREFERENCIAIS; Obs.: deleta todas as linhas da tabela. 5.3 - Gravando e desfazendo alteraes

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

Declaraes de definio de dados

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.

Utilizando ndices para melhorar a performance

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.

O Catlogo do sistema e o Compartilhamento de um BD

8.1 Tabelas do catlogo


Todas as informaes a respeito do banco de dados so mantidas em tabelas permanentes denominadas tabelas do sistema, catlogo do sistema ou dicionrio de dados. As mesmas podem ser acessadas a qualquer hora como qualquer outra tabela. Sua quantidade pode variar de acordo com a implementao. No caso do SQLBase existem as 10 tabelas a seguir: SYSTABLES Todas as tabelas e vises do banco de dados CREATOR pode ser SYSADM, este o cdigo de autorizao do administrador do banco de dados e dono de todas as tabelas do sistema; Linhas com CREATOR=SYSSQL so vises (TIPO=V) de tabelas do sistema criadas por razes tcnicas para adequar o SQLBase ao DB2. COMMENT ON TABLE HOSPEDES_HOMENS IS Tabela temporria Obs.: o comando acima inclui a string na coluna REMARKS SYSCOLUMNS SYSVIEWS SYSINDEXES SYSKEYS SYSCOMMANDS SYSSYNONYMS SYSUSERAUTH SYSTABAUTH SYSCOLAUTH Todas as colunas do banco de dados Todas as vises A coluna TEXT contm o Select que criou a View Todos os ndices Todas as colunas de um ndice Todas as declaraes pr-compiladas Todos os sinnimos de qualquer tabela ou viso Nveis de autoridade e senhas de todos os usurios Privilgios de todos os usurios a nvel de tabela Privilgios de atualizao de colunas de todos os usurios

8.2 Nveis de autoridade e privilgios


Os nveis de autoridade so: CONNECT - permite que o usurio se conecte ao banco e faa uso dele sem criar tabelas ou vises; todos os usurios necessitam deste nvel mesmo que tenham outro;

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;

8.4 Permitindo o acesso ao catlogo do sistema


As tabelas do sistema pertencem ao usurio SYSADM que pode executar apenas: SELECT linhas de uma tabela do sistema CREATE uma view a partir de uma tabela do sistema CREATE um sinnimo para uma tabela do sistema CREATE um index em uma das colunas de uma tabela do sistema (ALTER TABLE) ADD colunas definidas pelo usurio em uma tabela do sistema (ALTER TABLE) DROP colunas definidas pelo usurio UPDATE as colunas definidas pelo usurio de uma tabela do sistema IMPORTANTE: NO PERMITIDO executar um INSERT ou DELETE nem mesmo pelo SYSADM. O SQLBase concede automaticamente privilgio SELECT a todos os usurios, porm o SYSADM pode restringir o acesso e criar vises para que os outros usurios possam acessar apenas informaes referentes a suas tabelas. Isso possvel atravs da declarao: CREATE VIEW MINHASTABELAS AS SELECT * FROM SYSTABLES WHERE CREATOR = USER; Obs. 1: Quando um usurio executar um SELECT nesta view obter apenas linhas referentes as suas tabelas; Obs. 2: A clusula USER pode ser usada tambm junto ao SELECT;

8.5 Revogando autoridade e privilgios


preciso ter autoridade nvel RESOURCE para conceder e revogar; Um usurio DBA pode revogar privilgios que concedeu e que outro usurio RESOURCE concedeu, porm no pode trocar os nveis de autoridade. O usurio SYSADM pode revogar quaisquer privilgios ou nveis de autoridade; REVOKE UPDATE, SELECT, INSERT, DELETE
SQL 24

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;

8.6 Alterando senhas


O SYSADM pode trocar a senha de qualquer usurio (inclusive a sua) a partir de uma nova declarao GRANT: GRANT CONNECT TO USUARIO1 IDENTIFIED BY SEGREDO; Um usurio pode trocar sua prpria senha: ALTER PASSWORD SYSADM TO TIGRE;

9. UTILITRIOS E RECUPERAO DO BANCO DE DADOS


Estes recursos so implementaes SQL Talk e no fazem parte da SQL Padro.

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;

9.4 Journaling (acompanhamento)


SET JOURNAL ON; ou SET JOURNAL nome_arquivo; Obs1: o comando habilita o registro de todas as operaes com o BD assim que estas sejam efetivadas com COMMIT; Obs2: o ideal que o comando seja executado aps a execuo do backup e esteja em outro disco; APPLY JOURNAL SPA.JOR; Obs1.: para recuperar dados carrega o backup e posteriormente atualiza o BD com o comando acima que efetiva operaes registradas no arquivo SPA.JOR; SET JOURNAL OFF; Obs1.: desativa o journaling; OBSERVAES: Estes procedimentos servem para recuperar dados perdidos por problemas de armazenamento. Para quedas de fora o SGBD recupera automaticamente. Quando um comando de atualizao executado, ento criado uma registro da imagem anterior ou uma cpia do dado anterior. Quando ocorre um COMMIT este registro da imagem anterior apagado e quando ocorre um ROLLBACK a imagem anterior restaurada. Este arquivo mantido pelo sistema e cada transao granha um ID de transao que indica em que transao os dados foram alterados. Quando

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.

10. CONCEITOS DE PROGRAMAO EM SQL 10.1 Processamento linha a linha


Podemos dizer que a linguagem C orientada a procedimentos e para selecionar dados teramos que abrir a tabela, ler uma linha de cada vez e usar o IF-THEN para aceit-la ou exclu-la do processamento. J a linguagem SQL orientada a conjuntos quando seleciona todas as linhas que atendem aos critrios da declarao. Portanto no possvel, por exemplo, aceitar apenas as 5 primeiras linhas e ignorar as restantes ou ainda formatar, manipular, exibir o dado de maneira diferente da original. Para isso necessrio a utilizao de uma linguagem comum juntamente com SQL embutida. A operao que retira uma linha de cada vez do resultado de uma query denominada carga (FETCHING), e a fase de execuo ou processamento de uma query em que ocorre esta operao chama-se fase de carga.

10.2 Substituio de variveis


INSERT INTO LISTA_DE_HOSPEDES VALUES (:1, :2, :3, :4, :5, :6) \ BETTE MIDIRFF,1,MICHAEL,14-JUN-1996,16-JUN-1996,, SEAN PENCIL,6,TOD,15-JUN-1995,19-JUN-1996,, / Obs1.: O trecho anterior dentro de um programa substitui o que est no VALUE, ou seja, o :1, o :2... pelos dados especificados entre barras. A barra invertida (\) marca o incio dos dados e a barra comum (/) delimita o seu final. Obs2.: O programa executa um loop incluindo uma a uma todas as linhas definidas Obs3.: Uma varivel de programa pode ser tambm o nome de uma varivel previamente declarada no programa - por exemplo, :nome ou :arg1

SQL

28

Outro exemplo: UPDATE TABLE LISTA_DE_HOSPEDES SET DESCONTO = :2 WHERE NOME = :1

10.3 Tratamento de erros


S possvel tratar erros SQL por um programa. preciso, por exemplo, do SQLTalk para interceptar os erros e fornecer informaes a respeito deles para auxiliar a pessoa ou o programa que estiver usando a SQL a decidir o que fazer.

10.4 Fases do processamento de declaraes SQL


As 3 fases mais importantes so: COMPILAO => EXECUO => CARGA (FETCH - somente para queries) Obs.: somente as clusulas SELECT passam pela fase de CARGA;

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

Esta declaracao contem variaveis de programa?

NAO

Associacao dos dados

Esta declaracao eh uma query?

NAO

Definicao de buffers de saida EXECUCAO

Esta declaracao eh uma query?

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

Carregar linhas buffer saida

Examinar e processar linhas

Esta e' a ultima linha?

NAO

Existem mais dados p/ substituir por variaveis? .

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

10.5 Utilizando uma interface de chamada de funo (API)


CONEXAO COMPILACAO

Esta declaracao contem variaveis de programa?

NAO

Associacao do dados

Esta declaracao eh uma query?

NAO

Definicao de buffers de saida EXECUCAO

Esta declaracao eh uma query?

NAO

Carga de dados FIM COMMIT DESCONEXAO

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

ASSOCIAO DOS DADOS (bind)

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

DEFINIO DE BUFFERS DE SADA

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

Agora possvel executar as declaraes SQL;

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 >

10.6 Utilizando uma interface de pr-compilador


Um pr-compilador ou pr-processador um programa que analisa outro programa e substitui um cdigo fonte de alto nvel por outro de baixo nvel.

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

Utilizando um pr-compilador SQL-COBOL

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

SELECTs que retornam vrias linhas

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.

CHAR(20), CHAR(01), CHAR(20), INTEGER

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

11.1 TIPOS DE DADOS (extrado do manual de DB2):


1. INTEGER ou INT: para inteiro longo; 2. SMALLINT: para inteiro curto; 3. FLOAT (inteiro): para um floating-point-number, quando 1<=inteiro<=21; para double-precision-floating-point, quando 22<=inteiro<=53; Especificar ainda: REAL, preciso simples; DOUBLE PRECISION, preciso dupla; FLOAT, preciso dupla; 4. DECIMAL (inteiro, inteiro) ou DEC (i,i): nmero decimal, 1 a 31 digitos antes da vrgula; 5. CHARACTER (I) ou CHAR (I): 1<=I<=254, se omitido ento I=1; 6. VARCHAR (I): string, 1<=I<=254; 7. LONG VARCHAR: string >254 caracteres, limitado pelo tamanho maximo da pagina; 8. LONG VARGRAPHIC: string grfica>127 com tamanho varivel determinado pela pagina; 9. VARGRAPHIC(i), string grfica, I<=127; 10. DATE 11. TIME 12. TIMESTAMP COMPLEMENTOS: NOT NULL; NOT NULL WITH DEFAULT (default no nulo); NOT NULL UNIQUE;

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

Вам также может понравиться