SQL – Apostila 1

0

Autoria: Luis Fernando Meireles

Introdução

Devido a carência de literatura destinada ao ensino de Banco de Dados e SQL para estudantes, elaboramos a presente apostila, que não possue o intento de esgotar tão abrangente volume de informações, servindo tão somente para estabelecer um mínimo de conhecimentos destinados a introduzir o estudante no mundo dos Gerenciadores de Banco de dados e da Linguagem SQL.

Banco de Dados

Todos nós sabemos existirem gigantescas bases de dados gerenciando nossas vidas. De fato sabemos que nossa conta bancária faz parte de uma coleção imensa de contas bancárias de nosso banco. Nosso Título Eleitoral ou nosso Cadastro de Pessoa Física, certamente estão armazenados em Bancos de Dados colossais. Sabemos também que quando sacamos dinheiro no Caixa Eletrônico de nosso banco, nosso saldo e as movimentações existentes em nossa conta bancária já estão à nossa disposição.

Nestas situações sabemos que existe uma necessidade em se realizar o armazenamento de uma série de informações que não se encontram efetivamente isoladas umas das outras, ou seja, existe uma ampla gama de dados que se referem a relacioamentos existentes entre as informações a serem manipuladas.

Estes Bancos de Dados, além de manterem todo este volume de dados organizado, também devem permitir atualizações, inclusões e exclusões do volume de dados, sem nunca perder a consistência. E não podemos esquecer que na maioria das vezes estaremos lidando com acessos concorrentes a várias tabelas de nosso
banco de dados, algumas vezes com mais de um acesso ao mesmo registro de uma mesma tabela!

O fato de montarmos uma Mala Direta em um micro PC-XT com um drive já faz de nós um autor de um Banco de Dados?

Claro que não! Um Banco de Dados é antes de mais nada uma coleção logicamente coerente de dados com determinada significação intrínseca. Em outras palavras um arquivo contendo uma série de dados de um cliente, um arquivo com dados aleatoriamente gerados e dois arquivos padrão dbf (dBase) que tem uma relação definida entre ambos, não pode ser considerada uma Base de Dados Real.

Um Banco de Dados contém os dados dispostos numa ordem pré-determinada em função de um projeto de sistema, sempre para um propósito muito bem definido.

Um Banco de Dados representará sempre aspectos do Mundo Real. Assim sendo uma Base de Dados (ou Banco de Dados, ou ainda BD) é uma fonte de onde poderemos extrair uma vasta gama de informações derivadas, que possui um nível de interação com eventos como o Mundo Real que representa. A forma mais comum de interação Usuário e Banco de Dados, dá-se através de sistemas específicos que por sua vez acessam o volume de informações geralmente através da linguagem SQL.
Os Administradores de Banco de Dados (DBA) são responsáveis pelo controle ao acesso aos dados e pela coordenação da utilização do BD. Já os projetistas de Banco de Dados (DBP) são analistas que identificam os dados a serem armazenados em um Banco de Dados e pela forma como estes serão representados.

Os Analistas e Programadores de Desenvolvimento, criam sistemas que acessam os dados da forma necessária ao Usuário Final, que é aquele que interage diretamente com o Banco de Dados.

SGBD x GA

Um SGBD – Sistema de Gerenciamento de Banco de Dados é uma coleção de programas que permitem ao usuário definir, construir e manipular Bases de Dados para as mais diversas finalidades.

Um conceito que deverá ficar bastante claro inicialmente é o que envolve a separação clara entre os Gerenciadores de Base de Dados dos Gerenciadores de Arquivo.

Sistemas baseados em “Banco de Dados” baseados em Btrieve e dBase (Fox e Clipper), podem no máximo simular as características típicas de um ambiente de Banco de Dados. As linguagens Delphi (utiliza opcionalmente o padrão dBase) e o VB (que utiliza o Access), recomendam a utilização de Banco de Dados reais, porém utilizam àqueles “Banco de Dados” que possuem algumas características de Bancos de Dados, mas possuem características típicas de Gerenciadores de Arquivo.

Vamos definir algumas regras básicas e claras para um sistema de manipulação de dados ser considerado um SGBD. Fica implícito que se ao menos uma das características abaixo não estiver presente no nosso “candidato” a SGBD, este poderá ser um GA (Gerenciador de Arquivo) de altíssima qualidade, “quase” um
SGBD, mas não um SGBD.

Regra 1: Auto-Contenção- Um SGBD não contém apenas os dados em si, mas armazena completamente toda a descrição dos dados, seus relacionamentos e formas de acesso. Normalmente esta regra é chamada de Meta-Base de Dados. Em um GA, em algum momento ao menos, os programas aplicativos declaram estruturas (algo que ocorre tipicamente em C, COBOL e BASIC), ou geram os relacionamentos entre os arquivos (típicos do ambiente xBase). Por exemplo, quando você é obrigado a definir a forma do registro em seu programa, você não está lidando com um SGBD.

Regra 2: Independência dos Dados- Quando as aplicações estiverem realmente imunes a mudanças na estrutura de armazenamento ou na estratégia de acesso aos dados, podemos dizer que esta regra foi atingida. Portanto, nenhuma definição dos dados deverá estar contida nos programas da aplicação. Quando você resolve criar uma nova forma de acesso, um novo índice, se precisar alterar o código de seu aplicativo, você não está lidando com um SGBD.

Regra 3: Abstração dos Dados- Em um SGBD real é fornecida ao usuário somente uma representação conceitual dos dados, o que não inclui maiores detalhes sobre sua forma de armazenamento real. O chamado Modelo de Dados é um tipo de abstração utilizada para fornecer esta representação conceitual. Neste modelo, um esquema das tabelas, seus relacionamentos e suas chaves de acesso são exibidas ao usuário, porém nada é afirmado sobre a criação dos índices, ou como serão mantidos, ou qual a relação existente entre as tabelas que deverá ser mantida íntegra. Assim se você desejar inserir um pedido em um cliente inexistente e esta entrada não for automaticamente rejeitada, você não está lidando com um SGBD.

Regra 4: Visões- Um SGBD deve permitir que cada usuário visualize os dados de forma diferente daquela existente previamente no Banco de Dados. Uma visão consiste de um subconjunto de dados do Banco de Dados, necessariamente derivados dos existentes no Banco de Dados, porém estes não deverão estar
explicitamente armazenados. Portanto, toda vez que você é obrigado a replicar uma estrutura, para fins de acesso de forma diferenciada por outros aplicativos, você não está lidando com um SGBD.

Regra 5: Transações- Um SGBD deve gerenciar completamente a integridade referencial definida em seu esquema, sem precisar em tempo algum, do auxílio do programa aplicativo. Desta forma exige-se que o banco de dados tenha ao menos uma instrução que permita a gravação de uma série modificações simultâneas e uma instrução capaz de cancelar um série modificações. Por exemplo, imaginemos que estejamos cadastrando um pedido para um cliente, que este deseje reservar 5 itens de nosso estoque, que estão disponíveis e portanto são reservados, porém existe um bloqueio financeiro (duplicatas em atraso) que impede a venda. A transação deverá ser desfeita com apenas uma instrução ao Banco de Dados, sem qualquer modificações suplementares nos dados. Caso você se obrigue a corrigir as reservas, através de acessos complentares, você não está lidando com um SGBD.

Regra 6: Acesso Automático- Em um GA uma situação típica é o chamado Dead-Lock, o abraço mortal. Esta situação indesejável pode ocorrer toda vez que um usuário travou um registro em uma tabela e seu próximo passo será travar um resgistro em uma tabela relacionada à primeira, porém se este registro estiver previamente travado por outro usuário, o primeiro usuário ficará paralisado, pois, estará esperando o segundo usuário liberar o registro em uso, para que então possa travá-lo e prosseguir sua tarefa. Se por hipótese o segundo usuário necessitar travar o registro travado pelo primeiro usuário (!), afirmamos que ocorreu um abraço mortal, pois cada usuário travou um registro e precisa travar um outro, justamente o registro anteriormente travado pelo outro! Imaginemos um caso onde o responsável pelos pedidos acabou de travar o Registro Item de Pedido, e, necessita travar um registro no Cadastro de Produtos, para indicar uma nova reserva. Se concomitantemente estiver sendo realizada uma tarefa de atualização de pendências na Tabela de Itens, e para tanto, previamente este segundo usuário travou a Tabela de Produtos, temos a ocorrência do abraço mortal. Se a responsabilidade de evitar esta ocorrência for responsabilidade da aplicação, você não está lidando com um SGBD.

Conclusão: Um SGBD deve obedecer INTEGRALMENTE as seis regras acima. Em caso contrário estaremos diante de um GA ou de um “quase” SGBD.

Considerações Finais

Atualmente, existe uma tendência de mercado em se dizer que qualquer problema será resolvido, caso a empresa adquira um Banco de Dados. Naturalmente, em um ambiente com acesso constante ao Banco de Dados (acesso concorrente, obviamente), onde a segurança seja de vital importância e que o desempenho da aplicação escrita estiver comprometendo a empresa, considerando-se logicamente uma aplicação bem escrita, sem dúvida a aquisição de um Banco de Dados poderá ser o primeiro passo na solução do problema.

Analogamente ao que ocorreu com o aparecimento das primeriras linguagens de programação voltadas ao Windows, onde estas foram apresentadas como capazes de alavancar os negócios da empresa, e no geral causaram mais frustação do que solução, a aquisição do Banco de Dados, pode gerar o mesmo tipo de problema.

É fundamental que a empresa candidata a utilizar um Banco de Dados, normatize-se totalmente, pois soluções “quebra-galho”, típicas do ambiente que dispõe de um Gerenciador de Arquivo, tendem a ser impossíveis em um ambiente estruturado sobre o Banco de Dados. Portanto, sob pena de se realizar um grande investimento, e não se colher fruto algum, é muito conveniente, que a empresa antes de adquirir um Banco de Dados, passe por um processo de adaptação, preferencialmente contando com pessoal especializado, geralmente consultores, que não tenham qualquer ligação com fabricantes de Bancos de Dados.
Características Gerais de um SGBD

Os SGBD tem sete características operacionais elementares sempre observadas, que passaremos a listarr:

Característica 1: Controle de Redundâncias- A redundância consiste no armazenamento de uma mesma informação em locais diferentes, provocando inconsistências. Em um Banco de Dados as informações só se encontram armazenadas em um único local, não existindo duplicação descontrolada dos dados. Quando existem replicações dos dados, estas são decorrentes do processo de armazenagem típica do ambiente Cliente-Servidor, totalmente sob controle do Banco de Dados.

Característica 2: Compartilhamento dos Dados- O SGBD deve incluir software de controle de concorrência ao acesso dos dados, garantindo em qualquer tipo de situação a escrita/leitura de dados sem erros.

Característica 3: Controle de Acesso- O SGDB deve dispor de recursos que possibilitem selecionar a autoridade de cada usuário. Assim um usuário poderá realizar qualquer tipo de acesso, outros poderão ler alguns dados e atualizar outros e outros ainda poderão somente acessar um conjunto restrito de dados para escrita e leitura.

Característica 4: Interfaceamento- Um Banco de Dados deverá disponibilizar formas de acesso gráfico, em linguagem natural, em SQL ou ainda via menus de acesso, não sendo uma “caixa-preta” somente sendo passível de ser acessada por aplicações.

Característica 5: Esquematização- Um Banco de Dados deverá fornecer mecanismos que possibilitem a compreensão do relacionamento existentes entre as tabelas e de sua eventual manutenção.

Característica 6: Controle de Integridade-Um Banco de Dados deverá impedir que aplicações ou acessos pelas interfaces possam comprometer a integridade dos dados.

Característica 7: Backups- O SGBD deverá apresentar facilidade para recuperar falhas de hardware e software, através da existência de arquivos de “pré-imagem” ou de outros recursos automáticos, exigindo minimamente a intervenção de pessoal técnico.

Existe a possibilidade de encontramos Bancos de Dados que não satisfaçam completamente todas as características acima, o que não o inválida como Banco de Dados. Na prática podemos encontrar situações onde a primeira característica não seja importante, pois podemos ter o Banco de Dados baseado totalmente em um único servidor, e as redundâncias podem ser aceitas em algumas situações sob controle da aplicação (algo não muito recomendado, mas passível de aceitação, em situações onde a existência do nome do cliente em um arquivo contendo duplicatas emitidas, possibilita o acesso a apenas uma tabela sem relacionamentos, e sabe-se de antemão que uma duplicata depois de emitida, não pode ter seu cliente alterado).

A segunda característica (Compartilhamento dos Dados) pode ser desconsiderada principalmente em ambiente de desenvolvimento, ou ainda em aplicações remotas.

O Controle de Acesso pode ser descartado em pequenas empresas, sendo que o aplicativo em questão, mais o software de rede, podem facilmente se imcumbir desta característica, no caso de pequenas empresas, com reduzido número de pessoas na área operacional.

O Interfaceamento e a Esquematização, são características sempre disponíveis, o que varia neste caso é qualidade destes compoenentes, que vai desde o sofrível até o estado da arte. É muito conveniente que esta característica seja muito boa em um Banco de Dados, onde estiverem em atuação mais de um Administrador de Banco de Dados e tivermos um número relativamente alto de sistemas desenvolvidos ou em desenvolvimento neste ambiente.

De fato, quanto maior o número de pessoas envolvidas no desenvolvimento de aplicações e gerenciamento do Banco de Dados, mais importante tornam-se estas duas características, pois cada novo sistema desenvolvido precisará sempre estar adequado ao Banco de Dados da Empresa e aderente aos padrões de acesso utilizados nos sistemas concorrentes.

As interfaces ISQL e WinSQL devem deixar muito claro ao estudante como uma interface pobre (no caso a existente no ISQL) perde muito, quando comparada a uma interface mais recursiva. A esquematização existente no Banco de Dados é muito melhor do que aquela mantida em alguma pasta, em algum arquivo do CPD, que sempre está “um pouquinho” desatualizada.

O Controle de Integridade, é outra característica sempre presente nos Bancos de Dados, mas existem diferenças quando da implementação desta característica. Assim, é comum encontrarmos Bancos de Dados que suportam determinado acesso, enquanto outros não dispõe de recurso equivalente.

O Backup em tempo de execução, é outra característica sempre disponível, porém temos aplicações que invariavelmente são comprometidas por falhas de hardware, e outras, que o mesmo tipo de falha não causa perda alguma de dados ou de integridade. Novamente, cada Banco de Dados tem esta característica melhor ou pior implementada, cabendo ao Administrador de Banco de Dados escolher aquele que lhe oferecer mais segurança.

Devemos ressaltar ainda, que podemos ter um Banco de Dados Modelo A, que respeite integralmente as regras básicas e disponha de todas as características apresentadas, enquanto um Modelo B que apesar de respeitar as regras básicas, não suporte uma ou outra característica desejável, mas tenha um desempenho excelente, enquanto o Modelo A seja apenas razoável no quesito desempenho, nos levará seguramente a escolher o Modelo B como sendo o ganhador para nossa instalação!

Isto ocorre pois, na prática, todo usuário deseja um tempo de resposta muito pequeno. O chamado “prazo de entrega” muito comum em Bancos de Dados operando nos limites de sua capacidade, ou nos casos onde o hardware está muito desatualizado, é fonte de inúmeros problemas para o pessoal de informática. Neste caso é melhor abrirmos mão de uma Interface Amigável, de um Gerenciamente Automático de Backups ou ainda de outras características que não julgarmos fundamentais, para nos livrarmos do problema típico de ambiente extremamente comprometido, por má performance do Banco de Dados.

A escolha do Banco de Dados da empresa, portanto é uma decisão muito delicada, na medida em que está irá acarretar troca de aplicativos e troca de hardware. Os investimentos diretamente aplicados no Banco de Dados, costumam ser infinitamente menores do que aqueles a serem aplicados na empresa, visando sua perfeita adeqüação ao novo SGBD. Esta decisão, sempre que possível, deve ser tomada por especialistas em Banco de Dados, com profundos conhecimentos de Análise de Sistemas, de Banco de Dados e de Software de Gerenciamento de Bases de Dados, de forma a evitar que a empresa escolha um Banco de Dados inadequado aos seus propósitos, e que pouco tempo depois, seja obrigada a perder todos investimento realizado em Software e Hardware.
Arquitetura de um SGBD

Estrutura

Podemos dizer que o Banco de Dados tem um Nível Interno, onde é descrita a estrutura de armazenamento físico dos dados, um Nível Intermediário, onde temos a descrição lógica dos dados e um Nível Externo onde são descritas as visões para grupos de usuários.

Não podemos deixar de lembrar ainda que o Banco de Dados garante a Independência Lógica e Física dos Dados, portanto podemos alterar o esquema conceitual dos dados, sem alterar as visões dos usuários ou mesmo alterar o esquema interno, sem contudo alterar seu esquema conceitual.

Modelos de Dados

O Modelo de Dados é basicamente um conjunto de conceitos utilizados para descrever um Banco de Dados. Não existe uma única forma de representação deste modelo, porém qualquer forma que permita a correta compreensão das estruturas de dados compreendidas no Banco de Dados, pode ser considerada adequada. Vamos descrever sucintamente este modelo, pois estes serão objetos de outras disciplinas:

Modelo Orientado ao Registro: São modelos que representam esquematicamente as estruturas das tabelas de forma bastante próxima a existente fisicamente. Basicamente são apresentados os registros de cada tabela (inclusive seus campos) e seus relacionamentos elementares. O Modelo Relacional, o Modelo de Rede e o Hierárquico são exemplos deste tipo de representação.

Modelo Semântico: São modelos onde existe uma representação explícita das entidades e relacionamentos. O Modelo Entidade-Relacionamento e o Funcional, são exemplos deste tipo de abordagem.

Modelo Orientado ao Objeto: São modelos que procuram representar as informações através dos concietos típicos da Programação Orientada ao Objeto, utilizando o conceito de Classes que irão conter os objetos. Citamos os Modelos O2 e o de Representação de Objetos como exemplos típicos desta abordagem.

O conceito de instância, sempre muito presente, poderia ser definido como sendo o conjunto de dados que definem claramente um Banco de Dados em deteminado instante. Devemos entender então o Banco de Dados como sendo não apenas um conjunto de dados digitados, mas também todo o esquema e regras armazenada e
controladas pelo SGBD.

Em outras palavras, podemos dizer que os SGBD, vieram para eliminar todo o trabalho que anteriormente um programador de aplicação realizava controlando o acesso, integridade e redundância dos dados.

Componentes de um Banco de Dados

Um Banco de Dados é composto pelas seguintes partes:

Gerenciador de Acesso ao Disco: O SGBD utiliza o Sistema Operacional para acessar os dados armazenados em disco, controlando o acesso concorrente às tabelas do Banco de Dados. O Gerenciador controla todas as pesquisas queries) solicitadas pelos usuários no modo interativo, os acessos do compilador DML, os acessos feitos pelo Processador do Banco de Dados ao Dicionário de Dados e também aos próprios dados.

O Compilador DDL (Data Definition Language) processa as definições do esquema do Banco de Dados, acessando quando necessário o Dicionário de Dados do Banco de Dados.

O Dicionário de Dados contém o esquema do Banco de Dados, suas tabelas, índices, forma de acesso e relacionamentos existentes.

O Processador do Banco de Dados manipula requisições à própria Base de Dados em tempo de execução. É o responsável pelas atualizações e integridade da Base de Dados.

O Processador de Pesquisas (queries) dos usuários, analisa as solicitações, e se estas forem consistentes, aciona o Processador do Banco de Dados para acesso efetivo aos dados.

As aplicações fazem seus acessos ao pré-compilador DML da linguagem hospedeira, que os envia ao Compilador DML (Data Manipulation Language) onde são gerados os códigos de acesso ao Banco de Dados.

Tipos de SGBD

Introdução

Podemos citar como tipos principais os Bancos de Dados Relacionais, os Hierárquicos, os de Rede, os Semânticos, os Orientados a Objetos e os Universais.

Os Bancos de Dados alvo de nosso estudo serão os Relacionais, sendo que os demais tipos serão apenas citados superficialmente, por não serem parte integrante de nosso curso.

Esquema de Organização dos Dados

Em Linguagem C os estudantes tomaram (ou irão tomar contato) com os ponteiros de registro, que aqui representaremos como sendo números de acesso ao registro. Visando diferenciar o número do registro físico do número do registro apontado pelo ponteiro, usaremos o símbolo (#) para indicar o número do registro físico, enquanto o símbolo (*) será utilizado pelo para indicar o endereço indicado pelo ponteiro, a semelhança da representação usual dos programadores da Linguagem C.

Vamos supor o arquivo abaixo ordenado alfabeticamente (físico):

#1- Amarelo *2
#2- Azul *3
#3- Branco *4
#4- Preto *5
#5- Verde *6
#6- Vermelho —

Supondo desejarmos incluir a cor Laranja, seríamos obrigado a re-escrever todo o arquivo de modo a Laranja ocupar o registro 4. Vamos antes de fazer uma nova ordenação, analisar a solução abaixo:

#1- Amarelo *2
#2- Azul *3
#3- Branco *7
#4- Preto *5
#5- Verde *6
#6- Vermelho —
#7- Laranja *4

Observe que o registro #3 (Branco) passou a apontar para o registro *7, que contém o novo dados (Laranja). O novo dado passa a apontar para o registro previamente apontado pelo registro que agora o aponta. Parece, e é confuso, mas se você analisar o esquema abaixo perceberá que apesar do palavreado confuso, facilmente qualquer um de nós percebe a maneira adequada de inserir novos registros.

Algo –> Apontado

Algo –> Novo –> Apontado

#1 Algo –> *2
#2 Apontado não aponta (é o último física e logicamentex)

#1 Algo –> *3
#2 Apontado não aponta (é o último logicamente)
#3 Novo –> *2 (é o último fisicamente)

A chamada perda de ponteiros, fenômeno dos mais temidos pelos profissionais de sistema, nada mais é que a perda de referência lógica entre registros de uma tabela.

Existem diversas técnicas de acesso como as chamadas Btree+ (Arvore Binária Balanceada), Hashing, Sequencial Ordenado, Hashing Dinâmico, Hashing Extensível e Hashing Linear, próprios para um curso específico de Banco de Dados, que não chegaremos a analisar em nosso curso.

Sabemos que em linguagem C foi (ou será) apresentada a técnica de balanceamento de estruturas, que mostrou (ou mostrará) como um Banco de Dados é arranjado internamente.

Exercício: Represente esquematicamente o arranjo alfabético dos seguintes times de futebol: Fluminense, Flamengo, Vasco, Botafogo, Madureira, América e Olária. Suponha ainda que o Bangu queira participara do campeonato, como ficaria a nova ordem da tabela?

Banco de Dados Hierárquicos

Seguem o estilo de um organograma empresarial (Diretoria-Divisão-Seção-Setor) ou de biblioteca (Exata-Matemática-Algebra Linear-Vetores). Este modelo é capaz de representar este tipo de organização de forma direta, mas apresenta inconvenientes quando esta situação não aparece claramente com relações de hierarquia.

O Exemplo a seguir (Folha de Pagamento) deve servir para esclarecer melhor o estilo deste modelo

Fábrica Financeiro Comercial

Injeção Extrusão Pagar Receber Contábil Vendas Marketing

Paulo Vinícius Vilma Sílvia Dagoberto Juracy Richard
Pedro Carlos Ernesto Sandra Paula Pedrinho
João

Sabemos que Paulo é “filho” da Injeção que por sua vez é “filha” da Fábrica.

Banco de Dados em Redes

Neste modelos os dados são dispostos em registros, previamente classificados em classes que descrevem a estrutura de determinado tipo de registro. Os registros são descritos em relações de conjuntos onde são estabelecidas as ligações lógicas entre eles.

O esquema abaixo representa este tipo de Ligação

Fábrica
#1 Nome Local … Apontada Aponta_Início Aponta_Final
Injeção
#7 Nome Máquina … Apontada (*1) Aponta_I(*15) Aponta_F(*18)
#15 Paulo 28 (Idade) … (*7) (*17)
#18 João 25 … (*17) (*7)

Um confusão habitualmente verificada, diz respeito a confusão que existe entre o conceito do Modelo de Redes e o existente na matemática. No modelo de Redes temos sempre um elemento distitivo, o registro base e a partir dele são dispostos os demais registros. Temos sempre tipos de conjunto, que dispõe de três elementos, a saber: nome, tipo de registro pai e tipo de registro filho. Supondo um Registro contido no Arquivo de Disciplinas ministradas na Íbero, este seria um registro pai, na medida em que conteria a referência aos seus registros filhos (os alunos cursando aquela disciplina).

As restrições impostas pelo Modelo de Redes podem ser descritas como de ordem de Entrada e de Existência. Em relação as restrições de entrada citamos a obrigatoriedade de cada novo registro estar conectado (ou apontado, como preferem os programadores C) ao conjunto indicado. Em relação a restrições de Existência podemos dizer que um componente de um tipo de registro pode existir de forma independente de outros desde que esteja conectado a algum outro registro fazendo parte de algum conjunto, ou sendo base de um novo conjunto. A identificação de um conjunto pode ser verificada através do esquema de ligação entre o registro pai e o registro filho, assim sendo, cada instância de conjunto apresenta um elemento de distinção, o tal registro pai, e os registros filhos devidamente ordenados, e portanto passíveis de serem acessados pelos seus elementos.

Exemplo: Disciplina Tópicos Avançados e seus Alunos

Registro de Disciplinas

Informática

Álvaro

Maurício

Cláudio

Registro de Alunos

O exemplo anterior representa uma instância de connjunto, no caso Disciplinas (Tópicos Avançados) e seus alunos (no caso Álvaro, Amorim e Cláudio).

Banco de Dados Orientados ao Objeto

Representam os dados como coleções que obedecem propriedades. São modelos geralmente conceituais dispondo de pouquíssimas aplicações reais. Neste Modelo não seria interessante a existência de uma tabela de funcionários e dentro dela alguma referência para cada registro, de forma a podermos saber onde (em que departamento) o funcionário está alocado. Um conjunto de regras disponibilizaria em separado os funcionários da fábrica, que no entanto estariam agrupados aos demais, para o sistema de folha de pagamento.

Banco de Dados Universal

Usa fortemente o conceito dos bancos de dados relacionais (ainda a serem vistos), no que concerne ao tratamento da informação dita caracter e muito do Modelo Orientado ao Objeto, no tocante ao tratamento de Imagens e Sons. É um dos assuntos top do momento, e será alvo de pesquisas na disciplina Tópicos Avançados – Atualidades, não sendo objeto imediato de nossa matéria.

Banco de Dados Relacional

O Modelo de Dados relacional representa os dados contidos em um Banco de Dados através de relações. Estas relações contém informações sobre as entidades representadas e seus relacionamentos. O Modelo Relacional, é
claramente baseado no conceito de matrizes, onde as chamadas linhas (das matrizes) seriam os registros e as colunas (das matrizes) seriam os campos. Os nomes das tabelas e dos campos são de fundamental importância para nossa compreensão entre o que estamos armazenando, onde estamos armazenando e qual a relação existente entre os dados armazenados.

Cada linha de nossa relação será chamada de TUPLA e cada coluna de nossa relação será chamada de ATRIBUTO. O conjunto de valores passíveis de serem assumidos por um atribruto, será intitulado de DOMÍNIO.

Estes tópicos serão estudados cuidadosamente na disciplina Análise de Sistemas, que se incumbirá de apresentar cuidadosamente regras e normas para elaboração destes modelos.

Em nosso curso, voltado à construção prática dos Bancos de Dados, e não de sua construção teóricas, apenas citaremos os aspectos básicos da construção teórica, de forma a facilitar ao estudante o relacionamento que existe entre Análise de Sistemas e Banco de Dados (uma das sub-disciplinas de Tópicos Avançados).

O domínio consiste de um grupo de valores atômicos a partir dos quais um ou mais atributos retiram seus valores reais. Assim sendo Rio de Janeiro, Paraná e Pará são estados válidos para o Brasil, enquanto que Corrientes não é um estado válido (pertence a Argentina e não ao Brasil).

O esquema de uma relação, nada mais são que os campos (colunas) existentes em uma tabela. Já a instância da relação consiste no conjunto de valores que cada atributo assume em um determinado instante. Portanto, os dados armazenados no Banco de Dados, são formados pelas instâncias das relações.

As relações não podem ser duplicadas (não podem existir dois estados do Pará, no conjunto de estados brasileiros, por exemplo), a ordem de entrada de dados no Banco de Dados não deverá ter qualquer importância para as relações, no que concerne ao seu tratamento. Os atributos deverão ser atômicos, isto é, não são íveis de novas divisões.

Chamaremos de Chave Primária ao Atributo que definir um resgistro, dentre uma coleção de registros. Chave Secundária (Terceária, etc), serão chaves que possibilitarão pesquisas ou ordenações alternativas, ou seja, diferentes da ordem criada a partir da chave primária ou da ordenação natural (física) da tabela. Chamaremos de Chave Composta, aquela chave que contém mais de um atributo (Por exemplo um cadastro ordenado alfabéticamente por Estado, Cidade e Nome do Cliente, necessitaria de uma chave composta que contivesse
estes três atributos). Chamaremos de Chave Estrangeira, aquela chave que permitir a ligação lógica entre uma tabela (onde ela se encontra) com outra na qual ele é chave primária.

Exemplo:

Cidade Estado
* CidCodi * EstCodi
CidNome EstNome
EstCodi (E)

CidCodi e EstCodi, são chaves primárias respectivamente das tabelas Cidade e Estado, enquanto EstCodi é chave estrangeira na tabela de cidades. É precisamente por este campo (atributo, ou coluna), que será estabelecida a relação entre as tabelas Cidade–>Estado.

Forma Normal

A disciplina Análise de Sistemas abordará detalhadamente esta importante metodologia para definição das tabelas que irão compor a base de dados, que aqui apenas citaremos.

Primeira Forma Normal: Uma relação se encontra na primeira forma normal se todos os domínios de atributos possuem apenas valores atômicos (simples e indivisíveis), e que os valores de cada atributo na tupla seja um valor simples. Assim sendo todos os atributos compostos devem ser divididos em atributos atômicos.

Segunda Forma Normal: Uma relação se encontra na segunda forma normal quando estiver na primeira forma normal e todos os atributos que não participam da chave primária são dependentes desta. Assim devemos verificar se todos os atributos são dependentes da chave primária e retirar-se da relação todos os
atributos de um grupo não dependente que dará origem a uma nova relação, que conterá esse atributo como não chave. Desta maneira, na segunda forma normal evita inconsistências devido a duplicidades.

Terceira Forma Normal: Uma relação estará na terceira forma normal, quando estiver na primeira forma norma e todos os atributos que não participam da chave primária são dependentes desta porém não transitivos. Assim devemos verificar se existe um atributo que não depende diretamente da chave, retirá-lo criando uma nova relação que conterá esse grupo de atributos, e defina com a chave, os atributos dos quais esse grupo depende diretamente.

O processo de normalização deve ser aplicado em uma relação por vez, pois durante o processo de normalização vamos obtendo quebras, e por conseguinte, novas relações. No momento em que o sistema estiver satisfatório, do ponto de vista do analista, este processo iterativo é interrompido. De fato existem
literaturas indicando quarta, quinta formas normais, que não nos parece tão importante, nem mesmo academicamente.

A normalização para formas apoiadas em dependências funcionais evita inconsistências, usando para isso a própria construção da Base. Se a mesma consistência for passível de ser garantida pelo aplicativo, a normalização pode ser evitada com ganhos reais no desempenho das pesquisas. No caso da
consistência não ser importante, também podemos não normalizar totalmente uma Base de Dados.

Exemplo: Normalizar os seguintes atributos:

Nº do Pedido, Nome do Cliente, Nome dos Produtos, Quantidades

Nº do Pedido, Código do Cliente, Nome dos Produtos, Quantidades
Código do Cliente, Nome do Cliente

Nº do Pedido, Código do Cliente, Código dos Produtos, Quantidades
Código do Cliente, Nome do Cliente
Código do Produto, Nome do Produto

Nº do Pedido, Código do Cliente
Código do Cliente, Nome do Cliente
Código do Produto, Nome do Produto
Nº do Pedido, Código do Produto, Quantidade

Cliente Pedido Item Produto

CliCodi PedNume PedNume ProCodi
CliNome CliCodi ProCodi ProNome
IteQtde

O esquema apresentado anteriormente poderia ser inferido diretamente, usando metodologia tipicamente apresentada em Organização e Método. Se soubermos, por hipótese, que um profissional habilitado desenhou o pedido da empresa, e que esta o está utilizando com sucesso, poderíamos basear nosso modelo de dados neste formulário. Devemos notar que muitos Analistas de Sistemas não adotam estes procedimentos, por preferirem os métodos convencionais para elaboração do Modelo de Dados.

Considerando qualquer formulário de pedidos podemos notar que o Número do Pedido geralmente tem destaque e sempre é único, ou seja encontramos nossa chave primária da Tabela de Pedidos, como sabemos que um cliente pode fazer mais de uma compra, achamos nossa Tabela de Clientes, que pode ter um Código, portanto achamos sua chave primária, que por conseguinte será a chave estrangeira da Tabela de Pedidos.

Um ponto delicado, diz respeito aos itens do pedido, que formam geralmente um espaço destacado dentro do formulário de pedidos. Geralmente, e este é um dos casos, estas áreas em separado dos formulários darão origem a tabelas filhas, como é o caso típico das duplicatas em notas fiscais, ou dos dependentes na ficha de funcionários. Portanto achamos nossa Tabela de Itens que será ligada à Tabela de Pedidos através do Número do Pedido, que é ao mesmo tempo chave primária e chave estrangeira para a Tabela de Itens.

Finalmente podemos perceber, que da mesma forma como os clientes se repetem em relação a Tabela de Pedidos, os produtos podem se repetir na tabela de itens (observe que não obstante não termos nenhum pedido com o mesmo item grafado duas vezes, este item pode ser adquirido em outro pedido). Assim descobrimos nossa quarta tabela, a Tabela de Produtos e a chave primária Código do Produto.
SQL – Structured Query Language

Introdução

Quando os Bancos de Dados Relacionais estavam sendo desenvolvidos, foram criadas linguagens destinadas à sua manipulação. O Departamento de Pesquisas da IBM, desenvolveu a SQL como forma de interface para o sistema de BD relacional denominado SYSTEM R, início dos anos 70. Em 1986 o American National Standard Institute ( ANSI ), publicou um padrão SQL.

A SQL estabeleceu-se como linguagem padrão de Banco de Dados Relacional.

SQL apresenta uma série de comandos que permitem a definição dos dados, chamada de DDL (Data Definition Language), composta entre outros pelos comandos Create, que é destinado a criação do Banco de Dados, das Tabelas que o compõe, além das relações existentes entre as tabelas. Como exemplo de comandos da classe DDL temos os comandos Create, Alter e Drop.

Os comandos da série DML (Data Manipulation Language), destinados a consultas, inserções, exclusões e alterações em um ou mais registros de uma ou mais tabelas de maneira simultânea. Como exemplo de comandos da classe DML temos os comandos Select, Insert, Update e Delete.

Uma subclasse de comandos DML, a DCL (Data Control Language), dispõe de comandos de controle como Grant e Revoke.

A Linguagem SQL tem como grandes virtudes sua capacidade de gerenciar índices, sem a necessidade de controle individualizado de índice corrente, algo muito comum nas linguagens de manipulação de dados do tipo registro a registro. Outra característica muito importante disponível em SQL é sua capacidade de construção de visões, que são formas de visualizarmos os dados na forma de listagens independente das tabelas e organização lógica dos dados.

Outra característica interessante na linguagem SQL é a capacidade que dispomos de cancelar uma série de atualizações ou de as gravarmos, depois de iniciarmos uma seqüência de atualizações. Os comandos Commit e Rollback são responsáveis por estas facilidades.

Devemos notar que a linguagem SQL consegue implementar estas soluções, somente pelo fato de estar baseada em Banco de Dados, que garantem por si mesmo a integridade das relações existentes entre as tabelas e seus índices.

O Ambiente SQL

Dispomos na Ibero de dois softwares destinados a linguagem SQL o ISQL e o WinSQL.

O ISQL faz parte do pacote Ideo e permite construirmos Banco de Dados e tabelas diretamente pelo interpretador SQL, bem como acessarmos as Bases de Dados construídas no Ideo. O ISQL pode gerar Banco de Dados em seu ambiente proprietário (Watcom, hoje pertencente a Symantech) ou ainda nos consagrados Banco de Dados Oracle, SyBase, Ingres (Computer Associates), DB/2 (IBM) e Informix. Devido as origens do Ideo, o Banco de Dados SQL Server da Microsoft não é suportado, pois este Banco de Dados originou-se na microinformática e somente recentemente a Sapiens migrou seu software dos Ambientes Mainframe e Unix.

Já o WinSQL é um ambiente inteiramente gráfico (ao contrário do ISQL que guarda fortes características do ambiente em Mainframe onde se originou), destinado ao apredinzado, portanto somente pode criar Banco de Dados em seu formato proprietário.

Os comandos do WinSQL por serem visuais, não necessitam de maior esclarecimento além daqueles já contidos no Help. Já o ISQL apesar de possuir um Help bastante completo necessita, em nosso entender, de alguns esclarecimentos iniciais.

Uma série de comandos do interpretador, que funciona de forma análoga àquela existente no dBase modo interativo, podem ser utilizados pelo usuário. Não obstante alguns comandos tenham nome idêntico a alguns comandos do DOS, devemos notar que muitas vezes sua sintaxe é bastante diversa daquele sistema operacional. Vamos destacar os seguintes comandos:

EDIT – Carrega o editor de bloco de notas do windows, o qual serve para a criação de arquivos para serem executados no Ideo.
Ex: edit teste.sql

CD – Mostra o diretório onde serão gravados os arquivos *.sql, *.dic *.dat.
Permite alterar para determinado diretório (CD DADO, fará com que o diretório corrente passe a ser C:DADO, caso o diretório corrente fosse a raiz. Permite retornar ao diretório de nível inferior (CD ..). Atenção este comando não é análogo ao Change Dir do DOS, na medida em que não permite a mudança direta de um subnível do diretório X para um diretório Y por exemplo.

DEFAULT – permite alterarmos o drive corrente.
Ex: DEFAULT F:

INCLUDE – Executa arquivos *.sql. O arquivo .sql deverá conter uma série de instruções SQL.
Ex: include teste.sql

@< file > ; – Também executa arquivos *.sql.
Ex: @teste.sql;

EXIT; – Finaliza a sessão do ISQL. ou ( QUIT )

COMMIT; – Confirma a transação.

ROLLBACK; – Desfaz a transação.

SHOW ; – Mostra os nomes das tabelas existentes em determinado banco de dados.
Ex: SHOW tables;

SHOW FIELDS FOR ; – Mostra os campos de determinada tabela.
Ex: SHOW FIELDS FOR ATOR;

SHOW INDEXES FOR ; – Lista de indices da tabela.

SHOW RELATIONSHIPS FOR ; – Lista de relacionamentos da tabela.

LIST ; – Lista conteúdo da tabela.

Estudo Dirigido

Consideramos a linguagem SQL eminentemente prática, desta forma criamos um exmplo completo e propomos um exercício análogo, para tornar o estudante apto a manipular a linguagem SQL de maneira prática, em conformidade a filosofia eminentemente prática da Linguagem SQL.

O exemplo apresentado nesta apostila já está disponível para sua utilização do diretório IDEOSQL, bastando para isso você copiar este exemplo para seu diretório e iniciar os testes de forma simultânea a
sua apresentação pelo professor.

É conveniente que você procure montar o exercício clássico (mundo), de forma a testar todos os conhecimentos adquiridos. Para tanto analise cuidadosamente o exercício proposto a seguir, e construa as relações, tabelas e queries adequadas ao final de cada exemplo.

Exercício: Elabore Banco de Dados Mundo que contenha as seguintes tabelas: Continente, País e Cidade. Observe que uma cidade deverá pertencer exclusivamente a um país e que cada país deverá estar cadastrado no continente onde se localizar sua área mais importante. Assim não obstante grande parte do território russo fazer parte Ásia, a Rússia será considerada fazendo parte da Europa. Assim teríamos basicamente uma relação do tipo:

Cidade –> País –> Continente

PARTE I – Comandos de Modificações do Esquema e Criação de Banco de Dados

Comando Create
Este comando permite a criação de tabelas no banco de dados ou mesmo de sua criação.

Sintaxe:
CREATE DATABASE < nome_db >;

onde:
nome_db – indica o nome do Banco de Dados a ser criado.

Sintaxe:
CREATE TABLE < nome_tabela >
( nome_atributo1 < tipo > [ NOT NULL ],
nome_atributo2 < tipo > [ NOT NULL ],
……
nome_atributoN < tipo > [ NOT NULL ] ) ;

onde:
nome_table – indica o nome da tabela a ser criada.
nome_atributo – indica o nome do campo a ser criado na tabela.
tipo – indica a definição do tipo de atributo ( integer(n), char(n),
real(n,m), date… ).
n- número de dígitos ou de caracteres
m- número de casas decimais

Agora vamos criar uma tabela. Use o editor para salvar em um arquivo ou digite na linha de comando do ISQL.

CREATE DATABASE TRABALHO;

O comando acima criou um Banco de Dados, porém este na verdade não passa de uma abertura no diretório, pois não conta com nenhuma tabela.

Agora criaremos as tabelas que estarão contidas no Banco de Dados TRABALHO.

A primeira Tabela será a de Departamentos (DEPT). Esta tabela conterá além dos campos também sua chave primária, suas chaves estrangeiras e também seus índices. A segunda tabela será a de Empregados (EMP), que também será criada.

Não devemos esquecer de primeiramente abrirmos o Banco de Dados. Diferentemente do que ocorre em alguns aplicativos, em SQL o fato de criarmos um Banco de Dados, não significa que o banco recém criado já está preparado para utilização. A instrução a seguir, providencia a abertura do Banco de Dados criado.

OPEN DATABASE TRABALHO;

Agora estamos prontos para criarmos as tabelas necessárias. Lembramos aos Estudantes, que o Arquivo TABS.SQL, contém todas as instruções necessárias para criação do Banco de Dados Trabalho e de suas tabelas. Já o Arquivo DADOS.SQL irá popular estas tabelas. Para efeitos didáticos, criamos as tabelas de forma que sua população, em outras palavras os dados, sejam facilmente referenciáveis pelos estudantes. Assim sendo, na tabela de departamentos, contamos com 5 departamentos, cada um deles tendo seu gerente. Todos os “gerentes” tem nomes de cantoras brasileiras (Gal Costa, Marina Lima, etc), todos os “operários” tem nomes de jogadores de futebol, todas as vendedoras tem nomes de jogadoras de volei, todas as balconistas tem nome de jogadoras de basquete e o presidente da empresa exemplo, tem o mesmo nome do presidente do Brasil. Desta forma os testes devem resultar em grupos bastante definidos. Assim se você estiver listando Gerentes e aparecer um homônimo da Ana Paula (jogadora de volei), verifique sua query atentamente, pois muito provavelmente a mesma estará errada.

A seguir código necessário a criação da tabela Departamento e seu índice:

create table Dept
(DepNume integer(4) not null,
DepNome char(20) not null,
DepLoca char(20) not null,
DepOrca integer(12,2),
primary key (DepNume)
);

create unique index DepNum on Dept (DepNume asc);

Note-se que a chave primária já está definida juntamente com o registro da tabela. A criação do índice, que por razões óbvias deve ser criado após a tabela, naturalmente é um comando totalmente independente do primeiro create, que serviu para criar a tabela e suas característica básicas.

Vamos analisar o código necessário para a criação da tabela de empregados, apresentado a seguir:

create table Emp
(EmpNume integer(5) not null,
EmpNome char(30) not null,
EmpGere integer(5) ,
EmpServ char(20) ,
DepNume integer(4) not null,
EmpAdmi date not null,
EmpSala integer(10,2),
EmpComi integer(10,2),
primary key (EmpNume),
foreign key has (DepNume)
references Dept
on delete restrict
on update cascade
);

create unique index EmpNum on Emp (EmpNume asc);
create index EmpDep on Emp (DepNume asc);

A Tabela de Empregados não poderia ter sido criada antes da Tabela de Departamento, pois contém uma referência direta àquela tabela. Quando declaramos que DepNume é chave estrangeira, promovemos de fato a ligação do cadastro de empregados como o cadastro de departamentos. Ao restringirmos as exclusões, permitimos a existência de funcionários não alocados a nenhum departamento. Apesar desta prática ser contrária a tese de que devemos possuir apenas tuplas perfeitamente relacionáveis em nossas tabelas, podemos deixar esta pequena abertura, pois um usuário que excluisse inadivertidamente determinado departamento, acabaria por excluir também uma grande quantidade de funcionários, que estivessem ligados a este departamento.

Já a atualização em cascata dos códigos de departamento é uma boa providência, na medida em que teremos, uma vez alterado algum código de departamento, a atualização imediata de todos os funcionários pertencentes ao departamento cujo código foi modificado.

Observações:

1- Observar que os índices são parte intrínseca das tabelas.
2- A integridade relacional é garantida pelo Banco de Dados e não pelo aplicativo.
3- Exclusões ou Alterações em Chaves Primárias, podem acarretar exclusões, anulações ou até mesmo perda de integridade nas tabelas onde esta chave primária existir como chave estrangeira. Portanto é imprescindível muito cuidado quando da elaboração do Banco de Dados. Uma tentação muito comum ao estudante é começar criando as tabelas do Banco de Dados sem prévia Normalização. Este talvez seja o melhor caminho para perder-se tempo em vão, pois quando você terminar de projetar suas telas de entrada de dados, notará “que nada funciona!”. Esta será a senha para usar o velho comando DEL do DOS e depois começar tudo de novo …

Comando Drop

Este comando elimina a definição da tabela, seus dados e referências.

Sintaxe:
DROP TABLE < nome_tabela > ;

Ex:
DROP TABLE EMP;

Comando Alter

Este comando permite inserir/eliminar atributos nas tabelas já existentes.

Comando:
ALTER TABLE < nome_tabela > ADD / DROP (
nome_atributo1 < tipo > [ NOT NULL ],
nome_atributoN < tipo > [ NOT NULL ] ) ;

Não existe nenhum comando SQL que permita eliminar algum atributo de uma relação já definida. Assim caso você desejar eliminar uma chave primária devidamente referenciada em outra tabela como chave estrangeira, ao invés de obter a eliminação do campo, obterá apenas um erro.

Além do comando DROP que poderá eliminar uma tabela e suas relações, também podemos criar uma relação que tenha os atributos que se deseja, copiar-se a relação antiga sobre a nova e apgando-se então a relação que originalmente desejávamos eliminar.

Ex:
ALTER TABLE DEPT (
ADD DEPSALA DECIMAL (10,2) );

Exercício: Criar o Banco de Dados Mundo. Observar que se um continente for excluído, todos os países contidos em tal continente também o serão. Esta situação é conhecida como exclusão em Cascata. Observar também que a exclusão de um País eliminará todas as Cidades contidas no mesmo.

Prática

O Exemplo Trabalho já possue pequeno programa destinado a construção das tabelas contidas no Banco de Dados TRABALHO. Execute “trabalho.sql” de forma a obter as tabelas acima sem necessidade de digitar as instruções SQL de maneira interativa.

Para tanto, você deverá copiar para seu diretório de trabalho o arquivo “trabalho.sql” do diretório IDEOSQL.

Execute: “@trabalho;” que deverá:

– Criar o banco de dados Trabalho.
– Abrir o banco de dados Trabalho.
– Criar as Tabelas, Indices e Relações contidas neste Banco de Dados.

Posteriormente execute o comando “show tables”, que deverá exibir as tabelas “dept” e “emp”.
E ao executar “show fields dept” serão exibidos os campos da tabela “dept”.

Copie e execute enchetra.sql do diretório IDEOSQL de forma a obter um conjunto de dados preparados para os testes a seguir apresentados.

Na próxima etapa de nosso curso, estaremos realizando pesquisas utilizando a instrução Select. Julgamos conveniente que os estudantes populem seu exercício e realizem exercícios análogos aos apresentados na Base de Dados Trabalho no Banco de Dados Mundo.
Parte II – Comandos de Consulta ao Esquema

Devemos ressaltar que a linguagem SQL é utilizada tanto pelos profissionais responsáveis pelos dados, onde é ressaltada a figura do Administrador do Banco de Dados e dos Analistas de Dados, como também pelos desenvolvedores de Aplicações. Enquanto àqueles estão preocupados com o desempenho, integridade do Banco de Dados e utilizam toda gama de recusos disponíveis no SQL, estes estão preocupados apenas em “transformar dados em informações”, portanto para os desenvolvedores costuma-se dizer que conhecer o “select” já basta. Em nosso curso enfatizaremos a importância de TODOS os comandos do SQL, mas sabemos de antemão que os professores responsáveis pelas linguagens IDEO, VB e Delphi, ressaltarão a preponderância da instrução “select”, que será apresentada a seguir e não no final do curso de SQL como geralmente acontece, pelo fato de que diversas disciplinas necessitam especificamente deste comando, que passaremos a apresentar:

1) Seleção de todas os campos (ou colunas) da tabela de Departamentos.

Resp:
SELECT * FROM DEPT;

O exemplo utiliza o coringa “*” para selecionar as colunas na ordem em que foram criadas. A instrução Select, como pudemos observar seleciona um grupo de registros de uma (ou mais) tabela(s). No caso a instrução From nos indica a necessidade de pesquisarmos tais dados apenas na tabela Dept.

Where como base das Restrição de tuplas.

A cláusula “where” corresponde ao operador restrição da álgebra relacional. Contém a condição que as tuplas devem obedecer a fim de serem listadas. Ela pode comparar valores em colunas, literais, expressões aritméticas
ou funções.

A seguir apresentamos operadores lógicos e complementares a serem utilizados nas expressões apresentadas em where.

Operadores lógicos

operador significado
= igual a
> maior que
>= maior que ou igual a
< menor que
<= menor que ou igual a Exemplos:
SELECT EMPNOME, EMPSERV
FROM EMP
WHERE DEPNUME > 10;

SELECT EMPNOME, EMPSERV
FROM EMP
WHERE EMPSERV = ‘GERENTE’;

O conjunto de caracteres ou datas devem estar entre apóstrofes (‘) na cláusula “where”.

2) Selecione todos os departamentos cujo orçamento mensal seja maior que 100000. Apresente o Nome de tal departamento e seu orçamento anual, que será obtido multiplicando-se o orçamento mensal por 12.

Resp: Neste problema precisamos de uma expressão que é a combinação de um ou mais valores, operadores ou funções que resultarão em um valor. Esta expressão poderá conter nomes de colunas, valores numéricos, constantes e operadores aritméticos.

SELECT DEPNOME, DEPORCA * 12
FROM DEPT
WHERE DEPORCA > 100000;

3) Apresente a instrução anterior porém ao invés dos “feios” DepNome e DepOrca, os Títulos Departamento e Orçamento.

Resp: Neste exemplo deveremos denominar colunas por apelidos. Os nomes das colunas mostradas por uma consulta, são geralmente os nomes existentes no Dicionário de Dado, porém geralmente estão armazenados na forma do mais puro “informatiquês”, onde “todo mundo” sabe que CliCodi significa Código do Cliente. É possível (e provável) que o usuário desconheça estes símbolos, portanto devemos os apresentar dando apelidos às colunas “contaminadas” pelo informatiquês, que apesar de fundamental para os analistas, somente são vistos como enigmas para os usuários.

SELECT DEPNOME “DEPARTAMENTO”, DEPORCA * 12 “ORCAMENTO ANUAL”
FROM DEPT
WHERE DEPORCA > 100000;

4) Apresente todos os salários existentes na empresa, porém omita eventuais duplicidades.

Resp: A cláusula Distinct elimina duplicidades, significando que somente relações distintas serão apresentadas como resultado de uma pesquisa.

SELECT DISTINCT EMPSERV
FROM EMP;

5) Apresente todos os dados dos empregados, considerando sua existência física diferente de sua existência lógica (ou seja devidamente inicializado).

Resp: Desejamos um tratamento diferenciado para valores nulos. Qualquer coluna de uma tupla que não contenha informações é denominada de nula, portanto informação não existente. Isto não é o mesmo que “zero”, pois zero é um número como outro qualquer, enquanto que um valor nulo utiliza um “byte” de armazenagem interna e são tratados de forma diferenciada pelo SQL.

SELECT EMPNOME, EMPSALA + EMPCOMI
FROM EMP;

SELECT EMPNOME, NVL(EMPSALA,0) + NVL(EMPCOMI,0)
FROM EMP;

Obs: a função “NVL” é utilizada para converter valores nulos em zeros.

6) Apresente os nomes e funções da cada funcionário contidos na tabela empresa, porém classificados alfabeticamente (A..Z) e depois alfabeticamente invertido (Z..A).

Resp: A cláusula Order By modificará a ordem de apresentação do resultado da pesquisa (ascendente ou descendente).

SELECT EMPNOME, EMPSERV
FROM EMP
ORDER BY EMPNOME;

SELECT EMPNOME, EMPSERV
FROM EMP
ORDER BY EMPPNOME DESC;

Nota: Também é possível fazer com que o resultado da pesquisa venha classificado por várias colunas. Sem a claúsula “order by” as linhas serão exibidas na sequência que o SGBD determinar.

7) Selecione os Nomes dos Departamentos que estejam na fábrica.

Resp:
SELECT DEPNOME
FROM DEPT
WHERE DEPLOCA = “SAO PAULO”;

O exemplo exigiu uma restrição (São Paulo) que nos obrigou a utilizar da instrução Where. Alguns analistas costumam afirmar em tom jocoso que SQL não passa de

“Selecione algo De algum lugar Onde se verificam tais relações”

Acreditamos que esta brincadeira pode ser útil ao estudante, na medida em que facilita sua compreensão dos objetivos elementares do SQL.

Demais Operadores

Operador Significado
between … and … entre dois valores ( inclusive )
in ( …. ) lista de valores
like com um padrao de caracteres
is null é um valor nulo

Exemplos:
SELECT EMPNOME, EMPSALA
FROM EMP
WHERE EMPSALA BETWEEN 500 AND 1000;

SELECT EMPNOME, DEPNUME
FROM EMP
WHERE DEPNUME IN (10,30);

SELECT EMPNOME, EMPSERV
FROM EMP
WHERE EMPNOME LIKE ‘F%’;

SELECT EMPNOME, EMPSERV
FROM EMP
WHERE EMPCOMI IS NULL;

O símbolo “%” pode ser usado para construir a pesquisa (“%” = qualquer sequência de nenhum até vários caracteres).

Operadores Negativos

operador descrição
<> diferente
not nome_coluna = diferente da coluna
not nome_coluna > não maior que
not between não entre dois valores informados
not in não existente numa dada lista de valores
not like diferente do padrao de caracteres informado
is not null não é um valor nulo

8) Selecione os Empregados cujos salários sejam menores que 1000 ou maiores que 3500.

Resp: Necessitaremos aqui a utilização de expressão negativas. A seguir apresentamos operadores negativos.

SELECT EMPNOME, EMPSALA
FROM EMP
WHERE EMPSALA NOT BETWEEN 1000 AND 3500;

9) Apresente todos os funcionários com salários entre 200 e 700 e que sejam Vendedores.

Resp: Necessitaremos de consultas com condições múltiplas.

Operadores “AND” (E) e “OR” (OU).

SELECT EMPNOME, EMPSALA, EMPSERV
FROM EMP
WHERE EMPSALA BETWEEN 700 AND 2000
AND EMPSERV = ‘VENDEDOR’;

10) Apresente todos os funcionários com salários entre 200 e 700 ou que sejam Vendedores.

Resp:
SELECT EMPNOME, EMPSALA, EMPSERV
FROM EMP
WHERE EMPSALA BETWEEN 700 AND 2000
OR EMPSERV = ‘VENDEDOR’;
11) Apresente todos os funcionários com salários entre 200 e 700 e que sejam Vendedores ou Balconistas.

Resp:
SELECT EMPNOME, EMPSALA, EMPSERV
FROM EMP
WHERE EMPSALA BETWEEN 700 AND 2000
AND ( EMPSERV = ‘BALCONISTA’ OR EMPSERV = ‘VENDEDOR’ );

Funções de Caracteres

Lower – força caracteres maiúsculos aparecerem em minúsculos.
Upper – força caracteres minúsculos aparecerem em maiúsculos.
Concat(x,y)- concatena a string “x” com a string “y”.
Substring(x,y,str)- extrai um substring da string “str”, começando em “x”, e termina em “y”.
To_Char(num)- converte um valor numérico para uma string de caracteres.
To_Date(char,fmt)- converte uma string caracter em uma data.
^Q – converte data para o formato apresentado.

12) Apresente o nome de todos os empregados em letras minúsculas.

Resp:
SELECT LOWER( EMPNOME )
FROM EMP;

13) Apresente o nome de todos os empregados (somente as 10 primeiras letras).

Resp:
SELECT SUBSTRING (1,10,EMPNOME)
FROM EMP;

14) Apresente o nome de todos os empregados admitidos em 01/01/80.

Resp:
SELECT *
FROM EMP
WHERE EMPADMI = ^Q”DD-AAA-YYYY”(“01-JAN-1980”);
ou

SELECT *
FROM EMP
WHERE EMPADMI = ^Q(“01-JAN-1980”);

Funções Agregadas (ou de Agrupamento)

função retorno
avg(n) média do valor n, ignorando nulos
count(expr) vezes que o número da expr avalia para algo nao nulo
max(expr) maior valor da expr
min(expr) menor valor da expr
sum(n) soma dos valores de n, ignorando nulos

15) Apresente a Média, o Maior, o Menor e também a Somatória dos Salários pagos aos empregados.

Resp:
SELECT AVG(EMPSALA) FROM EMP;

SELECT MIN(EMPSALA) FROM EMP;

SELECT MAX(EMPSALA) FROM EMP;

SELECT SUM(EMPSALA) FROM EMP;

Agrupamentos

As funções de grupo operam sobre grupos de tuplas(linhas). Retornam resultados baseados em grupos de tuplas em vez de resultados de funções por tupla individual. A claúsula “group by” do comando “select” é utilizada para dividir tuplas em grupos menores.

A cláusula “GROUP BY” pode ser usada para dividir as tuplas de uma tabela em grupos menores. As funções de grupo devolvem uma informação sumarizada para cada grupo.

16) Apresente a média de salário pagos por departamento.

Resp:
SELECT DUPNUME, AVG(EMPSALA)
FROM EMP
GROUP BY DEPNUME;

Obs.: Qualquer coluna ou expressão na lista de seleção, que não for uma função agregada, deverá constar da claúsula “group by”. Portanto é errado tentar impor uma “restrição” do tipo agregada na cláusula Where.

Having

A cláusula “HAVING” pode ser utilizada para especificar quais grupos deverão ser exibidos, portanto restringindo-os.

17) Retome o problema anterior, porém apresente resposta apenas para departamentos com mais de 10 empregados.

Resp:
SELECT DEPNUME, AVG(EMPSALA)
FROM EMP
GROUP BY DEPNUME
HAVING COUNT(*) > 3;

Obs.: A claúsula “group by” deve ser colocada antes da “having”, pois os grupos são formados e as funções de grupos são calculadas antes de se resolver a cláusula “having”.

A cláusula “where” não pode ser utilizada para restringir grupos que deverão ser exibidos.

Exemplificando ERRO típico – Restringindo Média Maior que 1000:

SELECT DEPNUME, AVG(EMPSALA)
FROM EMP
WHERE AVG(SALARIO) > 1000
GROUP BY DEPNUME;
( Esta seleção está ERRADA! )

SELECT DEPNUME, AVG(EMPSALA)
FROM EMP
GROUP BY DEPNUME
HAVING AVG(EMPSALA) > 1000;
( Seleção Adequada )

Seqüência no comando “Select”:

SELECT coluna(s)
FROM tabela(s)
WHERE condição(ões) da(s) tupla(s)
GROUP BY condição(ões) do(s) grupo(s) de tupla(s)
HAVING condição(ões) do(s) grupo(s) de tupla(s)
ORDER BY coluna(s);

A “sql” fará a seguinte avaliação:

a) WHERE, para estabelecer tuplas individuais candidatas (não pode conter funções de grupo)
b) GROUP BY, para fixar grupos.
c) HAVING, para selecionar grupos para exibiçao.

Equi-Junção ( Junção por igualdade )

O relacionamento existente entre tabelas é chamado de equi-junção, pois os valores de colunas das duas tabelas são iguais. A Equi-junção é possível apenas quando tivermos definido de forma adequada a chave estrangeira de uma tabela e sua referência a chave primária da tabela precedente. Apesar de admitir-se em alguns casos, a equi-junção de tabelas, sem a correspondência Chave Primária-Chave Estrangeira, recomendamos fortemente ao estudante não utilizar este tipo de construção, pois certamente em nenhum momento nos exemplos propostos em nossa disciplina ou nas disciplinas de Análise e Projeto de Sistemas, serão necessárias tais junções.
18) Listar Nomes de Empregados, Cargos e Nome do Departamento onde o empregado trabalha.

Resp: Observemos que dois dos três dados solicitados estão na Tabela Emp, enquanto o outro dado está na Tabela Dept. Deveremos então acessar os dados restringindo convenientemente as relações existentes entre as tabelas. De fat

SQL – Apostila 2

0

Autoria: Bernardo Gomes

FINALIDADE DO CAPITULO:

No final deste capitulo você será capaz de criar scripts permitindo que o usuário entre com valores diversos.

A finalidade dos exemplos abaixo é demostrar como permitir que o usuário entre com os valores que possibilitem a execução de um comando SQL, isso tudo em tempo de execução.
Verifique o uso do “&” que permite que o usuário entre com dados. No exemplo abaixo temos um pedido de entrada de um numero, por isso é que o &numero_do_dept não está entre aspas. Podemos notar também que aparece o old valor e o new valor, isso é devido ao cmdo set verify on, se quisermos que não apareça, devemos usar o set verify off.

Vamos ao Exemplo:

SQL> set verify on
SQL> select id,last_name,salary
2 from s_emp
3 where dept_id=&numero_do_dept;
Enter value for numero_do_dept: 31
old 3: where dept_id=&numero_do_dept
new 3: where dept_id=31

ID LAST_NAME SALARY




3 Nagayama 1400
11 Magee 1400

Agora não aparecerá o new e old valor porque estamos usando o SET VERIFY OFF.

SQL> set verify off
SQL> select id,last_name,salary
2 from s_emp
3 where dept_id=&numero_do_dept;
Enter value for numero_do_dept: 31

ID LAST_NAME SALARY




3 Nagayama 1400
11 Magee 1400

Vimos anteriormente como que temos que proceder para que o usuário entre com valores numéricos, para que seja realizada
uma pesquisa, agora vamos possibilitar que o usuário ente com valores do tipo caracter, a principal diferença é o uso das aspas, mas temos que ter atenção para o formato na hora de digitarmos, porque tem que ser o mesmo do conteúdo que está na tabela, com maiúsculas e minúsculas.

Vamos ao Exemplo:

SQL> select id,last_name,salary
2 from s_emp
3 where title =’&job_title’; {possibilitando que o
usuário entre com o nome do title}
Enter value for job_title: Stock Clerk

ID LAST_NAME SALARY




16 Maduro 1400
17 Smith 940
18 Nozaki 1200
19 Patel 795
20 Newman 750
21 Markarian 850
22 Chang 800
23 Patel 795
24 Dancs 860
25 Schwartz 1100

10 rows selected.

Nos exemplos anteriores o usuário entrou com a condição de pesquisa quer seja numérica ou caracter, cada qual com suas características, agora vamos ver como que possibilitamos ao usuário entrar com o nome da coluna e com a própria condição de pesquisa que será estabelecida na cláusula WHERE. Neste caso temos um exemplo onde é requerida a entrada de um dado numérico.

Vamos ao exemplo:

SQL> select id,&nome_coluna
2 from s_emp
3 where &condição;
Enter value for nome_coluna: LAST_NAME
Enter value for condição: SALARY > 100

ID LAST_NAME



1 Velasquez
2 Ngao
3 Nagayama
4 Quick-To-See
5 Ropeburn
6 Urguhart
7 Menchu
8 Biri
Temos um outro exemplo em que o usuário entra com o valor da coluna e da condição da WHERE.

SQL> select id,&nome_coluna
2 from s_ord
3 where &condição;
Enter value for nome_coluna: date_ordered
Enter value for condição: total>30000

ID DATE_ORDE



100 31-AUG-92
104 03-SEP-92
107 07-SEP-92
108 07-SEP-92
109 08-SEP-92
97 28-AUG-92

6 rows selected.

CONSTRUINDO SCRIPTS USANDO OPÇÕES PARA O USUÁRIO ENTRE COM DADOS E TAMBÉM PARA SÓ MOSTRAR NA TELA O PROMPT.

No exemplo abaixo estamos usando os seguintes comandos que na da mais é do que a soma de tudo aquilo que vimos neste capitulo mas também algo mais:
O cmdo SET ECHO OFF serve para em tempo de execução não se exiba os comandos do SQL e SET ECHO ON serve para retornar a forma anterior.
O cmdo ACCEPT serve para que preparemos um PROMPT para receber um valor.
Neste exemplo também temos a criação de uma variável chamada V_NAME que recebe valores.
Estamos preparando o ambiente para receber valores que serão armazenados dentro de uma variável, para após isto, serem feitas comparações dentro da cláusula WHERE.
Estamos usando duas tabelas S_DEPT e S_REGION, o AND é uma função onde complementa a cláusula WHERE, e o UPPER no DPT.NAME está passando o conteúdo do nome do dept para maiúsculo para que seja efetuada a comparação com um nome que será digitado pelo usuário, que por sua vez recebe um UPPER que o transforma em maiúsculo. Essa alternativa é feita
porque não sabemos qual é o formato do dado na tabela.

Vamos ao exemplo:

SET ECHO OFF
ACCEPT V_NAME PROMPT ‘DÊ O NOME DO DEPARTAMENTO:’
SELECT DPT.NAME, REG.ID, REG.NAME ” NOME DA REGIÃO”
FROM S_DEPT DPT, S_REGION REG {veja a criação de apelidos}
WHERE DPT.REGION_ID = REG.ID {veja o join}
AND UPPER(DPT.NAME) LIKE UPPER(‘%&V_NAME%’) {valor digitado }
/
SET ECHO ON

Como estamos gerando um SCRIPT, os comandos devem ficar armazenados dentro de um arquivo que possua a extensão SQL e preparado da forma descrita acima quando estivermos no SQL e desejarmos executar o nosso SCRIPT temos que seguir o procedimento descrito abaixo, usando “@” e o nome do arquivo, ou ” START” e o nome do arquivo.

Vamos ao exemplo:

SET ECHO ON
SQL> @TEST.SQL
SQL> SET ECHO OFF
DÊ O NOME DO DEPARTAMENTO:sales
old 4: AND UPPER(DPT.NAME) LIKE UPPER(‘%&V_NAME%’)
new 4: AND UPPER(DPT.NAME) LIKE UPPER(‘%sales%’)

NAME ID NOME DA REGIÃO




Sales 1 North America
Sales 2 South America
Sales 3 África / Middle East
Sales 4 Ásia
Sales 5 Europe

Podemos notar que por ocasião da execução o exemplo anterior mostrou o OLD e o NEW valores da variável, para não mostrar temos que usar o SET VERIFY OFF veja abaixo:

Vamos ao exemplo:

SET VERIFY OFF
SET ECHO OFF
ACCEPT V_NAME PROMPT ‘DÊ O NOME DO DEPARTAMENTO:’
SELECT DPT.NAME, REG.ID, REG.NAME ” NOME DA REGIÃO”
FROM S_DEPT DPT, S_REGION REG
WHERE DPT.REGION_ID = REG.ID
AND UPPER(DPT.NAME) LIKE UPPER(‘%&V_NAME%’)
/
SET ECHO ON

Executando o SCRIPT:

SQL> START TEST.SQL
SQL> SET VERIFY OFF
SQL> SET ECHO OFF
DÊ O NOME DO DEPARTAMENTO:SALES

NAME ID NOME DA REGIÃO




Sales 1 North America
Sales 2 South America
Sales 3 Africa / Middle East
Sales 4 Ásia
Sales 5 Europe

Input truncated to 11 characters

OUTRO EXEMPLO DE GERAÇÃO DE SCRIPT:

Mais uma vez vamos usar alguns comandos já vistos em exemplos anteriores, mas também alguns comandos novos e precisamos
Mostrar a descrição de tais comandos:
O comando SET ECHO OFF tem a finalidade de não deixar aparecer os cmdos feitos para a execução.
O cmdo VERIFY OFF tem a finalidade de não mostrar os valores recebidos pelas as variáveis que no exemplo em questão são MENOR_DT e MAIOR_DT.
O ACCEPT é usado para criar variáveis e o PROMPT para receber valores para as variáveis.
Criadas as variáveis, observe a sintaxe e o “-” entre a definição do formato de data o uso de DATE, o FORMAT e a especificação ‘MM/DD/YY’.
Estamos usando também o COLUMN FORMAT A30 para formatar o tamanho da coluna EMPREGADO e logo depois estamos concatenando as colunas FIRST_NAME e LAST_NAME.
Estamos também usando o BETWEEN para pesquisarmos valores que estão entre uma data e outra.
Observe o uso do TO_DATE antes da colocação da variável com o “&” para receber valores que o usuário digita, e observe também a forma que foi colocado o formato da data ‘MM/DD/YY’ e o uso do AND que faz parte da WHERE.
O UNDEFINE serve para que as variáveis percam os valores após a execução.

Vamos ao Exemplo:

SET ECHO OFF
SET VERIFY OFF

ACCEPT MENOR_DT DATE FORMAT ‘MM/DD/YY’ –
PROMPT ‘ENTRE MENOR DATA (MM/DD/AA) :’
ACCEPT MAIOR_DT DATE FORMAT ‘MM/DD/YY’ –
PROMPT ‘ENTRE MAIOR DATA (MM/DD/AA) :’
COLUMN EMPREGADO FORMAT A30
SELECT USERID,FIRST_NAME||’ ‘||LAST_NAME “EMPREGADO”,
START_DATE FROM S_EMP
WHERE START_DATE BETWEEN TO_DATE(‘&MENOR_DT’,’MM/DD/YY’)
AND TO_DATE(‘&MAIOR_DT’,’MM/DD/YY’)

/
UNDEFINE MENOR_DT
UNDEFINE MAIOR_DT
COLUMN EMPREGADO CLEAR
SET ECHO ON
SET VERIFY ON

OUTRO EXEMPLO DE SCRIPT:

Estamos montando um script com a finalidade de receber um valor que pesquise registros, no caso estamos querendo pesquisar o ID e o NOME de um CUSTOMER e para isso recebendo um dos nomes do CUSTOMER, por isso estamos usando o LIKE e “%&NOME%” estamos transformando a coluna NAME da tabela a ser pesquisada em maiúsculo para que qualquer nome que seja digitado em maiúsculo seja pesquisado.
Está sendo criado a variável NOME pelo ACCEPT e o PROMPT possibilita a recepção de um valor, observe a sintaxe “-” após a variável NOME.

Vamos ao exemplo:

SET ECHO OFF
SET VERIFY OFF
ACCEPT NOME –
PROMPT ‘ ENTRE COM O NOME DESEJADO :’
SELECT ID, NAME FROM S_CUSTOMER
WHERE UPPER(NAME) LIKE ‘%&NOME%’
/
SET ECHO ON
SET VERIFY ON

FINAL DE CAPITULO

FINALIDADE DO CAPITULO:
O COMANDO ALTER TABLE E SUAS VARIAÇÕES:

Adicionado uma coluna em uma tabela:

No exemplo a seguir estamos usando o cmdo ALTER TABLE para adicionar uma coluna em uma tabela, a coluna adicionada a tabela sempre será a última, importante saber que não podemos deletar uma coluna de uma tabela mas somente adicionar, se precisarmos dropar uma coluna a solução é dropar a tabela e recriá – la sem a coluna.
Vamos ao exemplo:

SQL> ALTER TABLE S_REGION
ADD (comments VARCHAR(255));

Table altered.

O COMD MODIFY:

No exemplo abaixo estamos modificando uma coluna usando o comando modify, no caso estamos aumentando o tamanho da coluna title para 50, é permitido aumentar o tamanho da coluna mas diminuir não é permitido.

SQL> ALTER TABLE s_emp
2 MODIFY (title VARCHAR(50));

Table altered.

ADCIONANDO UMA CONSTRAINT:

Para adicionarmos uma constraint temos que usar O ALTER TABLE
criar um nome para nossa constraint no caso’s_emp_maneger_id_fk’, escrevendo de onde ela é colocando a referência com o id de s_emp.

Vamos ao exemplo:

SQL>
ALTER TABLE s_emp
ADD CONSTRAINT s_emp_manager_id_fk
FOREIGN KEY (MANAGER_ID)
REFERENCES s_emp(id)

DROPANDO UMA CONSTRAINT:
Este exemplo mostra como dropar uma CONSTRAINT, Neste caso o nome da constraint é s_emp_maneger_id_fk, verifique a forma como foi escrito o exemplo abaixo:

SQL> ALTER TABLE S_EMP
2 DROP CONSTRAINT s_emp_manager_id_fk;

Table altered.

DROPANDO REGISTROS EMCACATA:
Para dropar uma chave primaria em cascata ou seja, deletá – la de forma que seja deletada em todas as tabelas com quem tenha relação, temos prosseguir da seguinte forma:

Vamos ao exemplo:

SQL> ALTER TABLE s_dept
2 DROP primary key cascade; {observe o cmdo cascade}

Table altered.

Desabilitando CONSTRAINTS de uma tabela:

Verifique o cmdo CACADE sendo usado no ALTER TABLE, a finalidade de seu uso é permitir que todos os objetos que fazem referência ao campo ID de S_EMP aceitem a desabilitação da constraint.

Vamos ao exemplo:

SQL> ALTER TABLE s_emp
2 DISABLE CONSTRAINT s_emp_id_pk CASCADE;

Table altered.

Habilitando uma constraint:

Para habilitarmos uma constraint não precisamos usar o cmdo cascade, porque é criada de forma automática
a UK ou FK.

Vamos ao exemplo
SQL> ALTER TABLE s_emp
2 ENABLE CONSTRAINT s_emp_id_pk;

Table altered.

FINAL DE CAPITULO

FINALIDADE DO CAPITULO:

O COMANDO SELECT TO_CHAR:

O exemplo abaixo temos um select que está selecionando id,date_ordered da tabela s_ord onde o sales_rep_id é igual a 11, podemos notar que a date_ordered(data) é igual ao formato de data padrão do oracle, ou seja, mês por extenso abreviado e o ano com os dois últimos números do ano.

Vamos ao exemplo:

SQL> SELECT ID,DATE_ORDERED
2 FROM S_ORD
3 WHERE
4 SALES_REP_ID = 11;

ID DATE_ORDE



100 31-AUG-92
105 04-SEP-92
109 08-SEP-92
110 09-SEP-92
111 09-SEP-92

No exemplo abaixo estamos com o comando ” to_char ” mudando
o formato da data para o modelo que nós estamos querendo mostrar em tela, ou seja, estamos mudando o formato padrão do oracle para um novo formato correspondente ao que queremos, no caso ‘mm/yy’ que corresponde ao mês e o ano.

Vamos ao exemplo:

SQL> SELECT ID,TO_CHAR(DATE_ORDERED,’MM/YY’) ORDERED
2 FROM S_ORD
3 WHERE SALES_REP_ID = 11;

ID ORDERED



100 08/92
105 09/92
109 09/92
110 09/92
111 09/92

Agora vamos converter a data colocando o dia por extenso ou seja usando, “day”(extenso), para o dia e colocando o mês por extenso usando, “month” para mês e colocando o ano por extenso usando o “yyyy” para ano.

Vamos ao Exemplo:

SELECT ID,TO_CHAR(DATE_ORDERED,’DAY/MONTH/YYYY’) ORDERED
FROM S_ORD
WHERE SALES_REP_ID = 11

ID ORDERED


100 MONDAY /AUGUST /1992
105 FRIDAY /SEPTEMBER/1992
109 TUESDAY /SEPTEMBER/1992
110 WEDNESDAY/SEPTEMBER/1992
111 WEDNESDAY/SEPTEMBER/1992

Agora estamos colocando o nome da ano escrito por extenso usando a FUNÇÃO “YEAR”.

SELECT ID,TO_CHAR(DATE_ORDERED,’DAY/MONTH/YEAR’) ORDERED
FROM S_ORD
WHERE SALES_REP_ID = 11;

ID ORDERED
—-


100 MONDAY /AUGUST /NINETEEN NINETY-TWO
105 FRIDAY /SEPTEMBER/NINETEEN NINETY-TWO
109 TUESDAY /SEPTEMBER/NINETEEN NINETY-TWO
110 WEDNESDAY/SEPTEMBER/NINETEEN NINETY-TWO
111 WEDNESDAY/SEPTEMBER/NINETEEN NINETY-TWO

Agora estamos usando o cmdo ” dy ” para mudar o dia da semana, passando da escrita por extenso para abreviado em três dígitos, observe o exemplo.

Vamos ao exemplo:

SQL> SELECT ID,TO_CHAR(DATE_ORDERED,’DY/MONTH/YEAR’) ORDERED
2 FROM S_ORD
3 WHERE SALES_REP_ID = 11;

ID ORDERED



100 MON/AUGUST /NINETEEN NINETY-TWO
105 FRI/SEPTEMBER/NINETEEN NINETY-TWO
109 TUE/SEPTEMBER/NINETEEN NINETY-TWO
110 WED/SEPTEMBER/NINETEEN NINETY-TWO
111 WED/SEPTEMBER/NINETEEN NINETY-TWO

O exemplo abaixo demostra como colocar o dia em formato numérico “FMDD” e o mês e o ano por extenso.

Select LAST_NAME, TO_CHAR(START_DATE,’FMDD “OF” MONTH YYYY’) HIREDATE
FROM S_EMP
WHERE START_DATE LIKE ‘%91’

LAST_NAME


HIREDATE


Nagayama
17 OF JUNE 1991

Urguhart
18 OF JANUARY 1991

Havel
27 OF FEBRUARY 1991

Sedeghi
18 OF FEBRUARY 1991

Dumas
09 OF OCTOBER 1991

Nozaki
09 OF FEBRUARY 1991

Patel

LAST_NAME


HIREDATE


06 OF AUGUST 1991

Newman
21 OF JULY 1991

Markarian
26 OF MAY 1991

Dancs
17 OF MARCH 1991

Schwartz
09 OF MAY 1991

No exemplo abaixo estamos usando a função to_char novamente, agora para formatarmos um numero e concatenarmos uma coluna numérica com um comentário caracter.

Vamos ao Exemplo:

SQL>
SELECT ‘O PEDIDO ‘ ||TO_CHAR(ID)||’
TEM UM TOTAL DE: ‘||TO_CHAR(TOTAL,’FM$9,999,999’)
FROM S_ORD
WHERE DATE_SHIPPED =’21-SEP-92′
/

‘OPEDIDO’||TO_CHAR(ID)||’TEMUMTOTALDE:’||TO_CHAR(TOTAL,’FM$9,999,999’)


O PEDIDO 107
TEM UM TOTAL DE: $142,171

O PEDIDO 110
TEM UM TOTAL DE: $1,539

O PEDIDO 111
TEM UM TOTAL DE: $2,770

FINAL DE CAPÍTULO.

Finalidade do Capitulo:
Demostrar o uso do Comando TO_DATE.

Verifique que no exemplo abaixo estamos querendo fazer uma pesquisa usando um campo data onde escrevemos a data, o mês e o ano e o cmdo to_date transforma o que digitamos em data para a pesquisa, só que deve ser obedecida uma seqüência lógica nas posições por isso o exemplo abaixo está incorreto.

Vamos ao exemplo:

SQL> SELECT DATE_ORDERED
2 FROM S_ORD
3 WHERE DATE_ORDERED =
4 TO_DATE(’31 1992, AUGUST’,’DD MONTH, YYYY’);
ERROR:
ORA-01843: not a valid month

Vamos tentar corrigir o exemplo acima. A função do cmdo to_date é converter valores digitados, numéricos e caracters
para data, a ordem da data procurada no exemplo abaixo tem que ser a mesma do formato de data colocado da seguinte forma:

SQL> SELECT DATE_ORDERED
2 FROM S_ORD
3 WHERE DATE_ORDERED =
4 TO_DATE(’31 1992, AUGUST’,’DD, YYY MONTH’);

DATE_ORDE


31-AUG-92
31-AUG-92
31-AUG-92
31-AUG-92
31-AUG-92

FINAL DE CAPÍTULO
Finalidade do Capítulo:
Demostrar o uso dos comandos COMMIT,ROLLBACK E SAVE POINT.

Os cmdos COMMIT , ROLLBACK e SAVE POINT são usados para controle de execução, de confirmação e de retorno.Veja abaixo que estamos alterando o valor de SALARY na tabela S_EMP usando o UPDATE e SET, após alterá-los nós criamos um SAVEPOINT, que serve simplesmente para o controle de ponto, para se quisermos dar um ROLLBACK nas alterações feitas até então, termos condições de limitar o espaço atingindo pelo ROLLBACK.

Vamos ao Exemplo de Update:

SQL> EDIT
Wrote file afiedt.buf
1 UPDATE S_EMP
2 SET SALARY = SALARY * 1.1
3* WHERE TITLE =’Stock Clerk’
SQL> /

10 rows updated.

Agora vamos criar um SAVEPOINT.

Vamos ao Exemplo:

SQL> savepoint update_ponto;

Savepoint created.

Agora usando o cmdo INSERT INTO estamos inserindo registros
na tabela s_region.

SQL> insert into s_region (id,name)
2 values (8,’central’);

1 row created.

Estamos selecionando os registros de s_region para confirmamos a inserção ou seja, se realmente foi incluído registros nesta tabela.

SQL> select * from
2 s_region
3 where id = 8;

ID NAME



8 central

Agora após confirmarmos a inclusão dos registros, nós decidirmos que não queremos que seja incluído registros na referida tabela s_region e para voltarmos a nossa ação temos então que dar um ROLLBACK, para desfazer o INSERT, só que somente até o ponto da inserção, ou seja até o SAVE POINT, que foi criado anteriormente ou seja tudo que está antes do SAVE POINT continua com suas alterações preservadas, é bom observar que para o SAVE POINT foi criado um nome no caso UPDATE_PONTO, isso serve para que possamos referenciar de forma correta até que ponto queremos cancelar nossas ações ou seja até que ponto não queremos que sejam salvas nossas ações.

Vamos ao exemplo:

SQL> ROLLBACK TO UPDATE_PONTO;

Rollback complete.

Agora vamos dar novamente um select para confirmarmos se o nosso ROLLBACK realmente fez efeito, observe que as alterações feitas anteriormente não foram concretizadas.

SQL> select * from
2 s_region
3 where id = 8;

no rows selected

O CMDO ROLLBACK serve para que seja desfeitas as alterações que foram efetuadas em uma tabela.

Vamos ao exemplo:

SQL> delete from test;
25,000 rows deleted

para cancelar o DELETE na tabela test.

SQL> ROLLBACK;
Rollback complete.

O uso do COMMIT:

O CMDO COMMIT é o contrário do ROLLBACK ou seja serve para confirmar as alterações que por ventura sejam feitas. Uma vez dado um COMMIT não podemos retornar mais atrás.

SQL> delete from test;
25,000 rows deleted

Vamos confirmar o DELETE com o COMMIT.

SQL> COMMIT;
Commit complete.

FINAL DE CAPÍTULO
Finalidade do Capítulo é demostrar como criar comentários
a respeito de tabelas.

O comentários criado a respeito de tabelas e colunas são armazenados no dicionário de dados em:
ALL_COL_COMMENTS
USER_COL_COMMENTS
ALL_TAB_COMMENTS
USER_TAB_COMMENTS

Criando comentários para uma tabela:

SQL> COMMENT ON TABLE s_emp is ‘ informação sobre funcionário’;

Comment created.

Como criar comentários para uma coluna:

SQL> COMMENT ON COLUMN s_emp.last_name IS ‘ ultimo’;

Comment created.COMMENT ON COLUMN s_emp.last_name IS ‘ último’

Como verificar os comentários existentes dentro de uma tabela ou coluna:

Primeiramente vamos verificar os comentários relativos as colunas pertencentes a uma tabela all_col_comments, para depois realizarmos um select em seu conteúdo pesquisando pelo nome da tabela ou coluna para sabermos qual é o comentário específico a respeito.

SQL> desc all_col_comments
Name Null? Type



—-
OWNER NOT NULL VARCHAR2(30)
TABLE_NAME NOT NULL VARCHAR2(30)
COLUMN_NAME NOT NULL VARCHAR2(30)
COMMENTS VARCHAR2(2000)

Vamos realizando um SELECT ALL_COL_COMMENTS para vermos quais os comentários relativos a todas as colunas da tabela s_emp que são armazenados em COMMENTS :

SQL> select COMMENTS
2 from all_col_comments
3 where TABLE_NAME = ‘S_EMP’;

COMMENTS


ultimo

COMMENTS



Agora queremos saber o comentário a respeito da tabela s_emp veja abaixo:

SQL> SELECT COMMENTS
2 FROM ALL_TAB_COMMENTS
3 WHERE TABLE_NAME =’S_EMP’;

COMMENTS



informação sobre funcionário

FIM DE CAPÍTULO
Finalidade do Capítulo Tratar de Assuntos Relativos a Constraints.

Vamos ver como verificar as constraints de uma tabela
O seus tipos e nomes ou seja se é not null, se é foreing key,unique key ou primary key.

SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, SEARCH_CONDITION,
2 R_CONSTRAINT_NAME
3 FROM USER_CONSTRAINTS
4 WHERE TABLE_NAME = ‘S_DEPT’;

CONSTRAINT_NAME C



SEARCH_CONDITION


R_CONSTRAINT_NAME


S_DEPT_ID_NN C
ID IS NOT NULL

S_DEPT_NAME_NN C
NAME IS NOT NULL

S_DEPT_ID_PK P

S_DEPT_NAME_REGION_ID_UK U

S_DEPT_REGION_ID_FK R



S_REGION_ID_PK

Para vermos o nome das colunas envolvidas com constraints e seus respectivos nomes naturais temos que fazer um select na tabela user_cons_columns conforme o exemplo a seguir:

SQL> SELECT CONSTRAINT_NAME, COLUMN_NAME
2 FROM USER_CONS_COLUMNS
3 WHERE TABLE_NAME = ‘S_DEPT’;

CONSTRAINT_NAME COLUMN_NAME



S_DEPT_ID_NN ID
S_DEPT_ID_PK ID
S_DEPT_NAME_NN NAME
S_DEPT_NAME_REGION_ID_UK NAME
S_DEPT_NAME_REGION_ID_UK REGION_ID
S_DEPT_REGION_ID_FK REGION_ID

6 rows selected.

FINAL DE CAPÍTULO
Finalidade do Capítulo é o Uso do Create, Drop Table.

O comando DROP é usado para deletar a tabela ou seja, apagá-la fisicamente.
O comando CREATE é usado na criação de tabelas e o INSERT na inserção de dados em tabelas.

Vamos ao exemplo de como DROPAR uma tabela, VIEW ou SEQUENCE:

DROP TABLE EMP;
DROP TABLE DEPT;
DROP TABLE BONUS;
DROP TABLE SALGRADE;
DROP TABLE DUMMY;
DROP TABLE ITEM;
DROP TABLE PRICE;
DROP TABLE PRODUCT;
DROP TABLE ORD;
DROP TABLE CUSTOMER;
DROP VIEW SALES;
DROP SEQUENCE ORDID;
DROP SEQUENCE CUSTID;
DROP SEQUENCE PRODID;

Vamos ao exemplo de como criar uma tabela, observe os detalhes em relação aos parênteses, nome das colunas ,data type e constraints.

CREATE TABLE DEPT (
DEPTNO NUMBER(2) NOT NULL,
DNAME CHAR(14),
LOC CHAR(13),
CONSTRAINT DEPT_PRIMARY_KEY PRIMARY KEY (DEPTNO));

Após criarmos a tabela vamos inserir dados a mesma, em um comando INSERT

INSERT INTO DEPT VALUES (10,’ACCOUNTING’,’NEW YORK’);
INSERT INTO DEPT VALUES (20,’RESEARCH’,’DALLAS’);
INSERT INTO DEPT VALUES (30,’SALES’,’CHICAGO’);
INSERT INTO DEPT VALUES (40,’OPERATIONS’,’BOSTON’);

CREATE TABLE EMP
( EMPNO NUMBER(4) NOT NULL,
ENAME CHAR(10),
JOB CHAR(9),
MGR NUMBER(4) CONSTRAINT EMP_SELF_KEY REFERENCES EMP (EMPNO),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2) NOT NULL,
CONSTRAINT EMP_FOREIGN_KEY FOREIGN KEY (DEPTNO) REFERENCES DEPT (DEPTNO),
CONSTRAINT EMP_PRIMARY_KEY PRIMARY KEY (EMPNO));

Inserindo Registros na Tabela Criada Usando o cmdo INSERT.

INSERT INTO EMP VALUES (7839,’KING’,’PRESIDENT’,NULL,’17-NOV-81′,5000,NULL,10);
INSERT INTO EMP VALUES (7698,’BLAKE’,’MANAGER’,7839,’1-MAY-81′,2850,NULL,30);
INSERT INTO EMP VALUES (7782,’CLARK’,’MANAGER’,7839,’9-JUN-81′,2450,NULL,10);
INSERT INTO EMP VALUES (7566,’JONES’,’MANAGER’,7839,’2-APR-81′,2975,NULL,20);
INSERT INTO EMP VALUES (7654,’MARTIN’,’SALESMAN’,7698,’28-SEP-81′,1250,1400,30);
INSERT INTO EMP VALUES (7499,’ALLEN’,’SALESMAN’,7698,’20-FEB-81′,1600,300,30);
INSERT INTO EMP VALUES (7844,’TURNER’,’SALESMAN’,7698,’8-SEP-81′,1500,0,30);
INSERT INTO EMP VALUES (7900,’JAMES’,’CLERK’,7698,’3-DEC-81′,950,NULL,30);
INSERT INTO EMP VALUES (7521,’WARD’,’SALESMAN’,7698,’22-FEB-81′,1250,500,30);
INSERT INTO EMP VALUES (7902,’FORD’,’ANALYST’,7566,’3-DEC-81′,3000,NULL,20);
INSERT INTO EMP VALUES (7369,’SMITH’,’CLERK’,7902,’17-DEC-80′,800,NULL,20);
INSERT INTO EMP VALUES (7788,’SCOTT’,’ANALYST’,7566,’09-DEC-82′,3000,NULL,20);
INSERT INTO EMP VALUES (7876,’ADAMS’,’CLERK’,7788,’12-JAN-83′,1100,NULL,20);
INSERT INTO EMP VALUES (7934,’MILLER’,’CLERK’,7782,’23-JAN-82′,1300,NULL,10);

Outro Exemplo de Como Criar uma Tabela:

CREATE TABLE BONUS (
ENAME CHAR(10),
JOB CHAR(9),
SAL NUMBER,
COMM NUMBER);

CREATE TABLE SALGRADE (
GRADE NUMBER,
LOSAL NUMBER,
HISAL NUMBER);

Inserindo Valores na Nova Tabela.

INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);

Para criarmos uma tabela temos antes que mais nada ter permissão para isto ou seja “GRANT”, que nos é concedido através do DBA, depois não podemos nos esquecer de criar as CONSTRAINTS que são as PK os campos NOT NULL as FK. O observe a sintaxe da criação de tabela, a definição do tipo e tamanho das colunas ( Data Type), a referencia a chave estrangeira e a criação, as colunas de formato DATE usa-se o padrão SYSDATE que corresponde a data do sistema.

Vamos ao Exemplo:

CREATE TABLE S_TEST
(ID NUMBER(7)
CONSTRAINT S_TEST_ID_PK PRIMARY KEY,
NAME VARCHAR2(25)
CONSTRAINT S_TEST_NAME_NN NOT NULL,
REGION_ID NUMBER(7)
CONSTRAINT S_TEST_REGION_ID_FK REFERENCES
S_REGION(ID),
START_DATE DATE DEFAULT SYSDATE)
/

No próximo exemplo vamos criar uma tabela em função de uma outra onde se traz somente as constrains NOT NULL, o tipo e tamanho das colunas são também automaticamente trazidos, assim também como o conteúdo dos mesmos. Verifique o exemplo abaixo como isto é feito e veja o formato de S_EMP e o novo formato do que chamamos de EMP_41, veja também que ele somente traz os registros referentes ao dept 41. Observe a sintaxe “AS” e a sub query dentro do Create table.

SQL> Create table emp_41
2 AS
3 SELECT ID,LAST_NAME,USERID,START_DATE,
4 SALARY,TITLE
5 FROM S_EMP
6 WHERE DEPT_ID = 41;

Table created.

O formato da tabela criada, é o mesmo da s_emp veja:

SQL> DESC EMP_41
Name Null? Type



—-
ID NOT NULL NUMBER(7)
LAST_NAME NOT NULL VARCHAR2(25)
USERID NOT NULL VARCHAR2(8)
START_DATE DATE
SALARY NUMBER(11,2)
TITLE VARCHAR2(25)

SQL> desc s_emp
Name Null? Type



—-
ID NOT NULL NUMBER(7)
LAST_NAME NOT NULL VARCHAR2(25)
FIRST_NAME VARCHAR2(25)
USERID NOT NULL VARCHAR2(8)
START_DATE DATE
COMMENTS VARCHAR2(255)
MANAGER_ID NUMBER(7)
TITLE VARCHAR2(25)
DEPT_ID NUMBER(7)
SALARY NUMBER(11,2)
COMMISSION_PCT NUMBER(4,2)

Veja os dados da nova tabela.

SQL> select id,last_name
2 from EMP_41;

ID LAST_NAME



2 Ngao
6 Urguhart
16 Maduro
17 Smith

Observe que os dados abaixo são os mesmos da tabela criada que foram justamente criada a partir do departamento 41.

SQL> select id,last_name
2 from s_emp
3 where dept_id = 41;

ID LAST_NAME



2 Ngao
6 Urguhart
16 Maduro
17 Smith

Como descobrir quais são as tabelas que estão a nossa disposição:

select object_name from user_Objects
where object_type = ‘TABLE’;

FIM DE CAPÍTULO
Finalidade do Capítulo:
Demostrar o uso do comando DELETE:

O Cmdo DELETE serve para delatarmos registros em uma tabela, usamos o DELETE from e o nome da tabela.Neste exemplo abaixo estamos querendo deletar todos
os registros da tabela s_emp que tenham como start_date
o dia 01.01.1996, para isso temos que usar na clausula WHERE o TO_DATE colocando o valor do que nós estamos querendo e seu correspondente dia, mês e ano conforme o formato, no caso não deletou nenhum registro porque não existia nenhum que satisfazia as condições.

Vamos ao exemplo:

SQL> EDIT
Wrote file afiedt.buf
1 DELETE FROM s_emp
2 WHERE START_DATE >
3* TO_DATE (‘01.01.1996′,’DD.MM.YYYY’)
SQL> /

0 rows deleted

Agora estamos tentando deletar um registro que existe, como o registro existente é uma FK que logicamente existe uma outra tabela não se aceita a deleção, veja a mensagem de erro de violação de constraint.

SQL> DELETE FROM s_emp
2 WHERE START_DATE > TO_DATE (‘01.01.1991′,’dd.mm.yyyy’);
DELETE FROM s_emp
*
ERROR at line 1:
ORA-02292: integrity constraint (GUIMA.S_WAREHOUSE_MANAGER_ID_FK)
violated – child record found

Para deletar todos os registros de uma tabela procede-se da seguinte forma:

SQL> DELETE FROM test;

25,000 rows deleted.

Para confirmarmos a deleção usamos o comando select na table deletada.

SELECT * FROM
2 test;

no rows selected;

FIM DE CAPÍTULO
Finalidade do Capítulo é Mostrar com Trabalhar com o Dicionário de Dados.

O dicionário de dados serve dentre outras coisas para possibilitar a visualização de quais objetos que estão disponíveis para manipulação, por exemplo: se temos acesso a tabelas, views ou etc.
No exemplo abaixo estamos fazendo um select na tabela user_objects usando o comando ‘distinct’ com a finalidade de vermos quais os objetos a serem manipulados.

Vamos ao exemplo:

SQL> SELECT DISTINCT OBJECT_TYPE
2 FROM USER_OBJECTS;

OBJECT_TYPE


INDEX
SEQUENCE
TABLE
/

Para vermos quais são as tabelas ou outros objetos que estão a nossa disposição, ou seja aqueles que temos permissão para manipulá – los temos que fazer um select no dicionário de dados, incluindo neste o object_name na tabela user_objects usando o tipo desejado ‘table’ ou ‘view’ e etc.

SELECT OBJECT_NAME
FROM USER_OBJECTS
WHERE OBJECT_TYPE = ‘TABLE’
/
OBJECT_NAME


FUNCIONÁRIO
SEÇÃO
S_CUSTOMER
S_DEPT
S_EMP
S_IMAGE
S_INVENTORY
S_ITEM
S_LONGTEXT
S_ORD
S_PRODUCT
S_REGION
S_TITLE
S_WAREHOUSE

14 rows selected.

Ainda usando o dicionário de dados podemos verificar quais são as constraints de uma tabela, é bom lembrar que estamos fazendo uma consulta na tabela USER_CONSTRAITS que assim como a USER_OBJECTS pertence ao dicionário de dados.

SQL> select constraint_name,constraint_type,search_condition,
r_constraint_name
2 from user_constraints
3 where table_name = ‘S_EMP’;

CONSTRAINT C SEARCH_CONDITION R_CONSTRAINT_NAME




S_EMP_ID_N C ID IS NOT NULL
N

S_EMP_LAST C LAST_NAME IS NOT N
_NAME_NN ULL

S_EMP_USER C USERID IS NOT NULL
ID_NN

S_EMP_ID_P P
K

S_EMP_USER U
ID_UK

S_EMP_COMM C commission_pct IN
ISSION_PCT (10, 12.5, 15, 17.
_CK 5, 20)

S_EMP_MANA R S_EMP_ID_PK
GER_ID_FK

CONSTRAINT C SEARCH_CONDITION R_CONSTRAINT_NAME





S_EMP_DEPT R S_DEPT_ID_PK
_ID_FK

S_EMP_TITL R S_TITLE_TITLE_PK
E_FK

9 rows selected.

Tentando refinar ainda mais o exemplo acima vamos verificar quais são as constraints referentes as colunas de uma determinada tabela que no caso é a s_emp.

Vamos ao Exemplo:

SQL>
SELECT CONSTRAINT_NAME,COLUMN_NAME
FROM USER_CONS_COLUMNS
WHERE TABLE_NAME =’S_EMP’

CONSTRAINT_NAME COLUMN_NAME



S_EMP_COMMISSION_PCT_CK COMMISSION_PCT
S_EMP_DEPT_ID_FK DEPT_ID
S_EMP_ID_NN ID
S_EMP_ID_PK ID
S_EMP_LAST_NAME_NN LAST_NAME
S_EMP_MANAGER_ID_FK MANAGER_ID
S_EMP_TITLE_FK TITLE
S_EMP_USERID_NN USERID
S_EMP_USERID_UK USERID

9 rows selected.

FIM DE CAPÍTULO

Finalidade deste capítulo é apresentar o uso de funções de grupo do cmdo group by, funções de grupo MAX,MIN,SUM,AVG e
ainda o uso do HAVING:
Dica importante: geralmente o que está dentro do comando select deve estar no group by.

Neste exemplo estamos vendo o uso da função AVG que tem a finalidade de trazer a média de uma determinada soma. Estamos também usando a função MAX e MIN que tem como função trazer o máximo e o mínimo valor. Também temos a função SUM que faz a soma de valores de colunas, todas essas funções são funções de grupo. Ainda no exemplo abaixo temos o uso da função UPPER que transforma o conteúdo a ser pesquisado e a função LIKE que faz a pesquisa somente nos registros que começarem por ‘sales’.

SQL> select avg(SALARY),MAX(SALARY),MIN(SALARY),
2 SUM(SALARY)
3 FROM S_EMP
4 WHERE UPPER(TITLE) LIKE ‘SALES%’;

AVG(SALARY) MAX(SALARY) MIN(SALARY) SUM(SALARY)





1476 1525 1400 7380

Neste exemplo abaixo, temos o menor nome e o maior nome dentro da ordem alfabética, demostrando que não somente os valores numéricos que são manipuláveis com as funções MIN e MAX, é bom salientar que as datas também são passíveis de manipulação.

Vamos ao exemplo:

SQL> select MIN(LAST_NAME),MAX(LAST_NAME)
2 FROM S_EMP;

MIN(LAST_NAME) MAX(LAST_NAME)



Biri Velasquez

No exemplo abaixo estamos tentando selecionar o ID de departamento igual a 41 trazendo seu numero de repetições, mas não dá certo pois a função COUNT é de grupo e não estamos usando o GROUP BY.

Vamos ao exemplo:

SQL> select dept_id, count(*) “number”
2 from s_emp
3 where dept_id = 41;
select dept_id, count(*) “number”
*
ERROR at line 1:
ORA-00937: not a single-group group function

Fazendo o select abaixo temos quantas vezes o dept 41 se repete.

SQL> select dept_id
2 from s_emp
3 where dept_id = 41;

DEPT_ID


41
41
41
41

Agora usando a função de grupo COUNT(*) que no caso esta contando a quantidade de registros onde o dept_id é igual a 41 ou seja quantas vezes ele se repete, teremos o grupamento feito. O que está no select deve estar no group by.

Vamos ao exemplo:

SQL> select dept_id, count(*) “number”
2 from s_emp
3 where dept_id = 41
4 group by dept_id;

DEPT_ID number



41 4

Agora estamos contando quantos registros temos para cada CREDIT_RATING da tabela s_customer.

SQL> select credit_rating,count(*) “# custo”
2 from s_customer
3 group by credit_rating;

CREDIT_RA # custo



EXCELLENT 9
GOOD 3
POOR 3

No próximo exemplo é bom destacar o uso do NOT LIKE onde determina que não seja trazido registros parecidos com uma uma certa condição. Veja também o uso da função de grupo SUM que trás a soma dos salários.

SQL> select title, sum(salary) soma_total
2 from s_emp
3 where title not like ‘VP%’
4 group by title
5 order by
6 sum(salary);

TITLE SOMA_TOTAL



President 2500
Warehouse Manager 6157
Sales Representative 7380
Stock Clerk 9490

Um outro exemplo do uso de ORDER BY, onde estamos grupando por Title.

SQL> select title,max(salary)
2 from s_emp
3 group by title;

TITLE MAX(SALARY)



President 2500
Sales Representative 1525
Stock Clerk 1400
VP, Administration 1550
VP, Finance 1450
VP, Operations 1450
VP, Sales 1400
Warehouse Manager 1307

8 rows selected.

Nossa intenção no select abaixo é fazermos a média dos salários dos campos da coluna SALARY da tabela s_emp, e trazer a tela somente a média que der acima de 2000.
Não dá certo porque não usamos a clausula where dentro do group by mas sim a função HAVING, isso quando queremos trazer dados a tela obedecendo uma certa condição.

SQL> SELECT DEPT_ID,AVG(SALARY)
2 FROM S_EMP
3 WHERE AVG(SALARY) > 2000
4 GROUP BY DEPT_ID;
WHERE AVG(SALARY) > 2000
*
ERROR at line 3:
ORA-00934: group function is not allowed here

Veja a maneira correta de se fazer o exercício anterior onde usamos a função HAVING que se dá da seguinte forma , sempre após o group by.

SQL> SELECT DEPT_ID,AVG(SALARY)
2 FROM S_EMP
3 GROUP BY DEPT_ID
4 HAVING AVG(SALARY) > 2000;

DEPT_ID AVG(SALARY)



50 2025S

No exemplo abaixo estamos selecionando, contando e separando em grupos os departamentos isso pelo dept_id e depois o title, perceba a seqüência do grupo.

SQL> select dept_id,title, count(*)
2 from s_emp
3 group by dept_id,title;

DEPT_ID TITLE COUNT(*)




10 VP, Finance 1
31 Sales Representative 1
31 VP, Sales 1
32 Sales Representative 1
33 Sales Representative 1
34 Sales Representative 1
34 Stock Clerk 1
35 Sales Representative 1
41 Stock Clerk 2
41 VP, Operations 1
41 Warehouse Manager 1
42 Stock Clerk 2
42 Warehouse Manager 1
43 Stock Clerk 2
43 Warehouse Manager 1
44 Stock Clerk 1
44 Warehouse Manager 1
45 Stock Clerk 2
45 Warehouse Manager 1
50 President 1
50 VP, Administration 1

21 rows selected.

Agora estamos grupando primeiro pelo title e depois pelo dept_id, veja a diferença.

SQL> select title,dept_id, count(*)
2 from s_emp
3 group by title,dept_id;

TITLE DEPT_ID COUNT(*)




President 50 1
Sales Representative 31 1
Sales Representative 32 1
Sales Representative 33 1
Sales Representative 34 1
Sales Representative 35 1
Stock Clerk 34 1
Stock Clerk 41 2
Stock Clerk 42 2
Stock Clerk 43 2
Stock Clerk 44 1
Stock Clerk 45 2
VP, Administration 50 1
VP, Finance 10 1
VP, Operations 41 1
VP, Sales 31 1
Warehouse Manager 41 1
Warehouse Manager 42 1
Warehouse Manager 43 1
Warehouse Manager 44 1
Warehouse Manager 45 1

Observe o uso do HAVING em substituição a clausula WHERE, além de outros SELECTS.

Quando quisermos trazer um registro que inicie por uma letra qualquer temos podemos usamos o cmdo LIKE procedendo da seguinte forma:

SQL> select last_name, title
1 from s_emp
2 where last_name like ‘V%’

LAST_NAME TITLE



Velasquez President

No exemplo abaixo estamos fazendo a seleção de todos os cargos de funcionários existentes assim como contando seus componentes COUNT e ainda trazendo as suas respectivas medias salariais usando a função AVG, multiplicadas por 12.

SQL> SELECT TITLE, 12 * AVG(SALARY) ” Salário Anual”,
2 count(*) ” numero de funcionários”
3 from s_emp
4 group by title;

TITLE Salário Anual numero de funcionários
President $30,000.00 1
Sales Representative $17,712.00 5
Stock Clerk $11,388.00 10
VP, Administration $18,600.00 1
VP, Finance $17,400.00 1
VP, Operations $17,400.00 1
VP, Sales $16,800.00 1
Warehouse Manager $14,776.80 5

8 rows selected.

Um pouco diferente do exemplo anterior o abaixo está primeiramente formatando a coluna Salário Anual para receber valores após ter sido feito um select em TITLE. Estamos multiplicando por 12 a soma da média dos salários feita pela função AVG, e então usamos a função COUNT para contar o numero de funcionários de s_emp grupados por title e que tenha no máximo 2 funcionários, olhando para o exemplo anterior podemos entender melhor e também destacar que o HAVING está fazendo a função de um WHERE dentro do GROUP BY.

Vamos ao Exemplo:

SQL> column ” Salário Anual” FORMAT $99,999.99
SQL> SELECT TITLE, 12 * AVG(SALARY) ” Salário Anual”,
2 count(*) ” numero de funcionários”
3 from s_emp
4 group by title
5 having count(*) > 2;

TITLE Salário Anual numero de funcionários




Sales Representative $17,712.00 5
Stock Clerk $11,388.00 10
Warehouse Manager $14,776.80 5

Mais um exemplo do uso do HAVING:

SQL> select title,sum(salary) soma
2 from s_emp
3 where title not like’VP%’
4 group by title
5 having sum(salary) > 5000
6 order by sum(salary);

TITLE SOMA



Warehouse Manager 6157
Sales Representative 7380
Stock Clerk 9490

FIM DE CAPÍTULO

Finalidade do capítulo é demostrar como criar GRANTS.

Para criar um novo usuário (isto é executado pelo DBA) devemos proceder da seguinte forma, “NOVO” é o nome do usuário e IDENTIFIED BY “tiger” é sua senha.

SQL> CREATE USER NOVO
2 IDENTIFIED BY TIGER;

User created.

Agora após termos criado um novo usuário vamos dar-lhe os seus GRANTS ou seja as permissões devidas como,delete,update e etc, veja como se processa isto e veja também a sintaxe:

SQL> GRANT create table, create sequence, create view
2 to NOVO;

Grant succeeded.

Criando uma ROLE de privilégios para ser usada para vários usuários, uma role é o conjunto de privilégios que guardamos armazenados com a finalidade de proporcionar uma facilitação de manuseio na hora de se conceder privilégios, evitando a digitação de todos os privilégios, passando a ter que digitar somente o nome da role. No exemplo, o nome da ROLE é “manager” e por enquanto não existe nenhum privilégio dentro dela.

SQL> CREATE ROLE manager;

Role created.

Agora estamos definindo os privilégios para a ROLE “manager”, que são: criar tabela e view. Observe como se processa isto:

SQL> GRANT create table, create view TO manager;

Grant succeeded.

Agora que nossa ROLE já tem os privilégios definidos, no exemplo abaixo vou passá-la para algum usuário. No caso o usuário “NOVO” está recebendo os GRANTS da ROLE MANAGER, que são somente criar tabela e view:

SQL> GRANT MANAGER TO NOVO;

Grant succeeded

Como mudar a senha de um usuário: no caso estamos mudando do user novo que tinha como “senha” ou seja IDENTIFIED igual a TIGER passando a ser LION.

SQL> ALTER USER NOVO IDENTIFIED BY LION;

User altered.

Agora estamos dando um novo GRANT para o USER “NOVO” referente a tabela s_emp, neste caso o GRANT é só de consulta.

SQL> GRANT select
2 ON s_emp
3 TO novo;

Grant succeeded.

O exemplo abaixo mostra como adicionar um novo GRANT a uma ROLE, relacionado com colunas específicas de uma tabela no caso s_dept e atribuindo a permissão de update para o usuário “NOVO” e para a ROLE “manager”.

SQL> GRANT update(name,region_id)
2 ON s_dept
3 TO novo,manager;

Grant succeeded.

Este exemplo mostra como dar GRANT para um USER em uma tabela e este usuário ter permissão de passar este mesmo GRANT para outros usuários.

SQL> GRANT select
2 ON s_emp
3 TO scott
4 WITH GRANT OPTION;

Grant succeeded.

Agora estou tornando publico de todos o SELECT a tabela S_DEPT referente ao usuário GUIMA, ou seja todos podem dar select a tabela s_dept do usuário GUIMA.

SQL> GRANT SELECT
2 ON GUIMA.S_DEPT
3 TO PUBLIC;

Grant succeeded.

Para sabermos quais privilégios nós possuímos podemos acessar no DICIONÁRIO DE DADOS nas seguintes tabelas:

ROLE_SYS_PRIVS
ROLE_TAB_PRIVS
USER_ROLE_PRIVS
USER_TAB_PRIVS_MADE
USER_TAB_PRIVS_RECD
USER_COL_PRIVS_MADE
USER_COL_PRIVS_RECD

Como ver as ROLES que eu tenho acesso:

SQL> SELECT GRANTED_ROLE,OS_GRANTED
2 FROM USER_ROLE_PRIVS
3 WHERE USERNAME = ‘GUIMA’;

GRANTED_ROLE OS_



CONNECT NO
DBA NO
MANAGER NO

Para tirar os privilégios de um USER procede-se da seguinte forma:

SQL> REVOKE select
2 ON s_emp
3 FROM NOVO;

Revoke succeeded.

No exemplo acima estamos tirando os privilégios de select do USER “NOVO”.

Como criar sinônimo:
Criando um sinônimo para uma tabela: no caso está sendo criado um sinônimo com o nome “HXXH” para a tabela s_dept pertencente a alice:

SQL> CREATE SYNONYM HXXH
FOR alice.s_dept;
Synonym created.

Agora estamos criando um sinônimo para uma VIEW, nossa VIEW se chama dept_sum_vu e o nome do sinônimo criado é d_sum:

SQL> create SYNONYM d_sum
2 for dept_sum_vu;

Synonym created.

Agora estamos criando um sinônimo publico, o nome dele é “DDD” e é referente a tabela s_dept de alice:

SQL> create public SYNONYM DDD
2 FOR alice.s_dept;

Synonym created.

Para dropar um sinônimo é simples:

SQL> DROP SYNONYM d_sum;

Synonym dropped.

FIM DE CAPÍTULO

Finalidade do Capítulo é Tratar Sobre INDEX e JOIN e OUTER JOIN:

INDEX:

Uma INDEX pode ser criada automaticamente(quando é criada uma PK ou UK constraint em uma tabela) ou manualmente. Para delatarmos uma INDEX temos que usar o cmdo DROP INDEX:

Vamos ao Exemplo:

SQL> DROP INDEX s_emp_last_name_idx;

Index dropped.

Para criar uma INDEX usa-se o cmdo CREATE INDEX:

Vamos ao Exemplo:

SQL> CREATE INDEX S_EMP_last_name_idx
2 on S_EMP(last_name);

Index created.

Para selecionar as INDEX de uma tabela faz-se um SELECT na tabela USER_INDEXES e USER_IND_COLUMNS:

O uso do JOIN:

Join é a ligação que fazemos entre duas tabelas na pesquisa de dados, necessariamente deve existir em um join a chave primaria fazendo relação com uma chave estrangeira, esta é a condição e ligação.
No exemplo abaixo estamos selecionando o last_name e dept_id da tabela s_emp e também selecionando a coluna name da tabela s_dept isto onde a coluna id de s_dept for igual a coluna dept_id de s_emp, completando assim a condição do JOIN.
Vamos ao exemplo:

SQL> SELECT S_EMP.LAST_NAME,S_EMP.DEPT_ID,S_DEPT.NAME
2 FROM S_EMP,S_DEPT
3 WHERE S_EMP.DEPT_ID = S_DEPT.ID;

LAST_NAME DEPT_ID NAME




Velasquez 50 Administration
Ngao 41 Operations
Nagayama 31 Sales
Quick-To-See 10 Finance
Ropeburn 50 Administration
Urguhart 41 Operations
Menchu 42 Operations
Biri 43 Operations
Catchpole 44 Operations
Havel 45 Operations
Magee 31 Sales
Giljum 32 Sales
Sedeghi 33 Sales
Nguyen 34 Sales
Dumas 35 Sales
Maduro 41 Operations
Smith 41 Operations
Nozaki 42 Operations
Patel 42 Operations
Newman 43 Operations
Markarian 43 Operations

No exemplo abaixo como no anterior temos a realização de um JOIN.

Vamos ao exemplo.

SQL> SELECT S_DEPT.ID ” COD DO DEPT”,
2 S_REGION.ID “COD DA REG”,
3 S_REGION.NAME”NOME DA REGIÃO”
4 FROM S_DEPT,S_REGION
5 WHERE S_DEPT.REGION_ID = S_REGION.ID;

COD DO DEPT COD DA REG NOME DA REGIÃO




10 1 North America
31 1 North America
32 2 South America
33 3 Africa / Middle East
34 4 Ásia
35 5 Europe
41 1 North America
42 2 South America
43 3 Africa / Middle East
44 4 Ásia
45 5 Europe
50 1 North America

12 rows selected.

No exemplo abaixo temos mais um exemplo de join onde temos o uso de apelidos para as tabelas manipuladas, é importante observar como é usado o apelido e como este tem que ser referenciado no FROM, no exemplo abaixo vemos o apelido de “E” para a tabela S_EMP, de “D” para a tabela S_DEPT. Outra característica importante no exemplo é o uso do JOIN onde relacionamos as duas tabelas através da chave estrangeira. O uso do INITCAP serve para procurarmos o registro que comece com a letra maiúscula

SQL> select E.last_name,E.dept_id,
2 D.name
3 from s_emp E,s_dept D
4 where e.dept_id = D.id
5 and initcap(E.last_name)=’Menchu’;

LAST_NAME DEPT_ID NAME




Menchu 42 Operations

No exemplo abaixo temos a realização de dois JOINS, uso do AND no exemplo abaixo proporciona a adição de mais de uma condição ou seja além do join entre s_emp e s_dept também ocorre um Join entre s_region e s_dept proporcionado pelo uso do AND. Também está sendo usado um novo AND colocando a commission_pct da tabela s_emp > 0.

Vamos ao exemplo:

SQL> select E.last_name,R.name,E.commission_pct
2 from s_emp E, s_dept D, s_region R
3 where E.dept_id = D.id
4 and D.region_id = R.id
5 and E.commission_pct > 0;

LAST_NAME NAME COMMISSION_PCT



Magee North America 10
Giljum South America 12.5
Sedeghi Africa / Middle East 10
Nguyen Ásia 15
Dumas Europe 17.5

No exemplo abaixo estamos mostrando um join que traz todos os registros que satisfaçam a condição da clausula where ou seja traz somente aquele que satisfação o JOIN não traz os registros que contem espaços em branco, em função da relação entre as duas tabelas no caso entre s_emp e s_customer. Mas e se quisermos que pesquisar inclusive os registros que não tem relacionamento, ou seja que estejam com o espaço em branco? Para isso temos que acrescentarmos o sinal de (+).

Vamos ao Exemplo:

SQL> select e.last_name,e.id,c.name
2 from s_emp e, s_customer c
3 where e.id = c.sales_rep_id
4 order by e.id;

LAST_NAME ID NAME




Magee 11 Womansport
Magee 11 Beisbol Si!
Magee 11 Ojibway Retail
Magee 11 Big John’s Sports Emporium
Giljum 12 Unisports
Giljum 12 Futbol Sonora
Sedeghi 13 Hamada Sport
Nguyen 14 Simms Athletics
Nguyen 14 Delhi Sports
Dumas 15 Kam’s Sporting Goods
Dumas 15 Sportique
Dumas 15 Sporta Russia
Dumas 15 Kuhn’s Sports
Dumas 15 Muench Sports

O exemplo a seguir é idêntico ao anterior com a diferença que está acrescido do sinal de (+) para, mesmo satisfazendo a clausula where, traga os registros que não tenham satisfeito a condição de relacionamento da clausula where, no caso, estamos então fazendo um OUTER JOIN pegando o LAST_NAME e o ID da tabela s_emp e o NAME da tabela s_customer onde o id da tabela s_emp corresponda ao sales_rep_id dentro da tabela s_customer e com o sinal de (+) traga também os NAME de s_customer que não tenham relação com s_emp.

SQL> select e.last_name,e.id,c.name
2 from s_emp e, s_customer c
3 where e.id (+) = c.sales_rep_id
4 order by e.id;

LAST_NAME ID NAME




Magee 11 Womansport
Magee 11 Beisbol Si!
Magee 11 Ojibway Retail
Magee 11 Big John’s Sports Empori
Giljum 12 Unisports
Giljum 12 Futbol Sonora
Sedeghi 13 Hamada Sport
Nguyen 14 Simms Athletics
Nguyen 14 Delhi Sports
Dumas 15 Kam’s Sporting Goods
Dumas 15 Sportique
Dumas 15 Muench Sports
Dumas 15 Sporta Russia
Dumas 15 Kuhn’s Sports
Sweet Rock Sports

15 rows selected.

FINAL DE CAPÍTULO

Finalidade do capítulo é mostrar o uso do BETWEEN.

No exemplo a seguir estamos selecionando as colunas ename,job,sal da tabela EMP e a coluna GRADE da tabela SALGRADE, onde através do comando BETWEEN AND ocorre uma pesquisa na tabela SALGRADE nas colunas LOSAL e HISAL onde comparamos seus valores com os valores dos campos da coluna SAL de EMP trazendo somente aqueles valores que estejam entre os de LOSAL e HISAL. No exemplo não ocorre um JOIN mas uma simples pesquisa em uma outra tabela para que seja efetuada uma comparação.

SQL> select e.ename,e.job,e.sal,s.grade
2 from emp e, salgrade s
3 where e.sal between s.losal and s.hisal

ENAME JOB SAL GRADE





SMITH CLERK 800 1
ADAMS CLERK 1100 1
JAMES CLERK 950 1
WARD SALESMAN 1250 2
MARTIN SALESMAN 1250 2
MILLER CLERK 1300 2
ALLEN SALESMAN 1600 3
TURNER SALESMAN 1500 3
JONES MANAGER 2975 4
BLAKE MANAGER 2850 4
CLARK MANAGER 2450 4
SCOTT ANALYST 3000 4
FORD ANALYST 3000 4
KING PRESIDENT 5000 5

14 rows selected.

FINAL DE CAPÍTULO

Finalidade do capítulo é mostrar o uso do ORDER BY.

O exemplo abaixo mostra como usar o comando order by, onde no caso estamos ordenando a tabela s_emp pelo o last_name, é bom lembrar que sempre o comando order by vem por último na função sql.
Vamos ao exemplo:

SELECT LAST_NAME, DEPT_ID,START_DATE
FROM S_EMP
ORDER BY LAST_NAME

LAST_NAME DEPT_ID START_DAT




Biri 43 07-APR-90
Catchpole 44 09-FEB-92
Chang 44 30-NOV-90
Dancs 45 17-MAR-91
Dumas 35 09-OCT-91
Giljum 32 18-JAN-92
Havel 45 27-FEB-91
Maduro 41 07-FEB-92
Magee 31 14-MAY-90
Markarian 43 26-MAY-91
Menchu 42 14-MAY-90
Nagayama 31 17-JUN-91
Newman 43 21-JUL-91
Ngao 41 08-MAR-90
Nguyen 34 22-JAN-92
Nozaki 42 09-FEB-91
Patel 42 06-AUG-91
Patel 34 17-OCT-90
Quick-To-See 10 07-APR-90
Ropeburn 50 04-MAR-90
Schwartz 45 09-MAY-91

LAST_NAME DEPT_ID START_DAT




Sedeghi 33 18-FEB-91
Smith 41 08-MAR-90
Urguhart 41 18-JAN-91
Velasquez 50 03-MAR-90

25 rows selected.

No comando sql order by temos a função desc que vem com a finalidade de colocar os dados dentro da coluna em ordem decrescente. No exemplo a seguir estamos colocando por ordem decrescente a coluna start_date da tabela s_emp.

SQL> SELECT LAST_NAME, DEPT_ID,START_DATE
2 FROM S_EMP
3 ORDER BY START_DATE DESC;

LAST_NAME DEPT_ID START_DAT




Catchpole 44 09-FEB-92
Maduro 41 07-FEB-92
Nguyen 34 22-JAN-92
Giljum 32 18-JAN-92
Dumas 35 09-OCT-91
Patel 42 06-AUG-91
Newman 43 21-JUL-91
Nagayama 31 17-JUN-91
Markarian 43 26-MAY-91
Schwartz 45 09-MAY-91
Dancs 45 17-MAR-91
Havel 45 27-FEB-91
Sedeghi 33 18-FEB-91
Nozaki 42 09-FEB-91
Urguhart 41 18-JAN-91
Chang 44 30-NOV-90
Patel 34 17-OCT-90
Menchu 42 14-MAY-90
Magee 31 14-MAY-90
Quick-To-See 10 07-APR-90
Biri 43 07-APR-90

LAST_NAME DEPT_ID START_DAT




Ngao 41 08-MAR-90
Smith 41 08-MAR-90
Ropeburn 50 04-MAR-90
Velasquez 50 03-MAR-90

25 rows selected.

Agora vamos mostrar os dados do resultado do mesmo select anterior sem o uso da função desc para o order by, observe a diferença da ordenação em relação as datas.

SQL> SELECT LAST_NAME, DEPT_ID,START_DATE
2 FROM S_EMP
3 ORDER BY START_DATE;

LAST_NAME DEPT_ID START_DAT




Velasquez 50 03-MAR-90
Ropeburn 50 04-MAR-90
Ngao 41 08-MAR-90
Smith 41 08-MAR-90
Quick-To-See 10 07-APR-90
Biri 43 07-APR-90
Menchu 42 14-MAY-90
Magee 31 14-MAY-90
Patel 34 17-OCT-90
Chang 44 30-NOV-90
Urguhart 41 18-JAN-91
Nozaki 42 09-FEB-91
Sedeghi 33 18-FEB-91
Havel 45 27-FEB-91
Dancs 45 17-MAR-91
Schwartz 45 09-MAY-91
Markarian 43 26-MAY-91
Nagayama 31 17-JUN-91
Newman 43 21-JUL-91
Patel 42 06-AUG-91
Dumas 35 09-OCT-91

LAST_NAME DEPT_ID START_DAT




Giljum 32 18-JAN-92
Nguyen 34 22-JAN-92
Maduro 41 07-FEB-92
Catchpole 44 09-FEB-92

25 rows selected.

O exemplo seguinte mostra como usar a posição da coluna dentro do comando sql para definir a ordenação dos registros por aquela coluna, no caso abaixo estamos ordenando nossos dados pela coluna numero 4 que corresponde a START_DATE de S_EMP.

Vamos ao exemplo:

SQL> SELECT ID,LAST_NAME,FIRST_NAME,START_DATE
2 MANAGER_ID, SALARY
3 FROM S_EMP
4 ORDER BY 4;

ID LAST_NAME FIRST_NAME MANAGER_I SALARY





1 Velasquez Carmen 03-MAR-90 2500
5 Ropeburn Audry 04-MAR-90 1550
2 Ngao LaDoris 08-MAR-90 1450
17 Smith George 08-MAR-90 940
4 Quick-To-See Mark 07-APR-90 1450
8 Bir

TCP/IP

0

Autoria: Rogério Toshio

O TCP/IP é um conjunto de protocolos para cuidar da informação transportada, sem distinção do tipo de hardware ou dados roteados entre várias redes ou a clareza da forma de aplicação, sendo desenvolvida pela Agência de Projetos e Pesquisas Avançadas de Defesa que iniciou o projeto desta Internet.
Os principais protocolos são TCP (Transmission Control Protocol) e IP(Internet Protocol), sendo hoje aceita vários segmentos da sociedade e do mundo.
A arquitetura do TCP/IP implementa alguns “Serviços” que oferece aos usuários, mas é importante colocar em pauta que ela admite outros aplicativos que disponibilizem as mesmas facilidades.
O TCP/IP estabelece uma conexão fim a fim entre os usuários, isto significa o envio da mensagem com segurança entre o remetente e o destinatário. Tendo o Correio Eletrônico em uma Internet fácil e seguro.
No transporte de arquivos o serviço de Correio Eletrônico só é útil para pequenas e rápidas quantidades de dados.
O responsável pela transferência de arquivos entre sistemas dentro da Internet compatibilizando das desigualdade entre as aplicações das máquinas utilizadas seria o FTP (File Tranfer Protocol), sendo o serviço da arquitetura TCP/IP.
Temos na arquitetura TCP/IP um benefício que seria “TELNET”, aceita conexão de uma máquina local em uma outra remota, gerando uma sessão interativa entre elas.
O Internet Protocol (IP) é responsável pelo serviço de interface com o hardware utilizado, que é igual a grande flexibilidade de uso com várias plataformas de hardware.
O protocolo IP conclui uma unidade de transferência de dados, chamado datagrama, sendo da forma “encapsulada” em diversos protocolos de nível inferior (enlace do OSI ou Físico para Internet), com uma interface simples entre eles, que causa a independência do IP quanto ao nível inferior.
Além de controlar os erros que implementa a confirmações dos dados recebidos pelo destino, o protocolo TCP facilita o nível de controle de fluxo entre várias canalizações lógicas e as citadas aplicações.
O IP possui um endereçamento distinto para cada “HOST” conectado à Internet, o qual é acrescentado nos datagrama, sendo utilizado pelos equipamentos da rede para encontrar o melhor caminho entre origem e destino.
As facilidades para o usuários com o TCP/IP, são várias, como: suprir as necessidades básicas dos usuários como: correio eletrônico (SMTP), transferência de arquivo (FTP), etc.

Tecnodemocracia e Liberdade Digital

0

Autoria: Adriana Almeida Sanches

Introdução
Tecnodemocracia é a disponibilidade técnica existente nas cidades e que esteja à disposição das populações – como, por exemplo, o acesso à telefonia (voz), a televisão (imagens) e a informática (informação) – e que venha a contribuir para a descentralização do poder, por meio de um sistema cada vez mais interdependente e participativo de citadinos e cidadãos no atual período técnico-científico-informacional.
Segundo Adam Schaff (1995), os avanços no campo da microeletrônica e nas demais tecnologias da informação tornarão possível o surgimento de uma democracia verdadeira com uma maior descentralização da produção e um incremento da responsabilidade e da liberdade individuais no interior de sua cotidianidade. Para esse autor, a sociedade informatizada pode seguramente fornecer condições propícias para que se possa alcançar a realização individual e coletiva em uma escala sem precedentes, uma tecnodemocracia.
A difusão dos sistemas informáticos vem contribuindo na vida cotidiana de alguns segmentos da sociedade brasileira, tornando-se uma das formas instrumentais mais notáveis para agilização das relações sociais e na comunicação entre povos e nações. No país, cresce o número de domicílios particulares permanentes em que existe microcomputador e muitos deles mantendo interligação de acesso à Internet.
No período atual ou da sociedade da informação, os centros de decisão se movem cada vez mais rápido do que outrora. Isso se dá pela convergência de tecnologias eletrônicas e teleinformáticas que possibilitam a acelerar a velocidade de dados, informações, conhecimentos e decisões.
“O mundo nunca foi tão pequeno – e só encolheu tanto por causa das novas tecnologias. A indústria da telecomunicação vive uma explosão sem precedentes, somada ao barateamento e à popularização da informática. Paralelamente, começa a se esboçar uma convergência entre a infra-estrutura de comunicação e a indústria da mídia, à medida que ambas se digitalizam. É essa conjunção que torna possível um mundo [moderno] nos moldes de hoje”. Ercília (1997, p. 5)
Começa-se a desnudar a complexidade das relações sociais, políticas, tecnológicas e culturais, emergindo a sociedade do conhecimento. Nesse tipo de sociedade, ganha relevância o país, o estado, o município, a cidade, as organizações, as pessoas que com maior autonomia intelectual e agilidade souberem buscar, selecionar, tratar, usar e gerar informações.

Ciberespaço
Considerando o espaço como elemento importante na explicação dos processos sociais e pensando a inovação tecnológica como tal, deve-se ressaltar que o espaço apresenta nesse contexto, uma dupla perspectiva: condição e produto. Isto é, ao mesmo tempo em que o espaço se apresenta como uma resultante do desenvolvimento tecnológico ele também se configura como um condicionante desse processo, visto que o espaço tem suas características físicas e sociais peculiares. Penso que a difusão tecnológica nas pequenas cidades está diretamente relacionada a fatores que se expressam por meio das dimensões político-cultural e econômica. Não basta procurar compreender apenas as alterações que as novas tecnologias promovem neste mundo moderno. É importante ficar em alerta aos fatores que podem favorecer ou impedir a difusão das tecnologias, como sejam as próprias condições de localização do território, as questões de ordem cultural, política etc.
É no âmbito da telecomunicação que podemos assinalar a mais considerável interferência da tecnologia sobre as pequenas cidades. A inovação tecnológica que chega com maior freqüência e, por conseguinte, com maior intensidade, diz respeito à televisão. Atualmente, 92% dos domicílios do Brasil possuem aparelhos de televisão, de cor e em preto e branco, segundo estudos de Ladislau Dowbor (2001). No estado do Rio Grande do Norte(onde existem inúmeras pequenas cidades), considerando os dados do IBGE, são 625.756 domicílios particulares permanentes que dispunham no ano de 2000 de aparelhos de televisão enquanto 106 682 (17,54 %) não possuíam esse meio de comunicação (IBGE, 2002). Dada às precárias condições e às restritas atividades de lazer existentes, a televisão é um importante equipamento eletrônico para essas localidades, e o principal veículo de informação, assim como um dos principais entretenimentos para a sociedade.
O sistema de telecomunicação é um meio tecnológico importante no atual modo de vida urbano. Aliando-se a informática e a televisão, a telefonia vem colaborando com o avanço da convergência tecnológica, o que contribui para articular os espaços, mas ao mesmo tempo para separá-los ou excluí-los do acesso aos bens de consumo e a informação, inúmeras porções terrestres. Numa evolução positiva, o equipamento da telefonia convencional (telefone fixo) alcançou o total de 17.888.211 unidades em 1996, no Brasil, o que fez aumentar em aproximadamente 3,6 vezes em relação ao total de 1980, que corresponde a um acréscimo de 18.564 localidades atendidas pelo serviço telefônico desde 1980, chegando a 22.249 localidades em 1996. Além da existência de linha telefônica fixa, cresce dia-a-dia no país, o número de pessoas que dispõem do telefone celular móvel.

Universidade Virtual
Superar as contradições e dicotomias de forma a criar uma política mais democrática é um dos maiores desafios hoje. O analfabetismo já não se restringe à leitura e à crítica dos códigos escritos. Inclui, cada vez mais, os códigos técnicos, cibernéticos, os quais também são, a meu ver, direitos de cidadania.
As opiniões se dividem quando falamos em inserir a informática na educação:
Para uns, o desenvolvimento cognitivo é mais eficazmente alcançado com o computador, o qual acelera a passagem do pensamento infantil para o pensamento adulto. Acreditam que esta tecnologia transforma-se numa poderosa ferramenta para ajudar a pensar com inteligência e emoção, sendo revolucionária.
Outros pensam nessa tecnologia como simplesmente mais uma ferramenta de trabalho, que pode se tornar emancipatória desde que para isso a sociedade lhe confira esse papel.
Outros, ainda, não só são contrários ao computador como também à televisão. Entendem que o computador massifica o raciocínio e não deve ser utilizado no antigo 1º grau. Seu uso deve ser a partir do antigo 2º grau e apenas como ensino de computação.
A utilização da informática tem sido reacionário-conservadora, tendo em vista o desemprego tecnológico e o descomprometimento dos educadores com a democracia. A péssima remuneração dos professores, suas duvidosas formações, a deplorável qualidade do ensino nas escolas públicas do ensino fundamental e médio, a semi-alfabetização dos alunos, que inclui também países como o próprio EUA, são um indício de que esse fenômeno do descomprometimento com a educação não é um fenômeno típico de antigo terceiro mundo, mas um fenômeno mundial.
Apenas a presença da tecnologia já produz, por si só, mudança nas pessoas. A tecnologia pode, isto sim, “alavancar” as ações daqueles que estão interessados em mudanças, que estão preocupados em encontrar novos caminhos. Mas colocar a informática num pedestal é confinar o ser humano à servidão. E a informática na educação deve colocar a técnica como ponte entre os homens e não como seu obstáculo. Por exemplo, a tecnologia da Internet, se aliada a uma formação ética, criadora, humanista e participativa, pode contribuir na criação das bases de uma sociedade democrática.
Mais do que dar conteúdos prontos, “verdades pré-estabelecidas”, deve-se provocar a reflexão. E isso pode ser feito por meio de roteiros de estudo on-line, lista de discussão, fórum, chat, onde se discute esses temas e se propõe outros. Discutir com os alunos temas geradores é oportunizar um momento de reflexão sobre os caminhos e os descaminhos de nossa sociedade e é esse o diferencial que a Internet pode trazer à democracia. Ela pode permitir um sem-fim de acessos, de contatos, de trocas.
Mas as novas tecnologias só terão um caráter democrático quando concretamente a superação da dominação humana for um processo em marcha, pois de outra forma, a educação com as novas tecnologias continuará circunscrita aos interesses de qualificação do capital.
“O sonho do Iluminismo está a nosso alcance. Todavia, há enorme defasagem entre nosso desenvolvimento tecnológico e o subdesenvolvimento social. Nossa economia, sociedade e cultura são construídas com base em interesses, valores, instituições e sistemas de representação que, em termos gerais, limitam a criatividade coletiva, confiscam a tecnologia da informação e desviam nossa energia para o confronto autodestrutivo. Essa situação não é definitiva. Não há mal eterno na natureza humana. Não existe nada que não possa ser mudado por ação social consciente e intencional, munida de informação e apoiada na legitimidade” Manuel Castells (1999)

Copyleft
Ainda que se considere inevitável a difusão da internet, reforça-se a importância da educação ao acreditar que para muitas comunidades é mais útil ter uma biblioteca com um bom acervo do que um centro cibernético. Sem boa educação, os internautas vão “boiar” no mar digital, cujo conteúdo, em sua maioria, é em inglês. Com essa ressalva, a todos deve ser dado o direito de acessar o mundo digital, mas sem enfiar a tecnologia garganta abaixo do cidadão. “Parte da população não precisa da internet para viver bem, outros nem se preocupam tanto com ela.” (Fredric Litto). Antes da liberdade digital, vem a liberdade de escolher viver sem a internet.
Por falar em liberdade, potenciais ferramentas para chegar até ela não faltam. As mais radicais como o Wikipédia (http://www.wikkipedia.com) e Wikinews (http://www.wikkinews.com), dão uma idéia de absoluta liberdade que até pode ser confundida com anarquia. Wikipédia nasceu nos EUA como projeto da Wikimedia Foundation. É uma enciclopédia virtual construída por qualquer um que se habilite. O sujeito vai lá e cria um artigo-verbete para explicar um conceito, uma coisa, um ser vivo. Só que o funcionamento não é como numa enciclopédia formal. No Wikipédia , há espaço para diferentes versões sobre o mesmo assunto, ainda que se deva buscar imparcialidade. O Wikinews vai na mesma linha. Todos os internautas são potenciais editores de notícias. Alguém escreve alguma coisa sobre um fato. E lá vai outro contrapor ou até modificar o que está escrito. A expressão é livre, sem linha editorial, qualquer um escreve do jeito que julga melhor, e é editado da maneira que o outro imagina. E o internauta deve submissão à veracidade dos fatos: nada de invenções.
“Wikipédia e Wikinews são plataformas que enunciam os postulados da cidadania global, pois surgem como espaços construídos coletivamente, e imbuídos da ética do copyleft , princípio segundo o qual o conteúdo disponível na net pode ser copiado, recriado, remixado” Giselle Beiguelman

Copyleft tem a ligação com o conceito do creative commons, que significa disponibilizar na internet, sem nenhum custo, a obra de autores. Os direitos autorais deixam de ser completamente protegidos – em vez de copyright, entra em cena o copyleft. No lugar de “todos os direitos reservados” (all rights reserved), surgem “alguns direitos reservados” (some rights reserved). Interessante notar que, na mídia digital, a diferença entre o original e a cópia tende a se diluir, diferentemente das perdas nas cópias feitas em suportes como a fotocópia e o vídeo analógico.

Considerações Finais
Pesquisa referente a 2004, feita pelo Ibope em oito países da América Latina, mostra que os 40% mais pobres da população brasileira são, junto com os mexicanos, os que menos acessam (apenas 10%) a internet, na comparação desse segmento com a média dos seus vizinhos continentais – 14%. Na faixa dos 10% mais ricos, ao contrário, 82% dos brasileiros navegam, acima da média latino-americana de 73%. Quando comparados quatro países (Argentina, Brasil, Chile e México), o brasileiro é o que paga mais caro para ter um computador em casa: US$ 833, equivalente a 11,1% da renda média brasileira per capita. Na Argentina, o preço é de US$ 492 ou 4,5% da renda média per capita argentina.
Essas informações se tornam um tanto assustadoras quando se sabe que o ciberespaço é o local onde existe a possibilidade de surgir uma inteligência construída em rede e uma nova cultura, ao menos em teoria, menos autoritária e mais vulnerável a contestações e modificações efetivas. Mas se as pessoas não têm condições de comprar a estrutura tecnológica para se ligar à web, como vão ajudar a construir esse, até o momento apenas ideal, mundo plural de novos saberes?
Penso que o Estado é que deve promover a inclusão digital, porque os setores excluídos não têm como pagar a tecnologia e o setor privado, quando investe, é pela responsabilidade social, quando se tenta colar uma boa imagem à marca da corporação. A inclusão digital deve ser encarada como uma questão pública como, por exemplo, a saúde e a educação.
“O direito de acesso à net deve ser encarado pelos governos como direito ao transporte e à educação. É requisito mínimo para se promover cidadania, e por isso não pode estar condicionado à renda para que o apartheid em que vivemos seja minado”. Giselle Beiguelman
No começo da década de 50, apenas famílias ricas tinham televisão nos EUA, e com o passar dos anos os aparelhos televisivos se espalharam pelos EUA, acontecendo o mesmo no Brasil. Quando as pessoas mais excluídas perceberem os benefícios que a internet traz, e tiverem uma formação cultural e intelectual mais forte, o acesso delas ao mundo virtual será uma questão de tempo. Vão entrar gradativamente em contato com a web, e isso vai possibilitar à internet ser tão democrática e plural quanto se promete.

TECNOLOGIA RAID

0

 

Este artigo visa explicar os conceitos da tecnologia RAID, muito utilizada para operações críticas, onde não se pode perder dados ou ter serviços fora de funcionamento. Para um usuário normal, a perda de dados até que pode não fazer muita falta (mesmo que tenha, inclusive, valores sentimentais). Mas para empresas ou profissionais, a perda de informações pode significar prejuízos enormes. A tecnologia RAID, já consolidada e usada há alguns anos, é uma forma bastante eficiente de proteger informações e no caso de empresas, garantir a permanência de seus negócios.

O que é RAID

RAID é a sigla para Redundant Array of Inexpensive Disks. Sua definição em português seria “Matriz Redundante de Discos Independentes”. Trata-se de uma tecnologia que combina vários discos rígidos (HD) para formarem uma única unidade lógica, onde os mesmos dados são armazenados em todos (redundância). Em outras palavras, é um conjunto de HDs que funcionam como se fossem um só. Isso permite ter uma tolerância alta contra falhas, pois se um disco tiver problemas, os demais continuam funcionando, disponibilizando os dados. O RAID surgiu a mais de 15 anos, através de pesquisas na Universidade de Berkesley, na Califórnia, Estados Unidos.

Para que o RAID seja formado, é preciso utilizar pelo menos 2 HDs. O sistema operacional, neste caso, enxergará os discos como uma unidade lógica única. Quando há gravação de dados, os mesmos se repartem entre os discos do RAID (dependendo do nível). Com isso, além de garantir a disponibilidade dos dados em caso de falha de um disco, é possível também equilibrar o acesso às informações, de forma que não haja gargalos.

Nos sistemas atuais, a implementação do RAID pode se dar de três maneiras:

1. Através de Software no próprio equipamento onde está conectado um conjunto de discos (JBOD, sigla para Just a Bunch Of Disks), neste método o processador do próprio equipamento é sobrecarregado com o processamento relacionado ao método de RAID utilizado. Um exemplo típico seria um servidor com dois ou mais discos (geralmente hot-swap) ligados através de uma simples controladora SCSI ou mesmo IDE.

2. Utilizando uma controladora (HBA, Host Bus Adapter) conectado ao barramento do servidor, que gerencia e controla o conjunto de discos (JBOD) . Estas controladoras geralmente incluem módulos de memória para cachê, otimizando o acesso de leitura e gravação dos dados. O sistema operacional enxerga os volumes RAID transparentemente, como se fossem discos simples.

3. Utilizando um gabinete externo que contenha a controladora RAID e o JBOD. Neste modelo a unidade externa é conectada à uma controladora SCSI ou de FC (Fibre Channel), sendo reconhecida pelo sistema como um volume de discos simples. Alguns modelos permitem o gerenciamento por console serial e alguns até mesmo pela LAN, inclusive com interfaces HTTP.

Em um volume RAID, a informação é distribuída em Stripes. Um Stripe é um conjunto de setores de cada um dos discos do JBOD. Cada Stripe constitui uma célula individual de dados do volume RAID.

Os níveis de RAID

Existem diversos tipos de RAID, cada um com características próprias, e alguns tipos ainda podem ser agrupados. Segue a descrição dessas modalidades de RAID:

RAID nível 0 – Este nível também é conhecido como “Striping” ou “Fracionamento”. Nele, os dados são divididos em pequenos segmentos e distribuídos entre os discos. Este nível não oferece tolerância a falhas, pois não existe redundância. Isso significa que uma falha em qualquer um dos HDs pode ocasionar perda de informações. Por essa razão, o RAID 0 é usado para melhorar a performance do computador, uma vez que a distribuição dos dados entre os discos proporciona grande velocidade na gravação e leitura de informações. Quanto mais discos houver, mais velocidade é obtida. Isso porque, se os dados fossem gravados em um único disco, esse processo seria feito de forma seqüencial. Com o RAID, os dados cabíveis a cada disco são gravados ao mesmo tempo. O RAID 0, por ter estas características, é muito usado em aplicações de CAD e tratamento de imagens e vídeos.

Segue um esquema de um volume RAID 0 com 5 discos:

Stripe Disco 1 Disco 2 Disco 3 Disco 4 Disco 5
A 1 2 3 4 5
B 6 7 8 9 10
C 11 12 13 14 15
D 16 17 18 19 20
E 21 22 23 24 25

Nessa tabela, as letras identificam cada um dos stripes do volume RAID, e cada um dos números são os blocos do stripe que são distribuídos por cada disco do JBOD. Esses blocos são chamados de chunks.

RAID nível 1 – também conhecido como “Mirroring” ou “Espelhamento”, o RAID 1 funciona adicionando HDs paralelos aos HDs principais existentes no computador. Assim, se por exemplo, um computador possui 2 discos, pode-se aplicar mais um HD para cada um, totalizando 4. Os discos que foram adicionados, trabalham como uma cópia do primeiro. Assim, se o disco principal recebe dados, o disco adicionado também os recebe. Daí o nome de “espelhamento”, pois um HD passa a ser uma cópia praticamente idêntica do outro. Dessa forma, se um dos HDs apresentar falha, o outro imediatamente pode assumir a operação e continuar a disponibilizar as informações. A conseqüência neste caso, é que a gravação de dados é mais lenta, pois é realizada duas vezes. No entanto, a leitura dessas informações é mais rápida, pois pode-se acessar duas fontes. Por esta razão, uma aplicação muito comum do RAID 1 é seu uso em servidores de arquivos.

Segue um esquema de um volume RAID 1:

Setor Disco 1 Disco 2
#0A 1 1
#0B 2 2
#0C 3 3
#0D 4 4
#0E 5 5
#0F 6 6
RAID nível 2 – este tipo de RAID, adapta o mecanismo de detecção de falhas em discos rígidos para funcionar em memória. Assim, todos os discos da matriz ficam sendo “monitorados” pelo mecanismo. Atualmente, o RAID 2 é pouco usado, uma vez que praticamente todos os discos rígidos novos saem de fábrica com mecanismos de detecção de falhas implantados.

RAID nível 3 – neste nível, os dados são divididos entre os discos da matriz, exceto um, que armazena informações de paridade. Assim, todos os bytes dos dados tem sua paridade (acréscimo de 1 bit, que permite identificar erros) armazenada em um disco específico. Através da verificação desta informação, é possível assegurar a integridade dos dados, em casos de recuperação. Por isso e por permitir o uso de dados divididos entre vários discos, o RAID 3 consegue oferecer altas taxas de transferência e confiabilidade das informações. Para usar o RAID 3, pelo menos 3 discos são necessários.

Segue um esquema descrevendo um volume RAID 3:

Stripe Disco 1 Disco 2 Disco 3 Disco 4 Disco 5
A 1 1 1 1 P
B 2 2 2 2 P
C 3 3 3 3 P
D 4 4 4 4 P
E 5 5 5 5 P

RAID nível 4 – este tipo de RAID, basicamente, divide os dados entre os discos, sendo que um é exclusivo para paridade. A diferença entre o nível 4 e o nível 3, é que em caso de falha de um dos discos, os dados podem ser reconstruídos em tempo real através da utilização da paridade calculada a partir dos outros discos, sendo que cada um pode ser acessado de forma independente. O RAID 4 é indicado para o armazenamento de arquivos grandes, onde é necessário assegurar a integridade das informações. Isso porque, neste nível, cada operação de gravação requer um novo cálculo de paridade, dando maior confiabilidade ao armazenamento (apesar de isso tornar as gravações de dados mais lentas).

Segue um esquema de um sistema com RAID 4, com 4 discos para dados, um de paridade e um de hot spare:

Stripe Disco 1 Disco 2 Disco 3 Disco 4 Disco 5 Disco 6 (spare)
A 1 2 3 4 P –
B 5 6 7 8 P –
C 9 10 11 12 P –
D 13 14 15 16 P –
E 17 18 19 20 P –
RAID nível 5 – este é muito semelhante ao nível 4, exceto o fato de que a paridade não fica destinada a um único disco, mas a toda a matriz. Isso faz com que a gravação de dados seja mais rápida, pois não é necessário acessar um disco de paridade em cada gravação. Apesar disso, como a paridade é distribuída entre os discos, o nível 5 tende a ter um pouco menos de performance que o RAID 4. O RAID 5 é o nível mais utilizado e que oferece resultados satisfatórios em aplicações não muito pesadas. Este nível precisa de pelo menos 3 discos para funcionar.

Segue um esquema de um sistema RAID 5, com 6 discos, note que a paridade é distribuída sequencialmente entre os discos de dados do JBOD, não existindo um disco exclusivo com essa finalidade:

Stripe Disco 1 Disco 2 Disco 3 Disco 4 Disco 5 Disco 6
A 1 2 3 4 5 P
B 7 8 9 10 P 6
C 13 14 15 P 11 12
D 19 20 P 16 17 18
E 25 P 21 22 23 24

RAID 50 – O RAID 50 é a construção de um volume RAID 0 distribuído em diversos (dois ou mais) volumes RAID 5, de forma a aumentar o número de manipuladores envolvidos nas operações de acesso aos volumes.

RAID 0 + 1 – O RAID 0 + 1 é uma combinação dos níveis 0 (Striping) e 1 (Mirroring), onde os dados são divididos entre os discos para melhorar o rendimento, mas também utilizam outros discos para duplicar as informações. Assim, é possível utilizar o bom rendimento do nível 0 com a redundância do nível 1. No entanto, é necessário pelo menos 4 discos para montar um RAID desse tipo. Tais características fazem do RAID 0 + 1 o mais rápido e seguro, porém o mais caro de ser implantado. A ilustração abaixo ilustra este tipo de RAID:

RAID 6 – É um padrão relativamente novo, suportado por apenas algumas controladoras. É semelhante ao RAID 5, porém usa o dobro de bits de paridade, garantindo a integridade dos dados caso até 2 dos HDs falhem ao mesmo tempo. Ao usar 8 HDs de 20 GB cada um em RAID 6, teremos 120 GB de dados e 40 GB de paridade.

RAID 10 – Este sistema combina características do RAID 0 e RAID 1, daí o nome. O RAID 10 pode ser implementando em sistemas com 4 discos ou mais, sendo obrigatório um número par (6, 8, etc.). Metade dos discos armazena dados e a outra metade armazena uma cópia. A metade que armazena dados é combinada, formando um sistema RAID 0, aumentando a performance, porém mantendo a confiabilidade, já que temos cópias de todos os dados. Usando 4 HDs de 20 GB em modo 10, teremos 40 GB de dados e o dobro de desempenho que em um HD sozinho.

RAID 53 (ou 5+3) – Ao contrário do que o nome sugere, este modo é uma combinação dos modos 3 e 1. O RAID 53 pode ser implementado em sistemas com pelo menos 5 HDs. Os dois primeiros HDs formam um sistema RAID 3, com os dados distribuídos entre eles. Os dois HDs seguintes formam um sistema RAID 0, enquanto o último armazena códigos de paridade de todos. Este sistema apresenta um balanço entre as boas taxas de transferência do RAID 3 e a boa performance ao ler vários arquivos pequenos do RAID 0. Porém, não existe 100% de garantia de recuperar todos os dados caso um dos HDs falhe. É um modo pouco usado.

Tipos de RAID

Existem 2 tipos de RAID, sendo um baseado em hardware e o outro baseado em software. Cada uma possui vantagens e desvantagens. O primeiro tipo é o mais utilizado, pois não depende de sistema operacional (pois estes enxergam o RAID como um único disco grande) e são bastante rápidos, o que possibilita explorar integralmente seus recursos. Sua principal desvantagem é ser um tipo caro inicialmente. A foto ao lado mostra um poderoso sistema RAID baseado em hardware. Repare que na base da direita estão armazenados vários discos:

O RAID baseado em hardware, utiliza dispositivos denominados “controladores RAID”, que podem ser, inclusive, conectados em slot PCI da placa-mãe do computador. Já o RAID baseado em software não é muito utilizado, pois apesar de ser menos custoso, é mais lento, possui mais dificuldades de configuração e depende do sistema operacional para ter um desempenho satisfatório. Este tipo ainda fica dependente do poder de processamento do computador em que é utilizado.

Conclusão

A tecnologia RAID é um dos principais conceitos quando o assunto é armazenamento de dados. Sua eficiência é comprovada por se tratar de uma tecnologia em uso há vários anos e que mesmo assim “não sai de moda”. Grandes empresas, como a Intel, oferecem soluções de RAID e essa tecnologia é possível de ser encontrada até mesmo em computadores domésticos. É muito provável que o RAID ainda venha a apresentar novos meios de funcionalidades, ampliando seu uso para os mais diversos tipos de necessidade de armazenamento e acesso à dados.

Teoria Geral de Sistemas

0

Autoria: Antonio Carlos

I n t r o d u ç ã o

O mundo começou a ficar globalizado no início dos anos 80, quando a tecnologia de informática se associava a tecnologia de telecomunicações e com a queda das barreiras comerciais. Existe interligação acelerada dos mercados internacionais, possibilidade de movimentar grandes quantias de valores em segundos, é a “Terceira Revolução Tecnológica” (processamento, difusão e transmissão de informações).

O mercado financeiro é uma massa mundial dentro da qual se aposta em tendências conflitantes, modelos de empresas, abertura de comércios, a mundialização das marcas de produtos, mais ágil, viabiliza o fechamento de negócios em segundos. O mercado financeiro saiu da mão dos bancos. Os especuladores ganharam maior poder de fogo. Em poucos instantes, o valor de negócios pode ganhar transformações radicais.

A globalização é um fenômeno com ramificações industriais, de prestação de serviços, comerciais ou financeiras, graças a queda do custo da comunicação e as novas tecnologias de troca de dados. A rapidez, o barateamento e a confiabilidade caracterizam a globalização do ponto de vista tecnológico. A Velocidade da informação pelo mundo é a característica atual da globalização.

O desemprego é um drama nacional dos países mais pobres, que perdem com a desvalorização das matérias-primas que exportam e o atraso tecnológico. A globalização não beneficia a todos de maneira uniforme. Uns ganham muito, outros ganham menos, outros perdem. Exigem-se menores custos de produção e maior tecnologia. A mão-de-obra menos qualificada é descartada. A globalização está concentrando renda, os países ricos ficam mais ricos, e os pobres mais pobres, e os motivos são diversos entres eles subsidiar os produtos agrícolas nos países ricos, inviabilizam os pobres, e outros motivos econômicos a mais.

O que é globalização?

Existem diversas definições, variando do ponto de vista de cada um.

Segundo alguns, a explicação mais didática está no teorema do economista Eduardo Gianetti da Fonseca: “ O fenômeno da globalização resulta da conjunção de três forças poderosas: 1) a terceira revolução tecnológica (tecnologia ligada à busca, processamento, difusão e transmissão de informações; inteligência artificial; engenharia genética); 2) a formação de áreas de livre comércio e blocos econômicos integrados (como o Mercosul, a União Européia e o Nafta); 3) a crescente interligação e interdependência dos mercados físicos e financeiros, em escala planetária”.

O jornal francês “Le Monde” discorda. Usando o termo “mundialização”, ele define globalização como sendo “ a mundialização é bem mais que uma fase suplementar no processo de internacionalização do capital industrial em curso desde faz mais de um século”. E lembra que “o comércio entre nações é velho como o mundo, os transportes intercontinentais rápidos existem a vários decênios, as empresas multinacionais prosperam já faz meio século, os movimentos de capitais não são uma invenção dos anos 90, assim como a televisão, os satélites, a informática”. O que “Le Monde” chama de “novidade” é “a desaparição do único grande sistema que concorria com o capitalismo, o comunismo soviético”. O fim do comunismo permite globalizar o capitalismo, com todas as implicações decorrentes: aumento no fluxo de comércio, de informação e de expansão das empresas multinacionais em mercados antes fechados.

O especialista Anthony McGrew lista três tendências nos analistas da globalização: 1) os hiperglobalizantes – os que acham que a globalização define uma nova época na história da humanidade; 2) os céticos – os que entendem que os fluxos atuais de comércio, investimento e mão-de-obra não são superiores aos séculos passado; 3) os transformalistas – admitem que os processos contemporâneos de globalização não têm precedentes. Têm uma visão intermediária. Apontam um novo padrão de inclusão e exclusão social na economia globalizada.

Não há uma definição que seja aceita por todos. Ela está definitivamente na moda e designa muitas coisas ao mesmo tempo, define uma nova era da história humana.

Globalização e o Mercado Financeiro

O mercado financeiro internacional tem poder, adquirido pelos fatores da desregulamentação dos anos 80 e o avanço tecnológico nas comunicações, fazendo com que capitais percorram o mundo expressivamente.

Acabaram-se os controles sobre movimentação de capital, ao mesmo tempo em que mudou a face do mercado financeiro. A hegemonia dos bancos, como geradores de empréstimos, acabou. Subiu o mercado de títulos, emitidos por instituições financeiras e empresas, como os títulos comprados por diversos investidores ao redor do mundo, especialmente por meio de fundos de pensão e fundos de investimento, que tiveram um crescimento vertiginoso.

O avanço das comunicações e a liberdade de fluxos de capitais uniram os mercados. Hoje, muitas instituições financeiras operam 24 horas por dia. Abrem o dia na Ásia, começam a operar na Europa quando já é janta na Ásia e abrem os negócios na América quando os Europeus estão terminando de jantar. Por esta razão, qualquer choque sobre o mercado tende a se propagar sem paradas.

Outro componente que torna o mercado financeiro internacional assustador é o volume do dinheiro movimentado por negociações derivadas de alguma outra. Negocia-se no mercado futuro uma operação financeira de compra e venda que tem como referência a variação do preço de um ativo. Esta montanha de papéis e diversos investidores são capazes de reagir, em questão de segundos, a boas e más notícias.

A globalização dos mercados financeiros torna esses movimentos rápidos, violentos e mortais. Uma inconsistência macroeconômica poderia se arrastar por muitos anos e provocar uma lenta desvalorização na economia de um país em questão de semanas. O risco da globalização financeira existe e a multiplicação do volume de papéis financeiros em relação à produção real pode acabar.

Existe uma lógica no movimento de capitais. Um princípio continua válido: para países que mantêm políticas econômicas consistentes, a globalização financeira pode ser mais uma oportunidade do que um risco.

Tecnologia na Globalização

O mundo passou por uma integração comercial importante, mas não podia trocar informações na velocidade e na quantidade de hoje. O preço da chamada telefônica caiu 90% entre os anos 70 e hoje, e a Internet pode barateá-la ainda mais. A comunicação global ainda não foi democratizada: A África tem menos de uma linha para cada 100 habitantes enquanto na América do Norte, Oceania e Europa a taxa supera 25 para 100 habitantes. Fusões de empresas da área da informática, telefonia e comunicação mudam o mercado da informação. Avanço tecnológico andou lado a lado com o fortalecimento do mercado financeiro.

A indústria da telecomunicação vive uma explosão sem precedentes, somada ao barateamento e à popularidade da informática. Paralelamente, começa a se esboçar uma convergência entre a infra-estrutura de comunicação e a indústria da mídia, à medida que ambas se digitalizam. É essa conjunção que torna possível um mundo globalizado nos moldes de hoje.

Três fatores vão derrubar ainda mais os custos de telecomunicação: 1) avanços técnicos que reduzem o custo da infra-estrutura; 2) o excesso de capacidade de transmissão internacional – que acaba transbordando para ligações de longa distância nacionais; 3) desregulamentação e erosão das margens de lucro. A queda dos monopólios de comunicação e a revisão dos acordos tarifários internacionais devem reduzir as altíssimas margens de lucro das empresas telefônicas.

Embora as empresas não tenham chegado a achar um caminho para a convergência, a infra-estrutura se aproxima dela. Até pouco tempo havia uma distinção clara entre redes de telefonia, de dados e de broadcast (TV e rádio).

A tendência é que telecomunicações, difusão de rádio e TV e transmissão de dados passem a circular indiferentemente por fibras óticas e satélites. Apesar das barreiras políticas e econômicas à integração das comunicações, do ponto de vista tecnológico os avanços nunca foram tão rápidos. Apontam para uma comunicação mais ubíqua, rápida e barata.

Globalização e os Blocos Comerciais

A área de livre comércio é um acordo que permite a adoção progressiva de tarifas alfandegárias comuns entre os países-membros. Com parceiros fora do bloco, cada país estabelece regras próprias. Se os membros decidem adotar uma política única com quem não integra o grupo, forma-se uma união aduaneira. O mercado comum vai além, liberaliza o trânsito de pessoas, bens e capitais, e não só de mercadorias. Quando padronizam-se as políticas econômicas dos membros rumo a uma moeda única, chega-se à união econômica.

A formação de Blocos Comerciais Regionais traz uma dúvida: trata-se de um estágio necessário para um mundo sem barreiras econômicas ou, pelo contrário, resultará, no futuro, na criação de novas restrições? Há o temor de que países como o Brasil, antes fechados economicamente voltem a reestruturar barreiras em torno de seus grupos locais de comércio. Outro risco é deixar países politicamente importantes fora dos Blocos, como a China e Rússia. A resolução do impasse estaria na capacidade de esses blocos estarem aos demais países as vantagens que existem apenas para os seus membros. A globalização produziu, em matéria de comércio internacional, este dilema.

Idêntico problema cerca os acordos comerciais regionais, como o Mercosul: grandes especialistas em comércio internacional e até as entidades que supervisionam não têm certeza se os blocos são apenas etapas necessárias e positivas na direção de um mundo sem barreiras ou se minifortalezas que, no limite, impedirão a queda de todas as fronteiras.

Esse conflito entre globalização e regionalismo é latente. Ao liberalizar o comércio só com seus vizinhos, os países estão, por definição, discriminando os que não têm a sorte de estar no clube local. A questão e saber se os “clubes locais” caminham para integrar-se a outros clubes, de forma que haja um grande bloco, do tamanho do planeta, ou se tendem a fechar-se em três ou quatro grandes conglomerados em guerra comercial uns com os outros.

Na falta de um projeto global, o risco é o de que cada superbloco se feche para os demais, o que, além do risco de uma guerra comercial, marginalizaria países gigantescos, como China e Rússia, que, até agora, entraram em sistema algum. É sintomático que a União Européia e os EUA estejam empenhando em uma surda guerra para ver qual dos dois consegue fechar antes o acordo com o bloco sul-americano. No Brasil também há uma surda guerra de argumentos entre os pró-Alca e os pró-União Européia.

A “Rodada Uruguai” (marco no processo de globalização) começou em 1986 em Montividéu, arrastou-se por quase oito anos e terminou com o mais abrangente pacote de redução das barreiras ao comércio planetário. Seu impacto mais visível e até certo ponto quantificável surge da redução das tarifas alfandegárias para importações.

A “Rodada Uruguai” foi além da negociação sobre derrubada de barreiras para exportar mercadorias. Introduziu na agenda mundial as chamadas áreas novas do comércio, em especial o vastíssimo campo de serviços. É uma rubrica que cobre desde telecomunicações a transporte marítimo, passa por serviços financeiros e atinge até compras governamentais.

A “Rodada Uruguai” não fechou acordo algum na área de serviços, mas estabeleceu uma agenda de negociações que vai até o ano 2000. Já foram assinados acordos para abrir o mercado de telecomunicações, o que prevê derrubar, até o ano 2000, todas as barreiras para importação de equipamentos/serviços de tecnologia de informação (ou informática).

O impacto da liberalização no setor de serviços tende a superar o da derrubada das barreiras para mercadorias. Trata-se do setor mais dinâmico da economia mundial e do único que ainda gera empregos, ante a estagnação da indústria e a mecanização da agricultura, que se torna crescentemente irrelevante.

A “Rodada Uruguai” introduziu modestas aberturas , mas jogou as negociações definitivas para o ano 2000. Motivo óbvio: tanto EUA como a União Européia subsidiam seus produtores agrícolas e recusam-se a abrir mercados para a competição com produtos do mundo subdesenvolvido ou em desenvolvimento. Por trás dos países ricos, há um número relativamente pequeno de empresas transnacionais que determinam a agenda. O comércio entre filiais e matrizes de multinacionais representa aproximadamente 1/3 do comércio mundial, e as exportações das multis, as companhias que não são subsidiárias, delas cobrem outro terço.

Essa concentração de poder econômico pode limitar a concorrência, reduzindo os ganhos para os consumidores e economias nacionais. Não abriu lugar à mesa de negociações para os consumidores, que tanto podem ser as vítimas como os beneficiários da globalização.

Globalização e os Estados

Na balança de poder do mundo, o Estado muitas vezes se enfraquece diante do sistema financeiro globalizado. Fruto de uma época ideologicamente confusa (a crença de um sistema único e infalível, o capitalismo, que emergiu após a queda do Muro de Berlim) a situação mostra-se instável para os Estados emergentes.

O triunfo de 1989, ano em que o Muro de Berlim ruiu, parecia tão certo que chegou-se a prever o fim da história. Em 1995 quando tudo se caminhava para a consolidação da onda liberal, o capitalismo começou a investir contra si próprio; vieram a crise do México, a quebra do Banco Barings e, agora o crash das bolsas.

Sob os efeitos da globalização, um vírus inoculado na Bolsa de Hong Kong espalhou-se pelo mundo em outubro/97. No Brasil dobrou-se as taxas de juros – recurso para tentar atrair os capitais especulativos que batiam em retirada – causando alta dos crediários. A crise começou em Hong Kong e invadiu o lar de cada brasileiro.

Alguns países estão sob o risco porque não seguem à risca as regras do sistema liberal – encontram-se com a moeda supervalorizada, deficts em suas balanças e despesas públicas maiores do que as receitas. Evidente que o interesse que move a gangorra das bolsas não é o social, mas o da especulação.

Cultura Global

A globalização cultural é tomada como ideologia fundamental de um plano de instrução de formação que tomará conta do planeta, que resultará na configuração de um mundo integrado e organizado no modelo de um gigantesco Estado-Nação.

Essa visão é polemica internacionalmente. Não se pode transformar o mundo sem ver o desenvolvimento da informática, robótica, comunicações por satélite, Internet e modernos meios de transporte. O clima de euforia flui como no século 19, com as maravilhas inventadas nessa época. É natural que esse mundo transformado pela internacionalização, aflora a enpolgação da comunidade integrada.

Uma das características importantes do que se entende hoje por cultura global é justamente a maior visibilidade de manifestações étnicas, regionalistas ou vindas de sociedades excluídas. Talvez as nações ocidentais jamais tenham-se visto na contingência de conviver com a diversidade cultural no interior de suas fronteiras.

As “Terceiras Culturas” são um conjunto de práticas, conhecimentos, convenções e estilos de vida que desenvolvem de modo a se tornar cada vez mais independentes dos Estados-Nação. Formam se em diversas áreas e colocam em conflito idéias em que as vítimas periféricas têm apenas duas alternativas: deixar-se subjugar ou erguer forças para evitar sua incorporação à modernidade ocidental.

Se encontra em curso uma nova etapa da internacionalização. Não há dúvida de que o mundo e cada vez mais percebido como um lugar; não há dúvida que as culturas nacionais geram uma cultura global, em que os indivíduos dos quatros cantos do planeta podem se reconhecer; não há dúvida de que essa cultura global surge da intensificação dos contatos entre povos e civilizações vinculados à expansão econômica e técnica.

Globalização e Marketing

Uma empresa globalizada seria aquela que opera seguindo uma lógica operacional mundial, cujo objetivo seja maximizar benefícios e minimizar custos não importando onde esteja a base de produção e que obedeça uma estratégia de marketing única para todos os países onde vende seu produto. Uma empresa transnacional, o mercado seria uma determinada região do mundo, enquanto para uma multinacional o mercado seria o planeta inteiro.

Uma característica essencial da empresa global atualmente seria a facilidade para identificar locais onde existam as condições mais atraentes para suas operações. Fica mais fácil tomar conhecimento sobre as condições de trabalho em um determinado país e compará-las com a situação em outras partes do mundo. Com os serviços de informação, o aumento nas taxas de juros de um país (que atende a encarecer os custos de produção e a favorecer as aplicações financeiras) chega ao conhecimento dos investidores e empresários de forma imediata.

Somada à crescente desregulamentação não só dos mercados financeiros, mas também em outras áreas, inclusive no que se refere à legislação trabalhista, ficou praticamente liberada a movimentação de capital, trabalho e bens entre os países. Qualquer tendência de elevação dos custos de elevação dos custos de produção em um determinado país pode levar a empresas a trocá-lo por outro onde seja mais barata a fabricação.

No circuito das chamadas empresas transnacionais, o investimento em fábrica deixou de ser privilegiado. A prioridade passou a ser de envestir em marcas. Muitas vezes, a empresa global compra uma campanha local apenas para ganhar uma fatia do mercado, por causa da marca. O crescimento do número dessas companhias e dos negócios por elas realizados é apontado como uma das razões para a expansão do comércio internacional.

O processo de expansão das empresas multinacionais também provoca polêmica por causa das condições de trabalho nas fábricas desses grupos instaladas em países que não se destacam pelo respeito aos direitos dos trabalhadores. Muitas vezes é o mesmo consumidor, no papel de trabalhador, que sofre com a política da empresa transnacionais de fechar uma determinada fábrica ou de promover demissões, alegando a necessidade de reduzir seus custos para aumentar a produtividade.

Globalização e os Países Ricos e Pobres

Ano a ano o fosso que separa os incluídos dos excluídos vem aumentando: os ricos ficam cada vez mais ricos, e os pobres, mais pobres. Em 34 anos a participação dos excluídos na economia global diminuiu em 1,2%. São várias as causa, desde as barreiras alfandegárias punitivas às exportações dos países subdesenvolvidos às leis de proteção de patente que dificultam o acesso das nações pobres a novas tecnológicas.

O comércio mundial cresceu 12 vezes no pós-guerra. Mas foi também o vilão que mais acentuou as desigualdades entre os países ricos e pobres no processo de globalização. Com 10% da população do planeta, os países mais pobres detêm apenas 0,3% do comércio mundial. Para o conjunto de países em desenvolvimento, a globalização impôs perdas comerciais.

O fantasma que ronda a economia globalizada dos países mais ricos é o desemprego. O impacto da revolução tecnológica nas comunicações e na economia ocasiona a perda de empregos no Primeiro Mundo que é a contra partida da criação de postos de trabalho nos países em desenvolvimento. Isso atribuí-se ao fato das nações emergentes estarem avançando na educação de seus habitantes e terem o custo de produção menores.

Existem propostas que sugerem que os governos adotem critérios mais seletivos na hora de abrir as fronteiras à competição internacional, invistam na educação da população mais pobre e fomentem as pequenas empresas. Recomendam, ainda, que formem blocos econômicos regionais para aumentarem o comércio, facilitando o fluxo financeiro e melhorando os meios de transporte. Destaca-se uma proposta de um mecanismo para controle e vigilância com mais agilidade da liquidez internacional, mudanças nas regras do comércio mundial em benefício dos países pobres e uma associação de empresas internacionais para fomentar a redução da pobreza.

É uma tendência em alta. Com as constantes fusões de gigantes empresariais, vai aumentar a importância das multinacionais, em detrimento dos Estados. E é por essa razão que já há quem prefira chamar a globalização de era da englobação.

C o n c l u s ã o

A crise que abala as Bolsas é a mais recente manifestação de um processo em que o poder dos governos, o papel das empresas, o destino dos empregados e as culturas nacionais são transformados pela integração econômica e tecnológica.

Depois do furacão que varreu o mundo, ficou clara a interdependência do mercado financeiro, em que um choque tende a se propagar sem paradas. Com o avanço das comunicações e a liberdade de fluxos de capitais, muitas instituições financeiras operam 24 horas por dia. Movimentação de derivativos, contratos que surgiram com o objetivo para aumentar a segurança de outros investimentos, há dez anos eram insignificantes, hoje têm razões suficientes para transformar todo planeta em questão de segundos, reagindo a boas e más notícias.

A globalização não beneficia a todos de maneira uniforme. Uns ganham muitos, outros ganham menos, outros perdem. Na prática exige menores custos de produção e maior tecnologia. O problema não é só individual, é um drama nacional dos países mais pobres, que perdem com a desvalorização e atraso tecnológico.

Turbo Pascoal

0

Autoria: Ricardo Tolentino

PROJETISTA DA LINGUAGEM PASCAL:

Niklaus Wirth
Professor da Escola Politécnica de Zurique.

ANO DE APRESENTAÇÃO DA LINGUAGEM :

1971

ÁREA DE APLICAÇÃO :

Linguagem de programação estrutura
da para o desenvolvimento de aplicações de uso geral

OBJETO DESTE ESTUDO :

Linguagem Turbo Pascal 6.0, produzida pela Borland Intemational.

CONCEITOS BÁSICOS:

VARIÁVEIS NUMÉRICAS :

integer – Números inteiros entre -32768 e 32767.

real – Números reais de 11 algarismos significativos.

byte – Números inteiros entre 0 e 255.

VARIÁVEIS ALFANUMÉRICAS:

string – Caracteres alfanuméricos entre apóstrofos.
char – String de apenas um caractere entre apóstrofos.

VARIÁVEIS LÓGICAS:

boolean – Assume apenas valores booleanos, que são:
true (verdadeiro) ou false (falso).

OPERADORES ARITMÉTICOS :

* Multiplicação

/ Divisão

+ Soma

– Subtração

OPERADORES RELACIONAIS:

< Menor que > Maior que

= Igual a

<> Diferente de

<= Menor ou igual a >= Maior ou igual a

OPERADORES LÓGICOS:

not – negação

and – e

or – ou

xor – ou exclusivo

COMANDOS DE DECLARAÇÃO DE VARIÁVEIS :

No Turbo Pascal a declaração de variáveis é obrigatória no início do programa pois, caso isso não acorra, o compilador acusará erro de compilação.

Exemplos:

Variável inteira A, real B e booleana C.

Var

A : integer;
B : real;
C : boolean;

Na declaração de uma variável string, necessita-se informar a sua máxima extensão. Esta declaração da extensão reserva uma área fixa na memória para o processamento.

Exemplo:

A variável string R com 13 caracteres, seria assim declarada:

Var

R : string[13];

Para declarar mais de uma variável do mesmo tipo, pode-se proceder das duas seguintes formas:

Var

x, y, z : integer;

ou

x : integer;
y : integer;
z : integer;

EXPRESSÃO DE ATRIBUIÇÃO DE VALORES :

A:=B+5;

O símbolo := equivale á uma flecha ( <- ), indicando que é uma atribuição. PONTO E VÍRGULA: O ponto e vírgula no Turbo Pascal indica o fim do comando e sua presença é obrigatória
INÍCIO E FIM DE PROGRAMA:

Todos os programas em Turbo Pascal devem começar e terminar desse modo:

program Exemplo;
.
.
begin
.
.
.
.
.
end.

O “program” indica o início do programa;

“Exemplo” é um nome qualquer dado ao programa;

“begin” indica o início e ‘end” o fim do processamento.

COMENTÁRIOS:

Os comentários devem ser escritos entre chaves , {….} ou parênteses com asterisco – (*….*). Não há necessidade de terminar a linha do comentário com ponto e vírgula.

Exemplo:

{Exemplo de como escrever um comentário}

(* Pode-se escrever também desta foram *)

COMANDOS DE ENTRADA E SAÍDA:

SAÍDAS DE INFORMAÇÕES NO VÍDEO:

write – Apenas imprime

writeln – Imprime e envia o sinal de mudança de l1nlla (Line Feed)

Tudo o que se deseja imprimir deve vir entre parênteses.

Exemplo 1:
Imprimindo a variável A.

writeln(A);

Exemplo 2:
Imprimindo o texto sempre entre apóstrofos 1′).

writelnl’confirma a Resposta (S/N) ? ‘);

Exemplo 3:

Program Prog01 ;

var

LARGURA, COMPRIMENTO, ALTURA: integer;

begin

LARGURA := 10;
COMPRIMENTO := 3;
ALTURA := 2;
writeln(‘VOLUME = ‘, LARGURA*COMPRIMENTO*ALTURA,’ Cm3′):

end.

O resultado do programa acima ficaria assim no vídeo:
VOLUME = 60 cm3

SAÍDA DE INFORMAÇÕES NA IMPRESSORA:

Os comandos que acionam a impressora são os mesmos do vídeo, ou seja, write e writeIn, acrescidos do parâmetro (lst).

Exemplo:

writeIn(lst,’VOLUME = ‘, LARGURA*COMPRIMENTO*ALTURA,’ cm3′);

OBS.: O comando de mudança de linha (line feed) é dado após a impressão no exemplo anterior. A saida do comando de impressão (VOLUME = 60 cm3) seria a mesma com os comandos abaixo:

write(lst,’VOLUME = ‘);
write(lst,LARGURA*COMPRIMENTO*ALTURA);
write(lst,’cm3′);

ENTRADA DE DADOS:

read – Não inclui “tine feed” após a operação.

readln – inclui “line feed” após operação

Exemplo:

readIn(QUANTIDADE);

OBS.: Quando for necessário mais de uma entrada read ou readIn, os dados a serem digitados não devem ser separados por vírgulas e sim por espaço.

readln(COMPRIMENTO,LARGURA,ALTURA);

OBS.: É conveniente pedir apenas uma entrada de dado por cada comando read ou readIn, para que não ocorra inconvenientes na entrada de textos.

Exemplo:

Program Prog02;

var
C,L,A : integer;

begin

write(‘DlGlTE COMPRIMENTO’);
readln(C);

write(‘DIGITE LARGURA’);
readln(L);

write(‘DIGITE ALTURA’);
readln(A);

writein(‘VOLUME = ‘,c*L*A,’ cm3′);

end.

OBS.: Quando usado o comando writeIn sem variáveis a serem impressas, causará apenas o envio de um line feed (mudança de linha) para a tela ou impressora.

ESTRUTURA DE DECISÃO:

COMANDO lF:

Na estrutura de decisão em PASCAL, utiliza-se os comandos if / then / else / end, conforme apresentados nos exemplos abaixo.

Estrutura de decisão SIMPLES (if/ then / end):

Exemplo:

Program Prog03;
{Estrutura de Decisão Simples}

var

VALOR : real;

begin

write(‘DIGITE UM VALOR NEGATIVO’);
readln(VALOR);

if VALOR > 0 then
begin
writeln(‘FOI DIGITADO UM VALOR POSITIVO !’);
end;

end.

OBS: Observe o END com ponto e vírgula após o if.

Estrutura de decisão COMPOSTA (if / then / else / end):
Na estrutura de decisão composta em PASCAL, é necessário tomar alguns cuidados. O comando end que precede o else do exemplo abaixo, não deve levar ponto e vírgula. O ponto e vírgula ali posicionado, indicaria que já chegou ao fim da atuação do comando if anterior. Portanto, somente o segundo e último end deve receber o ponto e vírgula. Veja os exemplos a seguir:

Program Progo4;
{Estrutura de Decisão Composta}

var
VALOR : real;

begin

writel’DIGITE UM VALOR: ‘);
readIn(VALOR)

if VALOR > lo then
begin
writeln(‘O VALOR É MAIOR QUE 10’);
end
else
begin
writeln(‘o VALOR É MENOR DO QUE lo’);
end;
end.

Program Prog05;

var
VALOR : real;

begin

write(‘DIGITE UM VALOR POSITIVO MENOR QUE 100:’);
readIn(VALOR)

if (VALOR > 0) and (VALOR < 100) then
begin
writeln(‘fol DIGITADO CORRETAMENTE’)j
end
else
begin
writeln(‘fol DIGITADO ERRADO’);
end;

end.

COMANDO CASE:

O comando case é extremamente importante para estruturação de um programa que possua diversas opções de execução, tomando-o bem legível e estruturado, evitando o uso repetido do if.

Exemplo:

Program Prog06;

var

VALOR : integer;

begin
write(‘DIGITE UM NÚMERO ENTRE 0 e 2 INCLUSIVE’);
readIn(VALOR);

case VALOR of

0 : begin
writeIn(‘NÚMERO DIGITADO = ZERO’);
end;

1 : begin
writeIn(‘NÚMERO DIGITADO = UM’);
end;

2 : begin
writeIn(‘NÚMERO DIGITADO = DOIS’);
end;

end; {case)

end.

O comando case oferece uma opção de else (se não). Veja o exemplo abaixo:

Program Prog07;

var

VALOR : integer;

begin
write(‘DIGITE UM NÚMERO ENTRE 0 E 2 INCLUSIVE’);
readln(VALOR);

case VALOR of

0 : begin
writelnl’Número Digitado = zero’);
end;

1 : begin
writeln(‘Número Digitado = um’);
end;

2 : begin
writeln(‘Número Digitado = dois’);
end;

else

begin
writeln(‘VOCÊ DIGITOU FORA DA FAIXA DE 0 A 2 ‘);
end;

end; {case}

end.

OBS: A variável do case pode ser de qualquer tipo até agora citado. Vejamos um exemplo do comando case com uma variável de seleção do tipo char:

Program Prog08;

var
RESP : char;

begin
readIn(RESP);

case RESP of

‘S’ : begin
writeln(‘vocÊ DIGITOU S’);
end;

‘N’ : begin
writeln(‘vocÊ DIGITOU N’);
end;

end; {case}

end.

OBS: A presença dos apóstrofos limitando as letras S e N indica que a comparação deve ser feita em relação a um string.

FUNÇÕES MATEMÁTICAS:

abs(X) – Retorna o valor absoluto de X.

arctan(X) – Retorna o arco tangente de X em radianos.

cos(X) – Retorna o cosseno de X (X deve estar em radianos).

exp(X) – Retoma o valor de e elevado à X.

frac(X) – Retorna a parte decimal (fracionária) de X.

int(X) – Retorna o valor inteiro de X.

ln(X) – Retorna o logaritimo natural ou neperiano de X.

sin(X) ~ Retorna o seno de X (X em radianos).

sqr(X) ~ Retoma o quadrado de X.

sqrt(X) – Retoma a raiz quadrada de X.

POTENCIAÇÃO:

A potenciação A = BC ( A é igual a B elevado à C ) obtem-se da seguinte forma:

A := exp(C*In(B))

FUNÇÕES DE MANIPULAÇÃO DE STRING :

concat(X,Y,…) , Concatena as strings X, Y, …

OBS : Pode-se também usar a soma (+) de strings.

Exemplo:

A :=’AERO’;

B := ‘DINAMICA’;

concat(A,B) retorna AERODINAMICA.

copy(X,Y,Z) – Extrai Z caracteres a partir do Y-ésimo caractere da string X.

Exemplo:

A := ‘AERODINAMICA’;

copy(A,5,4) retoma DINA.

lenght(X) – Retorna o comprimento da string X.

Exemplo:

A := ‘AERODINAMICA’;

lenght(A) retorna 12.

pos(X,Y) – Retorna a posição da string X dentro da string Y. Se não for encontrada retornará 0.

Exemplo:

A := ‘FUMEC’;

B :=’M’;

pos(A,B) retorna 3.

delete(A,B,C) – Remove C caracteres a partir da posição B da string A.

Exemplo:

A:=’PANCADARIA’;

delete(A,3,3); a variável A conterá Padaria.

insert(A,B,C) – Insere A na string B, a partir da posição C.

Exemplo:

A :=’NCA’;

B :=’PADARIA’;

C :=3;

insert(A,B,C); a variável B conterá PANCADARIA.

str(X,Y) – Converte o valor numérico de X num string Y.

Exemplo:

x := 15;

str(X,Y); a variável Y conterá a string 15.

val(X,Y,Z) – Converte a string X em número e atribui à variável Y. A variável Z deve ser inteira e indica o sucesso ou não da conversão. Em caso de sucesso, Z conterá zero, caso contrário, conterá a posição do caractere que ocasionou o problema.

Exemplo:

X :=’1234′;

val(X,Y,Z); a variável Y conterá o número 1234 e Z valerá zero.

FUNÇÕES DE TRANSFORMAÇÃO:

chr(x) – Retorna o caractere cujo código ASCII é X.

Exemplo:

chr(42); retornará o sinal *.

round(X) – Provoca o arredondamento na primeira casa decimal.

Exemplos:

x := 18.5;

round(X) retorna 19.

X := 17.4;

round(X) retoma 17.

trunc(X) – Retorna o maior inteiro não maior que X (menor ou igual a X)

FUNÇÕES ESPECIAIS:

keypressed – É uma função booleana que devolve o valor true se alguma tecla estiver sendo pressionada e false em caso contrário.

random – Retorna um número real randômico entre 0 e 1.

random(X) – Retoma um número real randômico entre 0 e X.

upcase(X) – Se o caractere X do tipo char for minúsculo, converte-o para maiúsculo. Caso contrário, não há alteração.

OBS: As funções e os procedimentos descritos até aqui são chamados predefinidos ou predeclarados. Mais adiante estudaremos como se utilizam as funções e os procedimentos declarados pelo próprio usuário.

ESTRUTURA DE REPETIÇÃO:

COMANDO WHILE:

os comandos a serem repetidos , ou seja, aqueles que serão submetidos ao loop, devem estar limitados por begin e end.

A condição de repetição é testado antes, e portanto, os comandos envolvidos no while podem não ser executados nenhuma vez.

Exemplo: Programa para calcular e imprimir os números inteiros de 0 a 100.

Program Prog09;

var

I : real;

begin

I:=o;

while 1 <= 100 do
begin
writeIn(I);
I := I+1;
end;

end.

As condições que acompanham o while podem ser compostas de not, and, or e xor, tal como o comando if.

COMANDO GOTO:

O comando goto desvia o processamento do ponto em que for encontrado, para outra Iinha do programa que está marcada com um Iabel (rótulo). Este Iabel necessita ser declarado no início do programa.
Este recurso (goto / Iabel) nos permite abandonar de forma “radical” um Ioop, antes que seja executado até o final por vias normais. O goto é um comando “forte” que pode abandonar não só o loop controlado pelo while como também os Ioops gerados pelos outros dois comando de repetição que estudaremos mais adiante (for e repeat).

Exemplo:
O programa abaixo permite a entrada de no máximo dez números para serem somados dentro da variável SOMA, ou até ser digitado zero:

Program Prog10;
var
I, SOMA : integer;
label
FIM;
begin
1 := 0;
SOMA := 0;

while I <= lo do
begin
write(‘DIGITE VALOR: ‘);
readln(NUm);

if NUM o 0 then
begin
SOMA := SOMA + NUM;
end
else
begin
goto FIM;
end;

I := I + 1 ;
end;

FIM:
writeln (‘SOMA DOS NÚMEROS= ‘, SOMA);

end.

COMANDO FOR:

As linhas do programa a serem controladas pelo comando for devem estar entre begin e end;

A variável de controle pode ser somente do tipo integer.

O passo (step) é sempre +1 ou -1.

Exemplo:

Programa para calcular e imprimir os valores numéricos de 1 a 10

Program Prog11;

var
I : integer;

begin

for I :=1 to lo do
begin
writeIn(I);
end;

end.

Desejando decrementar a variável de controle, teremos a seguinte configuração:

Program Prog12;

var
I : integer;

begin

for I := 10 downto 1 do
begin
writeIn(I);
end;

end.

Quando houver necessidade da existência de um for dentro da estrutura de outro for, a escrita do programa ficará assim:

Program Prog131

var
I,J ; integer;

begin

for I := 1 to 10 do
begin
.
for J := 1 to 10 do
begin
.
.
.
end;

.
end;

end.

OBS: O comando repetitivo for deve ser utilizado nos locais em que a quantidade de vezes a ser repetida já está determinada antes da sua execução. Isto significa que não devemos fazer atribuições à variável de controle do for dentro da própria estrutura. Esta variável pode ser utilizada para ser impressa ou para cálculos, mas jamais deve receber algum valor.

COMANDO REPEAT / UNTIL:

O comando repeat controla repetições de trecho de programa tal como o for, mas há duas diferenças fundamentais:

– O número de vezes que se repetirá as linhas de programa situadas dentro do repeat / until não precisa estar predefinido. Os próprios comandos situados entre o repeat e o until podem determinar a saída ou não do loop de repetição.

– A verificação da suficiência ou não da condição de repetição é feita no fila do loop.

Exemplo:

Suponha um programa que só termina quando for digitado um número negativo:

Program Progl 4;

var
VALOR : real;
begin
VALOR := 0;

repeat

writel’DIGITE UM NÚMERO NEGATIVO’) ;
readln(VALOR);

until VALOR < 0; end.
OBS:

– Os comandos a serem repetidos não necessitam ser limitados por begin e end.

– As condições que acompanham o repeat / until podem ser compostas de not, and, or e xor, tal como no comando if.

– Os comandos internos ao repeat / until são executados pelo menos uma única vez.

Outro exemplo:

Program Prog15 ;

var
I : real;

begin
I:=0;

repeat

writeln(I);
I := I + 1;

until I > j 00
end.

OBS:

No repeat e while, o incremento ou decremento da variável de controle deve ser providenciado internamente na lógica por quem desenvolveu o programa.

RESUMINDO:

Os três tipos de comandos de controle de repetição devem ser utilizados visando às seguintes características:

– Comando for:
Utiliza-se no caso de saber o número de repetições antecipadamente e o passo de incremento ou decremento for sempre 1. Não se deve alterar o valor da variável de controle.

– Comando repeat:

Controla a condição de repetição após sua execução. Este comando é sempre executado pelo menos uma vez.

– Comando while:
Controla a condição de repetição antes da sua execução. Pode ocorrer situações em que o comando while não seja executado.

MATRIZES:

A declaração de uma matriz no Turbo Pascal é obrigatória. Por exemplo, para se declarar uma matriz MAT de uma única dimensão (vetor) composta de 50 números inteiros, seria feito da seguinte forma:

var
MAT : array[1..50] of integer;

No caso de uma matriz bidimensional de 50 linhas e 100 colunas, composta de string de 10 caracteres, seria assim:

var
MAT : array[1..50 , 1..100] of string[10];

OBS:
Os elementos que formam as matrizes são conhecidos com variáveis indexadas. Estas variáveis além de serem indexadas, podem ser utilizadas de todas as formas que são utilizadas as variáveis comuns (cálculos, impressões, etc…).

Exemplo:

programa para receber via teclado 5 elementos para serem armazenados no Vetor VET e somá,los na variável TOTAL:

Program Prog16;

var
VET : array[1..5] ofinteger;
TOTAL,I : integer;

begin
TOTAL := 0;
for I :=1to 5 do
begin
write(‘DIGITE ELEMENTO ‘,I,’: ‘);
readIn(VET);
TOTAL := TOTAL + VET;
end;

writeIn(TOTAL);

end.

Outro exemplo:

Programa para receber via teclado os elementos da Matriz MAT, que possui 10 Linhas e 5 colunas:

program Prog 17;
var
LINHA, COLUNA : integer;
MAT : array[1.. lo , 1..5] ofinteger;
begin
for LINHA := 1 to lo do
begin
for COLUNA := 1 to 5 do
begin
writeI’DIGITE ELEMENTO ‘,LINHA,’X’,COLUNA,’:
readln(MAT[LINHA,COLUNA]);
end;
end;
end.

Para transferir todos os elementos de uma matriz MAT para outra matriz chamada COPIA, pode-se utilizar a técnica de acesso a todos os elementos da matriz MAT, usando geralmente o comando for. Supondo que a matriz MAT de uma única dimensão (vetor) estivesse anteriormente carregada, poderíamos fazer da seguinte forma:

.

.
for I := 1 to lo do
begin
COPIA := MAT;
end;
.
.

ou simplesmente:

COPIA := MAT;

A atribuição acima pode ser feita com qualquer matriz, independente de sua dimensão.

PROCEDIMENTOS:

Um procedimento é uma sub-rotina que fica desmembrada da lógica principal do programa e que geralmente é necessário sua execução em vários pontos do programa. Para isto, basta determinar o processamento do procedimento através da referência ao seu nome, que deve ser devidamente declarado e escrito no início do texto do programa. Nas linhas em que for encontrado o nome do procedimento, será determinado a sua execução, e após ser executado, ocorrerá o retomo do processamento para a próxima linha após o nome que ordenou a execução.

Os procedimentos devem vir no início do programa (declarados pelo comando procedure), pois a chamada efetuada pelo programa principal utiliza o próprio nome do procedimento. Isto é necessário por que a medida que o compilador vai avançando no seu trabalho, ele confirma as palavras e as sentenças, para verificar se não há erro de sintaxe. Caso o compilador encontre uma palavra desconhecida, toma-se necessário analisar se foi erro do programador ou uma palavra nova criada por ele. Se a declaração do procedimento não viesse antes da sua utilização, o compilador não teria como distinguir entre um erro e a chamada de um procedimento.

program Prog18 ;

procedure MENSAGEM;
begin
writeIn (‘LTPI – LINGUAGEM TURBO PASCAL’);
end;

{–* PROGRAMA PRINCIPAL *–}
begin

{– MANDA EXECUTAR O PROCEDIMENTO –}
MENSAGEM;
{– ESTE É O PONTO DE RETORNO DO PROCEDIMENTO –}

end.

OBSERVAÇÕES:

O Pascal em si possui poucos comandos e algumas liações e procedimentos pré-declarados dentro de si mesmo. O usuário pode criar a sua biblioteca de procedimentos e enriquecer o vocabulário do TURBO PASCAL. A força desta linguagem passa a depender da pesquisa e da experiência do seu usuário.
Não se pode desviar de um procedimento para outro através do comando goto, ou seja, de um subprograma para outro.

VARIAVEIS LOCAIS E GLOBAIS:

VARIAVEIS LOCAIS:

Para facilitar o entendimento do conceito de variáveis locais, imagine um grande programa (com vários procedimentos) escrito simultaneamente por diversos programadores. Cada programador não precisa preocupar-se com os nomes das variáveis que outro esteja utilizando para desenvolver o seu procedimento. Cada variável só vale dentro do seu respectivo procedimento e deve ser declarada cada vez que se fizer presente. Os valores contidos em variáveis locais perdem-se após a execução do procedimento.

VARIAVEIS GLOBAIS:

Estas variáveis valem para qualquer parte do programa, exceto no caso de ser novamente declarada como variável local dentro de um procedimento. Toda declaração de variáveis é feita no início do programa.

Exemplo:

program Prog19;

{– DECLARAÇÃO DE VARIÁVEIS GLOBAIS–}

var

I: integer;

procedure TESTE;

var

I : integer;
begin
I := 5;
end;

{–* PROGRAMA PRINCIPAL *–}
begin

I := 1;
TESTE;

writeIn(I);

end.

OBSERVAÇÃO: Ao dar RUN no programa anterior, o valor impresso na tela deverá ser 1 e não 5, apesar da variável I ter sido também declarada dentro do procedimento (variável local que perde o seu valor após a execução do procedimento). Esta declaração tornou-a uma variável local e portanto, distinta da I global. Se retirássemos a declaração da variável I que está dentro do procedimento esta seria tratada como variável global e o resultado a ser impresso seria 5.

PASSAGEM DE PARÀMETROS:

Um procedimento pode trabalhar com valores, mesmo que não sejam usadas variáveis globais. Para isto temos um recurso chamado passagens de parâmetro. O grande poder dos parâmetros está nesta correta passagem de valores entre o programa principal/procedimento e o procedimento chamado.

Observe o exemplo abaixo:

Program Prog20;

procedure MULT(A,B : real);
begin
writeIn(A * B);
end;

{–* PROGRAMA PRINCIPAL *–}
begin

MULT (3,5);

end.

OBS.: O programa anterior consiste em um procedimento que imprime o valor do produto de dois números recebidos pela passagem de parâmetros e um programa principal que manda executar o procedimento MULT enviando os valores numéricos 3 e 5 como parametro.

Observações:

– Não foi utilizada nenhuma variável global.

– As variáveis A e B do procedimento não precisam ser declaradas, pois são variáveis de passagem e foram declaradas no início do procedimento na linha do comando procedure.

– O programa principal não utiliza nenhuma variável.

– As variaveis de passagem recebem os valores na mesma ordem em que são declaradas como parâmetros. Isto quer dizer que, para efeito de cálculo dentro do procedimento MULT, o A assumiu o valor 3 e B assumiu o valor 5. . .

Outro exemplo:

Program Prog21;

procedure MULT(A,B: REAL);
var
C : real; (– VARIÁVEL LOCAL — j.

begin
C ;= A * ~~
writeln(C);
end.

{-* PROGRAMA PRINCIPAL *–}
begin

MULT(3,5);

end.

OBS.: Neste programa foi incluída a variável C, que é local, para armazenamento temporário do resultado da multiplicação. É interessante separar cada um dos módulos do programa de forma bem visível para facilitar o acompanhamento, principalmente se os programas forem ficando extensos.

Utilizando somente variáveis globais, não haveria necessidade de passar parâmetros para o procedimento e o programa ficaria assim:

program Prog22;

var
A,B,C : real (– VARIÁVEIS GLOBAIS –)

procedure MULT;
begin
C := A * B;
writeIn (C);
end;

{–* PROGRAMA PRINCIPAL *–}
begin

A := 3 ;
B := 5;
MULT;

end.

OBS.: Neste caso, o writeln poderia estar no programa principal que iria imprimir do mesmo modo o mesmo resultado, desde que estivesse posicionado após a chamada do procedimento.

Há mais um modo de trabalhar com PROCEDIMENTO. Até agora, os valores eram passados a partir de uma chamada para o PROCEDIMENTO. O processo inverso, ou seja, passar valores de um procedimento para o programa principal ou procedimento que o chamou, pode ser efetuado mediante uma pequena alteração na declaração local, acrescentando o comando var.

Exemplo:

program Prog23;

var

A,B,C : real;

procedure MULT(X,Y : real; var Z: real);
begin
Z := X * Y;
end;

{–* PROGRAMA PRINCIPAL *–}
begin

A := 3;
B := 5;
MULT(A,B,C);
writeIn(C);

end.

OBS.: Quando se usa este tipo de declaração do procedimento (usando var), permite-se que um valor seja retomado de um procedimento para utilização fora dele.

No exemplo, a variável local Z passou o valor 15 de volta para a variável global C, quando o processamento retornou do procedimento para o programa principal.

Vejamos os dois exemplos a seguir:

program Prog24;

var
A,B : real;

procedure SOMA(X,Y : real);
begin
X := X + Y;
writeIn (X);
end;

{–* PROGRAMA PIIINCIPAL *–}
begin

A := 2;
B := lo;
SOMA (A,B);
writeIn (A);

end.

OBS.: Os resultados obtidos ao rodar o programa acima são, respectivamente 12 e 2. Observe que a variável global A permanece com o mesmo valor, pois houve apenas a passagem de parâmetro no sentido de ida.

program Prog25;

var
A,B : real;

procedure SOMA(var X,Y : real);
begin
X := X + Y;
writeIn (X);
end;

{–* PROGRAMA PRINCIPAL –}
begin

A := 2;
B := lo;
SOMA(A,B);
writeIn (A);

end.

Desta vez, os resultados impressos são respectivamente 12 e 12. Devido a presença do var na declaração, o valor da variável X foi passado de volta para a variável A ao retornar para o programa principal.

FUNÇÕES:

A estrutura de uma função (function) é muito parecida com um procedimento. Pode-se imaginar que uma função é um procedimento com características especiais quanto ao retorno de valores. No Turbo Pascal, uma função pode ser tão bem elaborada quanto um programa qualquer.

Uma característica que distingue uma função de um procedimento é que a função pode ser impressa, atribuida ou participar de cálculos como se fosse uma variável qualquer.

program Prog26;

var
A,B,C: real;

function PROD(X,Y : real) : real;
begin
PROD := X * Y;
end;

{–* PROGRAMA PRINCIPAL *–}
begin

A := 2;
B := 110;
C := PROD(A,B);
write (C);

end.

OBS.: O resultado impresso será 20.

Na declaração da função, além do que está dentro dos parênteses, há mais uma definição, indicando que a função é do tipo real, ou seja, retorna ao local onde foi chamada, assumindo a condição de uma variável real. Neste caso, a função só assume valores coerentes com essa declaração.

Como uma função pode ser impressa, atribuida ou participar de cálculos como uma variável qualquer, isto nos permite, em vez de utilizar a variável C, imprimir diretamente a função da seguinte maneira:

WRITELN (PROD(A,B));

E teremos o mesmo resultado.

Outro exemplo:

Vejamos uma função que soma dois números inteiros digitados via teclado:

Program Prog27;

var

x,y;integer;

function SOMA(A,B : integer) : integer;
begin
SOMA := A + B;
end;

{-* PROGRAMA PRINCIPAL *–}
begin

readIn (X);
readIn (Y);
writeIn (SOMA (X,Y));

end.

OBS.: Na declaração da função podemos acrescentar a cláusula VAR e obter os mesmos recursos adicionais do procedimento feito desta forma.

program Prog28;

var

A,B,C: real;

function PROD(X : real; var Y : real) : real;
begin
PROD := X * Y;
X := 1
Y := 1
end;

{–* PROGRAMA PRINCIPAL *–}
begin

A := 2;
B := lo;
writeln (PROD (A,B));

end.

Após a chamada da função, as variáveis X e Y terminam valendo 1. Mas na declaração da função somente a variável Y recebe VAR. Isto implica que o valor final de Y é passado de volta ao local onde foi solicitada a função, fazendo com que B passe a tomar-se 1 em vez do valor original l0 Isto tudo não ocorreu com a variável A, que continua valendo 2 tal como antes.

No caso de uma função ser do tipo STRING, deve-se definir primeiro o tipo de dado e depois colocar o nome deste tipo na declaração da função.

Type
STR1O : string[10];

function EXEMPLO( ) : STR1O;

FUNÇÕES E PROCEDIMENTOS PRÉ-DECLARADOS PARA COTROLE DE TELA

O Turbo Pascal possui algumas funções e procedimentos pré-declarados para controle da tela:

clrscr – Comando para limpar a tela.

clreol – Este comando apaga todos os caracteres da linha que estão à direito do cursor.

delline – Apaga a linha onde está o cursor e causa scroll nas linhas seguintes de tal modo que preencha a linha deletada.

insline – Este comando funciona de modo oposto ao delline. Insere uma linha vazia na posição onde está o cursor. Provoca scroll nas linhas seguintes.

gotoxy(X,Y) – Movimenta o cursor para coluna X, linha Y da tela. A contagem das colunas e linhas começa no 1, ou seja, o canto superior esquerdo possui coordenadas (1 ,1).

lowvideo – Diminui a luminosidade dos caracteres na tela.

highvideo – Aumenta a luminosidade dos caracteres na tela.

norrnvideo – Retoma a luminosidade normal.

OUTROS RECURSOS:

delay(X) – Provoca uma pausa no processamento equivalente a X millissegundos. X deve ser definido como número inteiro.

exit – Abandona o bloco corrente. Estando numa sub-rotina, retoma ao bloco onde foi feita a sua chamada. Se usado no programa principal, termina a execução do mesmo.

Halt – Interrompe o processamento do programa e retoma ao nível de sistema operacional.

randomize – Inicializa o gerador de números aleatórios com um valor aleatório.

prograrn Prog29;

var

I: integer;

begin

clrscr;

for I := 1 to 20 do

begin
gotoxy ( lo,();
writeln(‘** LTP1 – FUMEC **’);
end;

end.

prograrn Prog30;

begin

clrscr;
gotoxy(30,08); writel’li Incluir ‘);
gotoxy(30, lo); writel’2] Alterar ‘);
gotoxy(30,12); ~vritel’3] Excluir ‘);
gotoxy(30,14); writel’4] Pesquisar’);
gotoxy(30,16); writel’s] Finalizar’);
gotoxy(30,20); ~vritel’opção ? ‘);

end. ‘

DECLARAÇÃO DE OUTROS TIPOS ESPECIAIS DE DADOS (TYPE):

– SCALAR (ESCALAR);

-SUBRANGE(SUBINTERVALO);

-SET(CONJUNTO);

– RECORD (REGISTRO).

SCALAR
“SCALAR TYPE” é um tipo de dado que se assemelha a um vetor com seus elementos ordenados, sendo que o próprio usuário pode definir os seus tipos de dados. Por exemplo, se criar-mos dados do tipo Dias da Semana (DOMINGO, SEGUNDA, etc), significa que a variável associada a este tipo, somente poderá assumir os dados que são os Dias da Semana.

Exemplo:

program Prog3 1 ;

type
Semana = (DOMINGO,SEGUNDA,TERÇA,QUARTA,QUINTA,SEXTA,SABADO);

var
DIA : Semana;

begin

for DIA := DOMINGO to SABADO do
begin
……….
……….
……….
……….
end;

end.

Observações:

– O comando type foi usado para a declaração (definição) do tipo.

– O tipo de dado Semana é composto pelos valores definidos no programa, que são os Dias da Semana (de DOMINGO a SÁBADO).

– A variável DIA assume valores que são os Dias da Semana e é usada para controlar o comando for.

– A repetição é executada sete vezes e serão atribuídas à variável DIA todas as sete possibilidades definidas.

Um escalar definido pelo usuário não pode ser impresso através de um comando write ou writeIn, devendo ser detectado de modo indireto como no exemplo a seguir., que se utiliza das 4 estações do ano:

prograrn Prog32;

type
Estacoes = (VERÃO, OUTONO, INVEMIO, PRIMAVERA);

var
EST : Estacoes;

begin

for EST := PRIMAVERA downto VERAO do
begin

case EST of

VERÃO : begin
Writeln(‘MUITO CALOR’);
end;

OUTONO : begin
Writeln(‘AS FOLHAS CAEM’);
end;

INVERNO : begin
Writeln(‘MUlTO FRIO’);
end;

PRIMAVERA : begin
Writeln(‘MUITAS FLORES’);
end;

end;

end;

end.

As saídas do programa anterior, serão as seguintes:
MUITAS FLORES
MUITO FRIO
AS FOLHAS CAEM
MUITO c ALOR

No exemplo acima no comando for foi utilizado a cláusula downto, que inverteu a ordem de impressão dos dados tipo Estações.

SUBRANGE (SUBINTERVALO):

Os tipos integer, real, byte, char e boolean também fazem parte dos ESCALARES, sendo que já estão PREDEFINIDOS.
Todos os dados do tipo escalar apresentam subintervalos (subrange) em que a sua existência é VÁLIDA. O tipo de definição de dados conhecido como subrange (subintervalo) possui como característica principal, a utilização de apenas trechos de algo maior e mais completo.

program Prog33.

type
Nalunos = 1..50;

var
ALUNO . Nalunos;

begin

writeln(‘DIGITE O NÚMERO DO ALUNO:’);
readln(ALUNO);
writeIn(ALUNO);

end;

No programa anterior, suponha que o número de alunos que possam pertencer à turma noturna de LPT1 seja 50, surgindo assim, a limitação do seu valor entre 1 e 50. Portanto, não existe a possibilidade de a variável encarregada de controlar este número ultrapassar o limite inferior e o superior. Por esse motivo, declarou-se que o tipo de dados Nalunos está na faixa de 1..50 e que, a variável ALUNO é do tipo Nalunos. O tipo Nalunos é um subintervalo de um ESCALAR predefinido.

Outro Exemplo:

prograrn Prog34;

type
Minusc = ‘a’..’z’;
Meses = (JAN,FEV,MAR,ABR,MAI,JUN,JUL,AGO,SET,OUT,NOV,DEZ);
Prisemest = JAN..JUN;
Segsemest = JUL..DEZ;

Observações:

– No exemplo anterior, o tipo de dados Minusc é um subintervalo do escalar char (Letras minúsculas do Alfabeto).

– O tipo de dados Prisemest (meses do primeiro semestre) e Segsemest (meses do segundo semestre) são subintervalos de um tipo de dados definidos como Meses.

-O Turbo Pascal checa a validade dos subintervalos somente quando a diretiva de compilação R estiver ativada.

CONJUNTO SET:

Os dados do tipo conjunto são reuniões de diversos elementos do mesmo tipo (escalar), exceto os números reais. Vejamos o exemplo abaixo:

prograrn Prog35 ;

type ,,
Numeros = set of byte;

var
PRIMO, ÍMPAR, PAR, FINAL1, FINAL2 : Numeros;

begin

PRIMO := [1,2,3,5,7]; ,
ÍMPAR :# [1,3,5,7,9]; ; ‘
PAR := [2,4,6,8]; /
FINAL1 := PRIMO + ÍMPAR;
FINAL2 := PRIMO * PAR;

end.

O programa acima possui as seguintes características:

– Define-se Numeros como do tipo de dado set of formado por números do tipo byte.
– Definem-se as variáveis de conjunto PRIMO, ÍMPAR, PAR, FINAL1 e FINAL2 como do tipo Numeros.

– Atribuem-se os respectivos números (maior que 0 e menor que 10).

– Executa-se a operação de união (+) e intersecção (*) entre os conjuntos.

– As variáveis de conjunto FINAL1 e FINAL2, conterão os seguintes elementos:

FINAL1 : 1,2,3,5,7,9
FINAL2 : 2

– A operação dos conjuntos obedece às seguintes notações:

Decisões lógicas com conjuntos:

A = B —> A igual a B
A <> B —> A diferente de B
A >= B —> A contém B
A <= B ---> A está contido em B
A in B —> .A pertence aB

Exemplo utilizando o operador in:

program Prog36;

var
LETRA : char;

begin

write(‘DIGITE UMA LETRA MINÚSCULA ENTRE a e f :’);
readln(LETRA);

if LETRA in then
begin
writeIn(‘POSITIVO’);
end
else
begin
writeInI’NEGATIVO’);
end;

end. ‘

Observações:

– O programa anterior imprime ‘POSITIVO’ se a letra digitada estiver conforme o que foi solicitado na mensagem. Caso contrário, o comando if desvia o processamento para imprimir a mensagem ‘NEGATIVO’.

– Um detalhe importante é que o set (conjunto) foi definido na própria sentença do if. Poderia também ser declarado na forma normal, utilizando-se type e var.

ARQUIVOS DE DADOS EM DISCO:

Como sabemos, ao desligar-mos o computador, as informações contidas na memória RAM serão perdidas, pois trata-se de uma memória volátil.

A utilização de uma unidade de leitura e gravação em disco magnético, possibilita o armazenamento magnético permanente daqueles dados da memória RAM, que seriam perdidos ao desligar-mos o computador. Além disso, os discos magnéticos rígidos (WINCHESTERS) possuem espaço de armazenamento várias vezes maior que o da memóriaRAm.

O Turbo Pascal possui três tipos básicos de arquivos em Disco:

– Arquivo de texto;

– Arquivo com tipo definido;

– Arquivo de dados sem tipo definido;

O objetivo do estudo nesta apostila, será o arquivo de dados sem tipo definido (acesso randômico ou aleatório).

DEFINIÇÕES:

REGISTRO:

É um conjunto de Campos de Dados.

CAMPOSDEDADOS:

Os campos de dados são diferentes dados ou informações que relacionados, constituem o Registro. Os Campos de Dados podem ser de vários tipos (real, string, etc…), e devem ser dimensionados de acordo com a necessidade anual e fatura.

ARQUIVODEDADOS:

Agrupamento organizado de informações armazenadas em bytes, que podem ser acessadas quando necessário.

É um conjunto organizado de Registros de informações. Os registros são independentes um do outro, mas possuem sua estrutura intema de campos igual.

BUFFER

Buffer é uma região de memória que tem a mesma extensão e divisão dos campos do registro associado a ele. Esta região serve de “molde” intermediário para se encaixar o registro.
Durante o processamento, ao ser lido um registro, os seus dados serão trazidos para o buffer, tomando-os disponíveis para o processamento.
Para gravar um registro, devemos prepará-lo no buffer e depois mandar gravá-lo no Disco. Isto faz com que os dados que estavam no buffer sejam transferidos para o arquivo. A leitura de um arquivo em disco bem como sua gravação são duas das operações mais lentas que um computador executa. O tempo gasto para uma unidade de disco localizar dados, corresponde a um período de anos para um microprocessador. Pequenas partes da memória denominadas “Buffers” são reservadas para que os dados sejam usados em operações de disco. Os “Buffers” agilizam o processamento, reduzindo a quantidade de leituras e de gravações em disco.

ESTRUTURA DE UM PROGRAMA EM TURBO PASCAL

CABEÇALHO DO PROGRAMA:

Nome do Programa

Diretivas do Compilador

SEÇÃO DE DADOS:

Declarações de Constante

Declarações de Tipo

Declarações de Variável

Declarações de Label

SEÇÃO DE ROTINAS:

Procedures

Funções

SECÃO DA LÓGICA PRINCIPAL.-

Bloco de Programa

DECLARAÇÃO DE UM ARQUIVO DE DADOS DE ACESSO RANDÔNICO

Um registro utilizado no arquivo randômico deve ter a sua extensão física fixa, ou seja, cada campo deve possuir um número fixo de bytes. Devido a esta razão, precisamos definir a máxima extensão dos campos que irão compor este registro.

Exemplo:

Considere um arquivo de um cadastro de ARMAS DE FOGO de uma loja especializada em Caça e Pesca. Este cadastro possui campos que indicam os seguintes

– Tipo de arma (RevolveR, Pistola, Carabina, Espingarda…);
– Fabricante ou marca (Taurus, Rossi, CBC, IMBEL, etc);
– N° de série da arma (ex : FJ70514);
– Calibre (.38, .32, .22, .380, 7.65, 12, 6.35, etc…);
– Acabamento (Inox, Acetinada, Oxidada, etc …);
– Capacidade (6 cartuchos, 5, 13, etc…);
– N° de canos (1 ou 2).

Vamos agora definir a máxima extensão dos campos que irão compor os registros do arquivo de armas:

Tipo 10 bytes;
Marca 6 bytes;
Série 7 bytes;
Calibre 4 bytes;
Acaba 9 bYtes;
Capacid 2 bYtes;
Ncanos 1 byte.

A declaração da estrutura deste arquivo ficaria assim:

type
ARMA = record
TIPO : string[10];
MARCA : string[6];
SERIE : string[7];
CALIBRE : real;
ACABA : string[9];
CAPACID : integer;
NCANOS : byte;
end;

var
Bufferarma : ARMA;

Observações:

– Os campos TIPO, MARCA, SERIE, CALIBRE, ACABA, CAPACID, e NCANOS, formam um registro do tipo ARMA.
– Foi necessário criar e identificar um buffer para leitura e gravação. Este buffer chama-se Bufferarma e sua formatação (molde) é igual a do registro ARMA.

Para trabalharmos inicialmente, com os campos de um registro sem, no entanto, gravar ou ler dados, devemos saber que uma Variável de Campo não pode ser diretamente referenciada. Para fazer-mos a referência precisamos colocar o nome do buffer seguido de um ponto (.) e o nome do campo.

Exemplo:

program Prog37;

type
ARMA = record
TIPO : string[10];
MARCA : string[6];
SERIE : string[7];
CALIBRE : real;
ACABA : string[9];
CAPACID : integer;
NCANOS : byte;
end;

var
Bufferarma : ARMA;

begin

write(‘DIGITE O TIPO DA ARMA:’);
readln(Bufferarrna, TIPO);
wriiteln(Bufferarma, TIPO);
end.

Observações:

– O campo Bufferarma.TIPO foi utilizado para armazenar, mesmo não existindo operações em disco, o dado digitado via teclado, e captado pelo readln.

– O Turbo Pascal admite mais de um campo com o mesmo nome desde que sejam de Buffers diferentes. Para que não haja problemas de diferenciação, toma-se necessário a colocação do buffer correspondente antes do nome do campo.

COMANDOS DE MANIPULAÇÃO DE ARQUIVOS:

assign() – Associa um Identificador de arquivo ( nome do arquivo a ser utilizado no programa ) com o nome do arquivo a ser utilizado no disco. A partir dessa atribuição o arquivo em disco deixará de ser referido pelo original do disco. Todas as operações de tratamento de arquivo farão referência ao identificador.

Ex: assign(ARQPROG, ‘ARQDISCO.DAT’);

rewrite() – Este comando se comporta de duas formas:
Quando um arquivo que já existe for aberto com rewrite, seu conteúdo será apagado e o “pointer” será posicionado no início do arquivo. Quando o arquivo não existir, o comando rewrite criará um novo arquivo com o nome especificado na instrução assign, deixando-o aberto.

Ex: rewrite(ARQPROG);

reset() – Abre um arquivo já existente e posiciona o “pointer” no início do arquivo. Se o arquivo não existir, ocorrerá um erro de I/O. O erro poderá ser solucionado se for desativada á diretiva I do compilador, com a instrução ( SI-) e, em seguida, testar o erro com a função ioresult para definir a estratégia na programação.

Ex: reset(ARQPROG);

close() – Esvazia o buffer e fecha o arquivo. Faz com que todos os dados contidos no buffier temporário sejam gravados no disco (descarrega o buffer). Além disso, também fecha o arquivo.

Ex: close(ARQPROG);

flush()- Esvazia um buffer de saída antes dele ser preenchido ( grava os dados em disco ).

Ex: flush(ARQPROG);

seek() – Procura determinado registro num arquivo através do número do registro.

Ex: seek(ARQPROG,NumReg);

read – Lê o registro apontado pelo SEEK, trazendo-o para o buffer, e posiciona o “pointer” no próximo registro.

Ex: read(ARQPROG,iIUFFER);

write() – Grava o buffer no disco, no endereço apontado pelo seek e, em seguida, posiciona o “pointer” no próximo registro.

Ex: write(ARQPROG,BUFFER);

ioresult – Informa um código de erro quando são realizadas operações de Entrada/Saída. Se ioresult não for igual a zero, significa que houve algum erro (geralmente é usado para testar a existência ou inexistência de um arquivo na hora de sua abertura).

filesize() – Informa a quantidade de registros do arquivo.

Ex: seek(ARQPROG,filesize(ARQPROG)); –> Esta instrução posiciona o “pointer” no final do arquivo ARQPROG para executar inclusão de novos registros. Como o primeiro registro de um arquivo em Pascal possui número zero, a instrução acima posiciona o “pointer” no próximo registro livre para inclusão (após o último ocupado).

filepos()- Informa a posição atual do “pointer” no arquivo. Indica qual é o número do registro corrente.

Ex: filepos(ARQPROG)

Diretiva I de Ativação do Compilador:

As diretivas de ativação ativam ou desativam recursos especiais do Turbo Pascal, como por exemplo, a diretiva I, que verifica de erros de Entrada/Saída.
Existem outras diretivas de ativação além da I, que são conhecidas por este nome por que só possuem duas condições (ativada ou desativada).
O formato de escrita para ativar (+) ou desativar (-) uma diretiva, é um S seguido da letra da diretiva entre delimitadores de comentários.

Ex: {$I+} e {$I-} ou {*$I+*} e {*$I-*}.

Um arquivo deve ser declarado da seguinte forma:

var
[Var. Arquivo] : file of [Var, de Registro];

ObS: No turbo Pascal pode-se abrir no máximo 15 arquivos ao mesmo tempo.

Vejamos um exemplo prático:

program Prog36;

type
ARMA =record
TIPO : string[10];
MARCA : string[6];
SERIE : string[7];
CALIBRE : real;
ACABA : string[9];
CAPACID : integer;
NCANOS : byte;
end;

var
Bufferarrna : ARMA;
ARQARMA : file of ARMA;

begin

assign(ARQARMA,’CADASTRO.DAT’);
rewrite(ARQARMA);
seek(ARQARMA,0);
Bufferarrna.TIPO := ‘REVOLVER’;
Bufferarrna.MARCA := ‘TAURUS’;
Bufferarrna.SERIE := ‘FJ53941’;
Buffcrarrna.CALIBRE := .38;
Bufferarrna.ACABA := ‘INOX’;
Bufferarrna.CAPACID := 6;
Bufferarrna.NCANOS := 1;

write(ARQARMA,Bufferarrna);
close(ARQARMA);

end.

Após a definição de Campos (Tipo, Marca, …), Registro (… record), Buffer (Bufferarrna….) e Arquivo (—file of…), utiliza-se o comando assign para associar o nome do arquivo usado intemamente no programa (ARQARMA) ao nome do arquivo verdadeiro em disco (CADASTRO.DAT).

Observações:

– O comando rewrite(ARQARMA) criou e manteve aberto o arquivo ARQARMA.

– O commando seek colocou o registro 0 sob a mira do “pointer” de indicação de registro.

– Em seguida, houve as atribuições diretas aos campos do buffer (Bufferarrna), que trabalham como variáveis. Os valores também poderiam ter sido atribuídos via teclado, capturados pelos comandos read ou readln.

– O comando write gravou o registro 0 do arquivo ARQARMA com o conteúdo de Bufferarma.

Observação Importante:

O Turbo Pascal permite a gravação a partir do registro 0. Um registro NÃO pode ser acessado no caso da inexistência do anterior, ou seja, o registro 3 somente pode ser acessado se existir o registro 2. A única excessão é para o registro 0.

REFERÊNCIA AOS CAMPOS – COMANDO WITH.

As referências feitas aos campos de um registro tornam-se extensas, pois são compostas de [nome do buffer].[nome do campo]. Utilizando o comando with, podemos abreviar e escrevei” somente os nomes dos campos. O trecho do programa em que esta abreviação é permitida, ileve estar assim limitado:

with [nome do buffer] do

begin .
.
.
.
.
end;

Aproveitamos o exemplo seguinte para utilizar o comando with e também, para o processo de leitura através do apontamento do registro desejado com o comando seek e leitura com comando read.

Program Prog38;
type
ARMA = record
TIPO : string[10];
MARCA : string[6];
SERIE : string[7];
CALIBRE : real;
ACABA : string[9];
CAPACID : integer;
NCANOS : byte;
end;

var
Bufferarma : ARMA;
ARQARMA : file of ARMA;

begin

assign(ARQARMA,’CADASTRO.ARQ’);
reset(ARQARMA);
seek(ARQARMA,0);
read(ARQARMA,BUFFERARMA);

with BUFFERARMA do
begin
writeIn(TIPO);
writeIn(MARCA);
writeIn(SERIE);
writeIn(CALIBRE);
writeIn(ACABA);
writeIn(CAPACID);
writeln(NCANOS);
end;

close(ARQARMA);

end.

Observações:

– Já que este programa lê os dados gravados pelo programa anterior (Prog37), utilizou-se o comando reset para abrir o arquivo, por que o arquivo já existia anteriormente.

– Apontou-se para o registro 0 (gravado anteriormente no Prog37) através do comando seek. ‘

– Foi lido para o buffer o registro 0 através do comrnando read.

– Devido a utilização do with Bufferarma do, foi possível a impressão com a abreviatura das Variáveis de Campo (usou-se apenas TIPO, em vez de Bufferarma.TIPO).

Unix

0

Autoria: Mauro Neves

SISTEMA OPERACIONAL UNIX
Um sistema operacional é um programa que gerencia os recursos de um computador. Sistemas operacionais enviam informações aos dispositivos de comunicação, gerenciam o espaço de armazenamento em dispositivos de armazenamento de massa, carregam informações na memória e assim por diante. Em sistemas de computadores que permitem várias pessoas utilizarem o sistema simultaneamente, o sistema operacional arbitra as várias solicitações para distribuir os recursos do computador justa e eficazmente.
O sistema UNIX é um sistema operacional moderadamente complexo. É muito mais simples do que os sistemas operacionais que rodam em maxicomputadores, mas possui mais capacidade do que a maioria dos sistemas operacionais que rodam em microcomputadores. Por exemplo, o sistema UNIX permite rodar vários programas simultaneamente.
TEMPO COMPARTILHADO
Tempo compartilhado é uma das técnicas que foram desenvolvidas para compartilhar o computador entre vários usuários. O objetivo do tempo compartilhado é dar a cada usuário a ilusão do uso exclusivo da máquina. O tempo compartilhado funciona porque os computadores modernos podem processar milhões de informações por segundo. Com esta taxa, um computador é capaz de destinar milhares de operações às suas tarefas, milhares aos seus vizinhos e outros milhares à função de coordenar tudo isto – tudo num único segundo.
Em alguns sistemas de computadores, espera-se até que o computador esteja pronto para executar os programas. Entretanto, em sistemas de computadores interativos, o computador sempre está aguardando para iniciar a execução de um programa. Quando pedimos ao computador para executar um programa ele começa a rodá-lo imediatamente; o computador trabalha diligentemente nele até que esteja terminado. O computador pode, neste momento, fazer algumas outras operações simultaneamente, mas, basicamente, seu programa começa tão logo você dá o comando e o computador continua progredindo.
O tempo compartilhado funciona dividindo-se cada unidade de tempo em um número de partes. Cada programa sendo executado recebe uma parte do tempo. Quando mais programas estão sendo executados, cada programa recebe uma parte menor do que quando somente uns poucos programas estão rodando. Considerando que os computadores são dispositivos rápidos, eles podem mudar rapidamente de uma tarefa para outra, dando a impressão de que o computador está desempenhando muitas tarefas simultaneamente. Na verdade, o computador está progredindo em uma tarefa e daí passando a outra e assim por diante.
Alguns sistemas de tempo compartilhado tornam-se muito ineficazes quando são sobrecarregados. A ineficiência aparece quando a demanda é tanta que o computador gasta todo o seu tempo mudando de programas e muito pouco tempo realmente executando-os.
O NÚCLEO
Certas funções de sistemas operacionais são necessárias muitas vezes a cada segundo. Por exemplo, a parte do sistema UNIX que se envolve na mudança de um programa para outro (tempo compartilhado) é solicitada muitas vezes a cada segundo. No sistema UNIX todas as fuunções que são necessárias de imediato são mantidas constantemente na memória. A parte residente na memória de um sistema operacional é chamada de núcleo.
Muitas funções de sistemas operacionais são necessárias ocasionalmente, tal como a capacidade de transportar alguma informação de um dispositivo de armazenamento de massa para outro. Estes tipos de funções são fornecidos por utilitários, programas padrões os quais são solicitados de acordo com a demanda dos usuários. No sistema UNIX é fácil incrementar o estoque de utilitários simplesmente escrevendo um programa novo e útil.
Em muitos sistemas operacionais, o núcleo contém muitas características. O sistema UNIX tenta dotar o núcleo de características relativamente novas para que a maioria das funções dos sistemas operacionais possa ser fornecida por programas utilitários.
PROGRAMAS
Um programa é uma sequência de instruções que o computador segue para alcançar um certo resultado. Quando um programa não está sendo executado, a sequência de instruções está armazenada num dispositivo de armazenamento de massa (normalmente um disco). Para rodar o programa, uma cópia das instruções deve estar carregada na memória.
Enquanto um programa estiver sendo executado no sistema UNIX, ele é chamado de processo. Se várias pessoas estiverem rodando o mesmo programa mais ou menos ao mesmo tempo, então haverá vários processos mas somente um programa.
SHELL
O shell é um dos programas mais importantes do sistema UNIX. Ele é um programa interativo. Pode-se controlar o shell através de comandos que o shell interpreta (decodifica) e executa. Portanto, o nome técnico do shell é interpretador de comandos.
A função de um interpretador de comandos é executar os comandos que forem inseridos. Ou seja, ao ser inserido um nome de comando ou programa, o shell fará com que este seja executado pelo sistema UNIX.
Em muitos sistemas o interpretador de comandos é uma parte da estrutura interna do sistema operacional. No sistema UNIX, entretanto, o shell é somente um programa comum, semelhante a qualquer outro programa que rode no sistema UNIX. A única coisa que é especial sobre o shell é o fato de ele ser central à maioria das interações com o sistema UNIX. Se você for um usuário comum, então passará muito tempo inserindo comandos. O shell tem muitas características que podem ser usadas para aumentar sua eficácia.
O sistema UNIX é, na realidade, uma ferramenta para o gerenciamento de informações. O poder do sistema UNIX provém de sua capacidade de permitir que programas rodem juntos para produzirem a informação desejada. Na maioria dos computadores cada programa é considerado um mundo dentro dele mesmo. No sistema UNIX quase todos os programas são ferramentas simples que podem ser combinadas com outros programas para produzirem ferramentas mais poderosas.
Além de ser um interpretador de comandos, o shell também é uma linguagem de programação. Amaioria dos usuárioss ignora as características de linguagem de programação do shell, simplesmente porque não são programadores de computadores.

Unix 2

0

Autoria: Leonardo Ferreira Moreli

SISTEMA OPERACIONAL UNIX
Um sistema operacional é um programa que gerencia os recursos de um computador. Sistemas operacionais enviam informações aos dispositivos de comunicação, gerenciam o espaço de armazenamento em dispositivos de armazenamento de massa, carregam informações na memória e assim por diante. Em sistemas de computadores que permitem várias pessoas utilizarem o sistema simultaneamente, o sistema operacional arbitra as várias solicitações para distribuir os recursos do computador justa e eficazmente.
O sistema UNIX é um sistema operacional moderadamente complexo. É muito mais simples do que os sistemas operacionais que rodam em maxicomputadores, mas possui mais capacidade do que a maioria dos sistemas operacionais que rodam em microcomputadores. Por exemplo, o sistema UNIX permite rodar vários programas simultaneamente.
TEMPO COMPARTILHADO
Tempo compartilhado é uma das técnicas que foram desenvolvidas para compartilhar o computador entre vários usuários. O objetivo do tempo compartilhado é dar a cada usuário a ilusão do uso exclusivo da máquina. O tempo compartilhado funciona porque os computadores modernos podem processar milhões de informações por segundo. Com esta taxa, um computador é capaz de destinar milhares de operações às suas tarefas, milhares aos seus vizinhos e outros milhares à função de coordenar tudo isto – tudo num único segundo.
Em alguns sistemas de computadores, espera-se até que o computador esteja pronto para executar os programas. Entretanto, em sistemas de computadores interativos, o computador sempre está aguardando para iniciar a execução de um programa. Quando pedimos ao computador para executar um programa ele começa a rodá-lo imediatamente; o computador trabalha diligentemente nele até que esteja terminado. O computador pode, neste momento, fazer algumas outras operações simultaneamente, mas, basicamente, seu programa começa tão logo você dá o comando e o computador continua progredindo.
O tempo compartilhado funciona dividindo-se cada unidade de tempo em um número de partes. Cada programa sendo executado recebe uma parte do tempo. Quando mais programas estão sendo executados, cada programa recebe uma parte menor do que quando somente uns poucos programas estão rodando. Considerando que os computadores são dispositivos rápidos, eles podem mudar rapidamente de uma tarefa para outra, dando a impressão de que o computador está desempenhando muitas tarefas simultaneamente. Na verdade, o computador está progredindo em uma tarefa e daí passando a outra e assim por diante.
Alguns sistemas de tempo compartilhado tornam-se muito ineficazes quando são sobrecarregados. A ineficiência aparece quando a demanda é tanta que o computador gasta todo o seu tempo mudando de programas e muito pouco tempo realmente executando-os.
O NÚCLEO
Certas funções de sistemas operacionais são necessárias muitas vezes a cada segundo. Por exemplo, a parte do sistema UNIX que se envolve na mudança de um programa para outro (tempo compartilhado) é solicitada muitas vezes a cada segundo. No sistema UNIX todas as fuunções que são necessárias de imediato são mantidas constantemente na memória. A parte residente na memória de um sistema operacional é chamada de núcleo.
Muitas funções de sistemas operacionais são necessárias ocasionalmente, tal como a capacidade de transportar alguma informação de um dispositivo de armazenamento de massa para outro. Estes tipos de funções são fornecidos por utilitários, programas padrões os quais são solicitados de acordo com a demanda dos usuários. No sistema UNIX é fácil incrementar o estoque de utilitários simplesmente escrevendo um programa novo e útil.
Em muitos sistemas operacionais, o núcleo contém muitas características. O sistema UNIX tenta dotar o núcleo de características relativamente novas para que a maioria das funções dos sistemas operacionais possa ser fornecida por programas utilitários.
PROGRAMAS
Um programa é uma sequência de instruções que o computador segue para alcançar um certo resultado. Quando um programa não está sendo executado, a sequência de instruções está armazenada num dispositivo de armazenamento de massa (normalmente um disco). Para rodar o programa, uma cópia das instruções deve estar carregada na memória.
Enquanto um programa estiver sendo executado no sistema UNIX, ele é chamado de processo. Se várias pessoas estiverem rodando o mesmo programa mais ou menos ao mesmo tempo, então haverá vários processos mas somente um programa.
SHELL
O shell é um dos programas mais importantes do sistema UNIX. Ele é um programa interativo. Pode-se controlar o shell através de comandos que o shell interpreta (decodifica) e executa. Portanto, o nome técnico do shell é interpretador de comandos.
A função de um interpretador de comandos é executar os comandos que forem inseridos. Ou seja, ao ser inserido um nome de comando ou programa, o shell fará com que este seja executado pelo sistema UNIX.
Em muitos sistemas o interpretador de comandos é uma parte da estrutura interna do sistema operacional. No sistema UNIX, entretanto, o shell é somente um programa comum, semelhante a qualquer outro programa que rode no sistema UNIX. A única coisa que é especial sobre o shell é o fato de ele ser central à maioria das interações com o sistema UNIX. Se você for um usuário comum, então passará muito tempo inserindo comandos. O shell tem muitas características que podem ser usadas para aumentar sua eficácia.
O sistema UNIX é, na realidade, uma ferramenta para o gerenciamento de informações. O poder do sistema UNIX provém de sua capacidade de permitir que programas rodem juntos para produzirem a informação desejada. Na maioria dos computadores cada programa é considerado um mundo dentro dele mesmo. No sistema UNIX quase todos os programas são ferramentas simples que podem ser combinadas com outros programas para produzirem ferramentas mais poderosas.
Além de ser um interpretador de comandos, o shell também é uma linguagem de programação. Amaioria dos usuárioss ignora as características de linguagem de programação do shell, simplesmente porque não são programadores de computadores.

Unix – Introdução

0

Autoria: Luiz José Soares de Souza

HISTÓRICO

Sistema operacional Unix foi desenvolvido em 1969 por Ken Thompson pela Bell Laboratories.
Baseado em Multics e escrito originalmente em linguagem simbólica
para o minicomputador PDP-7 DEC; foi rescrito em linguagem C em 1973 por Dennis Ritchie , podendo ser adaptado virtualmente para qualquer computador; Surgiu várias versões de UNIX, entre elas:

• System V – AT & T
• BSD 4.X – Berkeley Software Distribuition
• SunOs – Sun MicroSystem
• Ultrix – Dec Station
• AIX – IBM, RISC/6000

Características

• Sistema Operacional Complexo
• Capacidade Multitarefa;
• Mais de 200 comandos e programas
• Capacidade Multiusuário;
• Transportabilidade;
• Ampla seleção de potentes programas;
• Comunicação e correio eletrônico;
• Biblioteca de Softwares explicativos;

Outras Características

Pode-se também construir banco de dados, fazer cálculos, sistemas de gerenciamento de arquivo, com base em poucos comandos sem usar compilador; existe o modo gráfico, chamado X-Windows que é uma espécie de interface com o mouse, tecnicamente semelhante ao Windows.

Estrutura

• Kernel: Faz a interface com o hardware, gerencia a memória, a entrada/saída, planeja as tarefas e administra o armazenamento de dados;
• Shell: Interface entre o usuário e a máquina, interpretador de comandos, executa programas;
• Aplicativos: incorporam capacidades especiais ao sistema operacional

Shell’s

C Shell (CSH)
• Versão BSD;
• Processamento background e foreground;
• History, alias;
• Programação parecida com o C; – controle de processos; – prompt %

Bourne Shell (SH)

• Padrão do Unix;
• Possui as mesmas características do CSH sem a facilidade de history e controle de processos;
• Prompt $.

Kernel Shell (KSH)

• Comandos mais poderosos;
• Prompt #

Sistema de Arquivos

• Tudo no UNIX é um arquivo (programas, dados, diretórios, discos impressoras, teclado, mouse, etc.)
• Os arquivos estão organizados em uma estrutura hierárquica (diretório e subdiretórios)
• Diretórios importantes:
• / -root
• /boot -arquivos de boot
• /unix ou v/munix -Kernel
• /bin ou /usr/bin -executáveis principais
• /dev -dispositivos, arquivos de I/Q
• /etc -comandos para administração

• Proteção de Arquivos
• usuário: u, grupo: g, outro: o
• permissões de leitura : r, escrita: w, execução: x, sem permissão: -;
• Exemplo: -rwxr-xr-x 1 name_user nucc 10916 Jul 10 17:29 .history *
Permissão de leitura, escrita e execução para o proprietário.
Permissão de leitura e execução para grupo.
Permissão de leitura e execução para outros.

Iniciando uma Sessão

AIX Version 3
C Copyrights by IBM and by others 1982, 1993.
login : user_name (seu login)
user_name’s Password: ###### (sua senha)

Terminando uma Sessão

– exit ou logout

Comandos Básicos

-login: inicia uma sessão
– passwd: troca a senha do usuário
– ls: lista o conteúdo de um diretório
– cat: mostra o conteúdo de um arquivo/ une dois arquivos
– more: mostra o conteúdo de um arquivo pausadamente
– cp: copia arquivos
– rm: remove arquivos
– mv: move arquivos
-ln: cria links
– find: procura arquivos por nome
– mkdir: cria diretórios

Comandos Básicos (cont.)

– rmdir: remove diretórios
– cd: muda de diretório
– pwd: mostra o diretório corrente
– ps: mostra os processos
– grep: procura strings dentro de arquivo
– compress: compactador padrão UNIX
– uncompress: descompactador padrão UNIX
– clear: limpa a tela
– man: help
– tar: cria backup’s
– df/du: mostra o espaço disponível em disco
– talk: comunicação direta entre dois usuários
– write: envia mensagem a usuário logado
– chmod: muda permissões de arquivos.