Introdução

Comandos do Menu

Teclas de Atalho

Manual SQL


Introdução ao Tsqlwi

Programa TSQLWI é uma interface interativa para criação e execução de comandos SQL .

Seu funcionamento é simples: O usuário digita um comando SQL numa janela de edição e executa este comando. Por sua vez, o programa devolve o resultado do comando ou através de mensagens, se o comando não for SELECT, ou através de uma tabela, se for uma consulta SELECT.


Modos de Trabalho
Existem dois menus de trabalho no TsqlwI:

1)  Modo Base de Dados.

2)  Modo Query.

1) No Modo Base de Dados é possível cadastrar um banco de dados TSQL para que o mesmo possa ser acessado por comandos SQL, alterar os dados de uma base cadastrada ou remover uma base do cadastro.

2) O Modo Query é ativado quando uma janela de edição de queries é aberta. Neste modo é possível configurar como serão executados os comandos SQL e executar os mesmos.


Modo Base de Dados

Arquivo

Base de Dados

Ajuda


Arquivo

  Nova Query

  Abrir Query

  Sair


Nova Query

Aciona um janela de edição onde você poderá digitar um comando SQL que será executado através de Query/Executar.

Note que ao se abrir a janela de edição de queries, muda o menu principal, ativando o menu da edição de queries.


Abrir Query

Abre uma caixa de diálogo padrao do  Windows onde você poderá abrir um arquivo com comandos SQL salvos anteriormente. Estes arquivos tem extensão ".QRY".

Estes comandos poderão ser executados através de Query/Executar ou pressionando a tecla F9.

Note que ao se abrir a janela de edição de queries, muda o menu principal, ativando o menu de edição de queries.


Sair

   Encerra o programa.


Base de Dados

  Cadastrar Base

  Descadastrar Base

  Alterar Dados da Base

  Propriedades


Cadastrar Base de Dados
Cadastrar Base

Abre um caixa de diálogo onde deverão ser preenchidas algumas informações:

Nome da Base :

Digite o nome   da   BASE DE   DADOS (DSN) pelo qual será conhecido o BANCO DE DADOS que está sendo cadastrado. Este nome funciona   como  um álias para facilitar o acesso. Qualquer nome pode ser usado como DSN, ex: "teste","banco1", “contabilidade”,  etc.

Servidor:

Selecione na lista que está abaixo da caixa de edição ou digite o nome do computador onde está armazenado o banco de  dados que será acessado. Este é o nome pelo qual o computador é conhecido na  rede. Caso o computador acessado seja a propria máquina do usuário (computador local), o nome do servidor poderá ser deixado em branco ou a opção “0-Computador Local” pode ser selecionada. Note que o ser escolhida a 1a. opção, o nome do servidor será mantido em branco. Dessa maneira, o acesso ao banco será direto. Se o nome da maquina for selecionado, automaticamente será ativado o modo de acesso cliente-servidor.

Caminho da Base (DSN):

Digite o CAMINHO COMPLETO  de onde estão os arquivoa do dicionário da base de dados.

Ex:

Se o nome do banco de dados for db:

"c:\usr\arquivos\db"  se for servidor WINDOWS.

/usr/arquivos/db se for servidor UNIX.

Diretório de Trabalho (opcional):

Diretório onde estão armazenados os dados do banco. Existe a possibilidade do

dicionário de dados estar num diretório e os dados em outro. Neste caso, e sòmente

neste é preciso indicar em que diretório estão os dados. Caso os dados e o dicionário

estejam no mesmo diretório não é necessário preencher esta caixa de texto.

Código de Segurança:

Digite o código de segurança que foi definido no arquivo de definição do esquema

TSQL.

Ex:

BANCO /usr/arquivos/db 33 	<<O código de segurança é 33. >>

Niveis:

01 todos

15 dba

Nível de Acesso:

É a uma das palavras de nível de acesso definidas. No exemplo acima, pode ser usada todos ou a palavra dba.

Modo de Abertura:

Escolha na lista um dos três modos de abertura do banco:

1 – Abre o banco de dados sòmente para leitura compartilhada.

2 – Abre o banco para leitura compartilhada	e gravação em modo exclusivo.

3 – Abre o banco em modo exclusivo.

Visualizar todos os Campos:

Permite que todos os campos do arquivo sejam visíveis.

Veja o seguinte exemplo:

nome: gerencia R

          	chvger (0)            	U14

          	codger (tab_empreg)  U11 POS chvger

          	coddep (tab_dep)      	U3  POS chvger+11

          	datager	U10

Na definição do arquivo gerencia, todos os campos podem ser acessados, inclusive o campo chvger.

Visualizar sòmente Campos Atômicos:

Campos atômicos são os campos que não contém subcampos, e os próprios subcampos.

Veja o seguinte exemplo:

nome: gerencia R

          	chvger (0)            	U14

          	codger (tab_empreg)  U11 POS chvger

          	coddep (tab_dep)      	U3  POS chvger+11

          	datager	U10

Na definição do arquivo gerencia,  codger, coddep e datager são campos atômicos, sòmente esses poderao ser visualisados, enquanto o campo chvger não poderá ser visualizado.

Visão:

Se for marcada permite que as visões definidas sejam acessadas pelo programa.

Confirmar o cadastro de nova base (Botão OK)

Depois que o cadastro é feito, clicando OK, o nome da nova BASE DE DADOS é adicionado à combox "Database", tornando disponível o acesso ao banco. Basta selecioná-la para torná-la uma base de dados ativa.


Descadastrar Base

Aciona uma dialog box composta de um combobox no canto superior esquerdo e três caixas  de texto na parte direita. Quando a dialog box se abre todas as caixas de estão em branco. Para selecionar uma DSN para remoção selecione na lista da combobox a base que quer remover clicando sobre nome. Note que automaticamente as caixas de texto à direita  são preenchidas com os dados de cadastro da base de dados. Para remover basta clicar no botão Remover.


Alterar Dados de uma Base Cadastrada
Alterar Dados da Base

Abre uma dialog box igual a que usamos quando cadastramos uma base. Todos os dados podem ser alterados, com exceção do nome da base de dados.

Veja Cadastrar Base.


Propriedades

   Contém algumas informações sobre a base de dados ativa.

   Estas informações são para consulta, apenas.


Ajuda

   A forma de operar é a mesma de um menu Windows padrão.


Modo Query

 Arquivo

 Editar

 Query

 Janela

 Ajuda


Arquivo:

  Nova Query

  Abrir Query

  Fechar

  Fechar Todas

  Salvar

  Salvar Como


Fecha a janela que esta ativa na área de trabalho.


Fecha todas as janelas abertas na área de trabalho.


Salvar e Salvar Como salvam o texto que está na janela de ativa.


Editar Queries
Editar:

  Voltar

  Copiar

  Colar

  Recortar

  Deletar


Voltar

Desfaz o último comando digitado.


Copiar

Marca o texto selecionado para copia  de uma janela para outra e de de uma parte para outra do texto.


Colar

Copia ou tranfere um texto selecionado e marcado com Copiar para onde está posicionado o ponto de inserção.


Recortar

Marca o texto selecionado para tranferência para outra janela ou para outra parte do texto.


Deletar

Remove o texto selecionado ou o caractere que está na posição do ponto de inserção.


Query

  Executar

  Executar Saida em Arquivo

  Configurar Execução


Executuando um comando SQL
Executando um comando SQL

Para executar um comando SQL é preciso abrir uma janela nova de edição, selecionando no menu Arquivo/Nova Query  ou abrir um arquivo com uma query salva previamente, selecionando Arquivo/Abrir Query. Digite o comando desejado se for um comando novo. Para executar mais de um comando na mesma janela, digite um comando, coloque um ponto-e-vírgula no final (;), vá para a próxima linha, digite outro comando, coloque um ponto-e-vírgula no final (;), e assim sucessivamente. Para executar, clique no ícone acima.

A tecla de atalho F9 também pode ser usada para executar um comando..


Configurar Execução

Configura a forma como vai ser terminada a transação (Commit), e o nível de concorrência.

  Abre uma caixa de diálogo com três áreas destacadas:

  Configurar Auto-Commit

  Nível de Isolamento.

  Execução em Paralelo


Configurar Auto-Commit

Configura o modo de ativação do COMMIT. Se o Auto-Commit está ativado um COMMIT é executado automaticamente após cada comando SQL. Se estiver desativado, o usuário deverá executar um COMMIT digitando o comando por conta própria.


Nível de Isolamento
Nivel de Isolamento

Configura o tipo de bloqueio a ser usado pelo sistema. Seus níveis variam de 0 a 4, sendo 0  nível sem bloqueio.

  Veja Controle de Concorrência.


Execução em paralelo

  Existem dois modos para execução de comandos SELECT.

  Paralelo Off

     A execução de uma nova query interrompe a execução de uma query em andamento

que ainda tenha tuplas para serem recuperadas. Este é o modo default.

  Paralelo on:

A execução de uma nova query não interrompe a execução de uma query em andamento que ainda tenha tuplas para serem recuperadas. O foco da janela determina qual query está sendo executada.


Janela

  Controla a forma e a ordem como são mostradas as janelas na tela.

  Lado a Lado Horizontal

  Lado a Lado Vertical

  Cascata

  Veja também teclas de atalho.


Coloca uma janela sobre outra de forma que todas possam ser vistas ao mesmo tempo.


Coloca uma janela ao lado da outra de forma que todas possam ser vistas ao mesmo tempo.


Coloca uma janela sobre outra de forma que só a janela que está na frente pode ser vista.


Uma base de dados está ativa quando seu nome está selecionado na caixa de lista Database. Para   isso ela primeiramente precisa ser cadastrada.


Teclas de Atalho
Teclas de Atalho Gerais:

  F8

  Executa o comando que esta digitado na janela de edição ativa e direciona a saida do

  resultado para um arquivo.

  F9

  Executar o comando que está digitado na janela de edição ativa e direciona a saida do

   resultado para um grid na tela.

  Shift-F3

   Agrupa as janelas horizontalmente. (Alt-J-H)

  Shift-F4

   Agrupa as janelas verticalmente.   (Alt-J-V)

  Shift-F5

  Agrupa as janelas em cascata.      (Alt-J-C)

  Alt-A-N

  Abre uma janela nova para edição de comandos.

  Alt-A-B

  Abre um arquivo para edição de comandos.

  Alt-A-A

  Encerra o programa.

  Alt-B-A

  Abre o diálogo para cadastro de base de dados (DSN).

  Alt-B-R

  Abre o diálogo para remoção do cadastro da base de dados.

  Alt-B-P

  Ativa janela de propriedades da base de dados ativa.

  Alt-U

  Ativa o Help.

  Alt-A-F

  Fecha a janela de edição de comandos ativa.

  Alt-A-T

  Fechar todas as janelas abertas.

  Alt-A-S

  Salva a janela de edição de comandos ativa.

  Alt-A-C

  Salva a janela de edição de comandos com outro nome.

  Alt-Q-X

  Executa o comando da janela de edição ativa.

  Alt-Q-F

  Abre o diálogo de configuração da execução de comandos.

  Alt-J-Num

  Ativa a janela de número NUM (ex: Duas janelas abertas: uma de edição aberta primeiro e uma com resultado  do comando depois. Alt-J-1 ativa a primeira janela aberta, Alt-J-2 ativa a segunda janela. Se houver várias janelas abertas, Alt-J-3 ativa a terceira, Alt-J-4 ativa a quarta, e assim respectivamente.

Teclas da janela com a tabela resultado do comando.

  Seta para Cima        : Sobe uma linha.

  Seta para Baixo       : Desce uma linha.

  PgUp                        : Sobe uma página.

  PgDn                        : Desce um página.

  Seta para direita      : Desloca uma coluna para a direita.

  Seta para esquerda : Desloca uma coluna para a esquerda.

  Home                       : Vai para o início da linha.

  End                          : Vai para o final da linha.

  F2                             : Seleciona a celula corrente para edição.

  Shift-Seta p/ Esq.     :Seleciona um pedaço da celula corrente.

  Shift-Seta p/ Dir.      : Seleciona um pedaço da celula corrente.


DSN ou Data Source Name é o nome que se dá ao conjunto de informações referentes a um banco de dados qualquer. Estas informações pode ser: nome do banco, path, nome do servidor e qualquer informação que possa identificar a que banco o DSN  se refere.


Operação:

Quando carregamos o programa pela primeira vez, aparece a primeira tela:

<< colocar figura 1>>

A primeira coisa a ser feita é cadastrar um banco de dados para acesso. Abrindo

a opção "Arquivo", observe que todas as opções, menos "Sair" estão desabilitadas,

na opção "Banco de Dados" sòmente "Cadastrar Base" está ativa. Isto ocorre porque

não é possível executar um comando SQL sem que uma base de dados esteja selecionada.

Por isto, clique em "Cadastrar Base":

<< colocar figura 2>>

Na caixa "Nova Base de Dados" digite o nome pelo qual será conhecida a base de dados de agora

em diante. Em "Diretório", o caminho onde está o banco de dados, inclusive o diretório "db",

que é o diretório que identifica a base de dados SQL e, na caixa "Servidor", o nome pelo qual

seu computador e conhecido na rede. Finalmente, clique "OK".

Agora, você pode usar comandos SQL para acessar esta base. Em "Arquivo/Nova Query" você pode digitar um comando SQL e executá-lo.Em "Arquivo/Abrir Query" você pode abrir um arquivo texto

que contém um comando SQL salvo anteriormente. Para salvar basta selecionar "Arquivo/Salvar"

ou "Arquivo/Salvar Como". Para executar acione "Query/Executar" ou pressione F9.


Saida em Arquivo

Direciona a saida do resultado de uma query para um arquivo texto.

Este arquivo tem como extensao default .tsw, podendo ser modificado de acordo com a vontade do usuário. Pode ser lido por qualquer editor de texto.

Selecione no menu Query/Executar saida em arquivo, ou aperte a tecla de atalho F8.

Digite o nome do arquivo e clique no botão Abrir. Logo após, confirme a operação para continuar.


ÍNDICE

CAPÍTULO 1 - CONCEITOS

Notação	1-3

Base de Dados	1-5

Controle de Concorrência	1-7

Transação	1-11

Diário	1-12

Cópias de Segurança	1-13

Recuperação	1-14

Aplicações	1-15

SQL Dinâmica	1-18

CAPÍTULO 2 - ELEMENTOS DA LINGUAGEM

Palavras Reservadas	2-3

Identificador	2-5

Constante	2-6

Comentário	2-8

Tipos de Dados	2-9

Tabela	2-11

Variável	2-12

Coluna	2-13

Função	2-14

Valor	2-17

Expressão	2-18

Condição	2-20

Especificação de Consulta	2-22

Expressão de Consulta	2-24

Sub-Consulta	2-26

CAPÍTULO 3 - PREDICADOS

Between	3-3

Comparação	3-4

Exists	3-5

In	3-6

Like	3-7

Null	3-9

Quantificado	3-10

CAPÍTULO 4 - CLÁUSULAS

CAPÍTULO 5 - COMANDOS DINÂMICOS

COMANDOS DE MANIPULAÇÃO DE DADOS

COMANDOS DE MANIPULAÇÃO DE ESQUEMA

CREAT TABLE 	5-22

CREAT VIEW 	5-27

CREAT INDEX 	5-30

DROP TABLE 	5-31

DROP VIEW 	5-32

DROP INDEX 	5-33

GRANT 	5-34

REVOKE	5-37

COMANDOS DINÂMICOS

PREPARE	5-39

DESCRIBE	5-41

EXECUTE	5-45

FETCH DINÂMICO	5-47

EXECUTE IMMEDIATE 	5-52

CAPÍTULO 6 - DECLARAÇÕES

Cursor	6-3

Cursor Dinâmico 	6-5

Procedimento 	6-6

CAPÍTULO 7 - LINGUAGENS

CAPÍTULO 8 - DICIONÁRIO DE DADOS

Dicionário de Dados 	8-3

SYSBTREE 	8-4

SYSCOLAUTH 	8-6

SYSCOLUMNS 	8-7

SYSCUSAGE	8-10

SYSINDEXES	8-11

SYSIUSAGE 	8-12

SYSKEYS	8-13

SYSMODAUTH 	8-14

SYSMODULES 	8-15

SYSTABAUTH 	8-16

SYSTABLES 	8-18

SYSTUSAGE 	8-20

SYSRUSAGE 	8-22

ANEXO 1

Base OpenBASE ...................................................Anexo 1-1

ANEXO 2

Servidor TSQL.......................................................Anexo 2-1

ANEXO 3

Cópia Run-Time.....................................................Anexo 3-1

ANEXO 4

Mensagens de Erro................................................ Anexo 4-1


NOTAÇÃO

Este  capítulo tem como objetivo apresentar a notação usada no  manual  de referência.

Em  todos os tópicos do manual há duas áreas,  uma para a descrição da  sintaxe  e outra para as regras gerais de uso do elemento da linguagem.  Em     todos os tópicos,  há,  ainda,  uma sentença “Veja também .” que remete o  leitor  a  outros  pontos do manual,  fortemente  relacionados  com  alguma     explicação ali apresentada.

Descreve-se  aqui  a  notação  usada para a definição  da  sintaxe  da linguagem.  Todos os elementos possuem um nome seguido de dois pontos (:) e de sua definição.

nome_do_elemento : definição

Na  definição podem existir nomes definidos a seguir,  nomes de outras entradas do manual,palavras reservadas da linguagem em letras maiúsculas,  símbolos da linguagem e símbolos da notação.

Os símbolos da notação têm os seguintes significados:

1.	Barra  horizontal '|' significa OU.Deve ser usado o elemento  da     descrição anterior a barra ou o elemento que segue a barra.

2.	Colchetes  '[]'  significam  cláusula  opcional. Elementos  entre colchetes podem ou não ser colocados na sentença, conforme o caso.

3.	Chaves '{}' significam grupamento de elementos.  Os elementos entre     chaves devem ser lidos, para efeito da notação, como um só elemento.

4.	Três pontos '.' significam repetição. Um elemento ou um conjunto deles seguido de três pontos devem ser repetidos uma ou mais vezes.

1-3

A  partir  desta,  observa-se que uma lista de um  ou  mais  elementos    separada  por espaço é representada na forma:

nome_do_elemento.

Uma lista de um ou mais elementos separados por vírgula é representada   na forma:

nome_do_elemento {,nome_de_elemento}.]

Nomes  de  elementos  do tipo  'identificador_de_.'  são  nomes  que identificam aquele tipo de elemento e seguem a definição de identificador.

Quando um dos símbolos da notação é também um símbolo da linguagem,  o símbolo da linguagem aparece entre aspas (“”). Por exemplo: “[“ campo “]”.

Neste caso o campo não é opcional,  deve-se especificar um colchete seguido do valor do campo e seguido de outro colchete.

1-4


BASE DE DADOS

Uma  base de dados TSQL é uma coleção de informações  organizadas em subconjuntos chamados de esquemas.  Cada base de dados é armazenada  em um diretório separado,  que é especificado no momento da criação da base  de  dados na forma de um caminho absoluto ou de  um  caminho  em     relação ao diretório corrente.  Toda referência a ela é feita  através  desse caminho.

Uma  base é criada através do utilitário tsqlcrdb.  A partir daí, podem ser definidos os diversos esquemas que a compõem.

Um  esquema,  por  sua vez,  é formado por  um  identificador  de autorização, um conjunto de tabelas, um conjunto de índices sobre cada  tabela,  um  conjunto  de  visões  e  um  conjunto  de  definições  de privilégios. Os conjuntos acima citados podem ser vazios.

As  tabelas e visões de um esquema pertencem ao usuário cujo nome  é o identificador de autorização.

As  informações  de  um esquema são definidas na  base  de  dados através dos comandos SQL de definição (veja Comandos SQL).

Estes comandos podem fazer parte de :

§ um programa de aplicação.

§ uma definição de esquema (veja Esquema). Neste caso, a operação de     definição  é  executada pelo utilitário “tsqlschema”.  Observa-se  que neste  caso não são permitidos os comandos que definem índices ou  que     eliminam definições (DROP TABLE, DROP VIEW etc.).

O  dicionário  de  dados é um conjunto de tabelas nas  quais  são armazenadas  as  descrições de todos os objetos da base de dados  e o relacionamento  entre eles.  Estas tabelas formam um esquema  especial  cujo identificador de autorização é o identificador SYSSQL.

1-5

Como  o  esquema  SYSSQL  deve existir antes  de  qualquer  outro esquema,  ele é criado pelo utilitário “tsqlcrdb” que inicia uma  base  de dados. O usuário que executa o utilitário é o administrador da base de dados (DBA).

O sistema de proteção de uma base de dados se baseia no  sistema     operacional.  Para uma determinada base de dados,  um usuário comum  só  pode definir um esquema,  com um identificador de autorização igual ao identificador  com o qual ele foi cadastrado pelo sistema  operacional  (usuário corrente).  O usuário é,  então,  o dono do esquema e  possui     todos  os privilégios sobre os seus objetos.  O DBA e o  super-usuário  podem  definir  esquemas  com qualquer  identificador  de  autorização  válido.

Uma  base OpenBASE pode ser adaptada para ser utilizada também  como uma  base TSQL.  Esta base é chamada híbrida e  suas  particularidades  estão descritas no anexo 1 (Veja Base OpenBASE).

No  presente manual uma base qualificada como TSQL inclui  tanto uma  base  TSQL  como  uma base OpenBASE  híbrida.  Quandoé necessário distinguir uma base híbrida, ela é referenciada como base OpenBASE.

O  sistema TSQLpermite também que uma base residente  em  uma determinada máquina possa ser acessada a partir de uma outra  máquina.

Para isto é necessário criar nesta última,  o que se chama de uma base cliente, que é descrita na seção “Conceitos”(Veja  Servidor TSQL).

Veja também o capítulo Linguagens.

1-6


CONTROLE DE CONCORRÊNCIA

Concorrência é a capacidade que o sistema possui,  em um ambiente   multi-usuário,  de permitir   que   várias   transações    acessem simultaneamente   informações  de  uma  base  de  dados. O  grau  de  concorrência é o volume de transações executadas pelo sistema  durante  um  determinado  intervalo de tempo.  Por outro lado,  a  consistência integral  dos  dados  em  um ambiente  multi-usuário  implica  em  que   alterações  efetuadas  por  uma transação não devem afetar  as  outras     transações em curso.

Para   assegurar   as  características  da  concorrência   e  da     consistência dos dados,  o TSQL usa os métodos de bloqueio  automático     de linhas e de bloqueio programado de tabelas (comando LOCK TABLE).

Para  se  obter o  melhor grau  de  concorrência,  assegurando  a consistência dos dados, é necessário que o esquema de bloqueio permita um balanceamento entre estas características em função da  aplicação.	Estebalanceamento  é obtido através do nível de  isolamento  que o usuário  estabelece para uma aplicação e/ou o uso do comando  LOCK  TABLE.

No  TSQL,  os  bloqueios  podem  ser  do  tipo  compartilhado  ou exclusivo. Em geral, o sistema coloca um bloqueio compartilhado sobre  a linha  a  ser lida.  Este tipo de bloqueio  impede  que  uma  outra   transação  altere  a  linha durante o tempo de  duração  do  bloqueio. Outras transações podem ler a linha normalmente.  O instante em que um     bloqueio compartilhado é relaxado depende do nível de isolamento.

Bloqueios  exclusivos  são colocados  sobre as  linhas  que  são alteradas. Quando uma linha possui um  bloqueio  exclusivo,  nenhuma outra transação pode referenciá-la.  Bloqueios exclusivos são mantidos até o fim da transação que os gerou.

1-7

O  nível  de isolamento é que determina quando  os  bloqueios  de linha  são  adquiridos  e relaxados pelo sistema.  O TSQL  oferece  os seguintes níveis:

Nível 0 . Sem bloqueio

O sistema  não  mantém  bloqueios  sobre  as linhas  referenciadas.  A transação só opera com leitura de linhas e não pode efetuar alterações na base de dados.  Este nível de bloqueio pode ser utilizado para gerar relatórios sem onerar o sistema na tentativa de obtenção dos bloqueios. Observa-se que  linhas lidas neste nível podem refletir alterações  que não  foram  ainda confirmadas por um comando  COMMIT  e  que poderão ser eventualmente canceladas (comando ROLLBACK).

Nível 1 . Estabilidade de cursor

Bloqueios  compartilhados  são relaxados na leitura  de  uma próxima linha e bloqueios exclusivos são mantidos até  o  fim da transação.  A estabilidade de cursor é utilizada  com  frequência  nas aplicações interativas nas quais os usuários  podem percorrer linhas, uma de cada vez. Neste ambiente,  só é  necessário  manter um bloqueio sobre uma linha se esta  é modificada. Após a passagem do usuário para a próxima linha, bloqueios sobre linhas não modificadas são relaxados.

Nível 2 . Leitura repetida

Bloqueios  compartilhados e exclusivos são mantidos até o  fim  da transação.  Desta forma,  linhas  lidas  não  são  alteradas por outra transação até o fim da transação na qual  elas foram lidas. Este nível  provê um alto grau de consistência e um relativo baixo grau de concorrência.

1-8

Nível 3. Uso exclusivo sem transação

Toda  a  base  de  dados é  bloqueada  para  o  usuário corrente que deve ser o administrador da base de dados ou o  super-usuário.  Essencialmente,  o sistema passa a operar em  modo mono-usuário. Este nível deve ser 	usado para a execução  de  operações tais como salvar uma base de dados,  recuperar uma base de dados, etc.  O gerenciamento de transações não é   efetuado,  e consequentemente as atualizações na  base  não podem ser desfeitas  automaticamente  através  o  comando  ROLLBACK.

Nível 4 . Uso exclusivo com transação

Este  nível opera da mesma forma que o  nível  anterior          com  a  diferença  que  o  gerenciamento  de  transações   é          efetuado.

Os bloqueios descritos acima são automaticamente adquiridos  pelo     sistema.  O nível de isolamento é uma característica de cada aplicação (veja SQL embutida na OPUS).  Se o nível não  é especificado o sistema assume o nível de estabilidade de cursor (nível 1).

Em  qualquer  nível de isolamento é  possivel,  também,  requerer     explicitamente  bloqueios de tabelas utilizando o comando LOCK  TABLE. Bloqueios  de  tabelas  são automaticamente relaxados no  fim  de  uma     transação.  Estes bloqueios podem ser automaticamente adquiridos  pelo     sistema  quando  é executado um comando que afeta a definição  de  uma     tabela (CREATE INDEX, por exemplo).

O  bloqueio  de  uma tabela deve ser utilizado,  no caso  de  uma     transação  efetuar  operações de leitura ou atualização em  um  grande número de linhas.  Desta forma o sistema não é onerado com a obtenção do bloqueio de cada linha.

1-9

Observa-se que o nível de isolamento 2 não garante que qualquer operação de leitura sobre uma determinada tabela é reproduzível dentro de uma mesma transação, devido a uma possível inserção de linhas por parte de uma transação concorrente. Para isto,  é necessário bloquear a tabela com o uso do comando LOCK TABLE, que impede a inserção de linhas na tabela até o fim da transação.

          Veja também  comando LOCK_TABLE.

1-10


TRANSAÇÃO

Uma  transação  consiste  em uma sequência de operações  (na  base  de     dados),  que possui a característica de ser atômica em relação ao  controle     da  concorrência  e  da  recuperação.Desta  forma,  existem  apenas  duas     alternativas:  todas  as operações presentes numa transação são  realizadas  como se fossem uma ou nenhuma delas é realizada.

Se  um programa efetua uma operação SQL e não existe uma transação em curso para o programa, então é automaticamente iniciada uma transação para ele. Cada operação SQL subsequente efetuada pelo mesmo programa faz  parte  da mesma transação até que ela seja terminada. Consequentemente, transações  não podem ser aninhadas.

Uma  transação  é encerrada com a execução de um comando COMMIT ou  um comando ROLLBACK. No  caso  do  comando  ROLLBACK,  todas  as  alterações efetuadas na base pela transação são canceladas.  O comando COMMIT confirma     as alterações.

1-11


DIÁRIO

O  TSQL  permite  que seja mantido  um  arquivo,  conhecido  como     diário,  para  ser usado na reconstrução de uma base a partir  de  uma     cópia de segurança, quando ocorrer uma falha de disco. Se o nome deste   arquivo  não  é  especificado  na ativação  do  utilitário  bdsgbd,  é  considerado o arquivo /usr/tsgbd/tsdic/diario.

O diário contém as alterações dos dados efetuadas na base desde a  última  cópia de segurança.  Para isso,  na criação da base,  deve ser definido  se as alterações serão gravadas em diário,  através da opção   -j do utilitário tsqlcrdb.  Esta decisão deve ser tomada em função  do  nível de segurança desejado,  tendo em vista que a gravação no  diário  afeta a performance das aplicações.

A  reconstrução  da  base  é  efetuada  através  da  ativação  do utilitário tsqlrjdb.

O  diário  também pode ser utilizado  para  desfazer  transações. Neste  caso,  a  base  deve ser criada com a opção  -J  do  utilitário tsqlcrdb.  No diário é, então,  gravado o valor do dado antes e após a     sua alteração.

Quando a base tratada for uma base OpenBASE e portanto uma base que não foi criada com o utilitário tsqlcrdb,  as opções para criação  de  diário são diferentes das apresentadas até aqui: a opção “diário” deve  ser  especificada  na  criação da base para que este  seja  criado;  o utilitário  BDREDI deve ser usado para recontruir uma base;  e a opção  “diarec”  deve ser usada na definição da base para que o diário  possa     também desfazer transações.

1-12


CÓPIA DE SEGURANÇA

Considerando que os meios magnéticos são extremamente voláteis, é essencial  efetuar regularmente uma cópia de segurança de uma base  de   dados.  Esta  operação  é realizada através do utilitário  tsqlup  que   permite  que seja efetuado a cópia de uma única tabela ou de todas  as tabelas  em  conjunto  com os módulos SQL  cadastrados.  O utilitário     tsqldown  efetua a operação inversa.  O nível de isolamento em que uma  cópia é realizada é o de uso exclusivo.

Estes utilitários não podem ser usados para uma base OpenBASE. Veja como fazer cópias de segurança destas bases no Anexo 1.

1-13


RECUPERAÇÃO

Quando ocorre uma interrupção durante a execução de uma aplicação ou após uma falha de disco, uma base de dados deve ser recuperada.

No  primeiro caso,  o utilitário “tsqlrecdb” deve ser  executado.            	Este  desfaz a última transação não completada pela aplicação a partir do  arquivo  de recuperação criado pelo sistema  para  cada  aplicação  sendo executada.

No segundo caso,  a base de dados deve ser substituída pela cópia  de  segurança  mais recente.  Em seguida,  se a base  foi  criada  com  gravação  em diário,  o utilitário “tsqlrjdb” deve ser executado para que as alterações registradas no diário sejam atualizadas. Somente são consideradas as alterações efetuadas  em  transações completadas. Durante esta operação nenhum usuário deve acessar a base.

Nota-se  que os utilitários tsqlrecdb e tsqlrjdb não desfazem  ou  refazem  as ações correspondentes aos comandos de definição  de  dados CREATE, DROP.

No caso de uma base OpenBASE,  os utilitários de recuperação  usados  devem  ser o BDRECU para recuperação de uma base após a interrupção de uma aplicação e o BDREDI para a recuperação após uma falha no disco.

Veja também Cópias de Segurança.

1-14


APLICAÇÕES

A  SQL  é  uma linguagem voltada para a realização  de  operações  específicas  de  banco  de dados.  Por isso,  ela  não  contém  certas  características  básicas  das  linguagens de programação tais  como  o comando IF para testar condições,  o comando GOTO, o comando FOR para     execução de iterações, etc...

Para  desenvolver  um programa que acesse um banco  de  dados,  é     necessário  utilizar uma linguagem convencional como C,  OPUS ou COBOL     que chamamos de linguagem hospedeira e “adicionar a SQL ao  programa”.

O  sistema TSQL oferece ao programador duas formas para utilizar a SQL em um programa de aplicação:

§ MÓDULO  SQL  - nesta abordagem os  comandos  SQL  da  aplicação constituem um módulo separado.  No módulo SQL cada  comando está associado a um determinado procedimento.A ligação  entre  a  aplicação em linguagem hospedeiraeos comandos  do   módulo SQL   é realizada através  de chamadas  a   procedimentos, com passagem de parâmetros.

A  atual  versão  do sistema TSQL  oferece esta forma para desenvolvimento de aplicações na linguagem de programação C.

1-15


§ SQL EMBUTIDA - nesta abordagem  os  comandos SQL estão embutidos diretamente no fonte da aplicação,  misturados com   os  comandos da outra linguagem de programação,  a linguagem  hospedeira.  Esta  forma  possui  a  vantagem    de  concentrar  no mesmo fonte os comandos das duas linguagens.

A  versão  atual do sistema TSQL oferece esta forma para  a  linguagem hospedeira OPUS.

Para efeito de processamento a forma embutida é transformada  por  intermédio  de um programa pré-compilador na forma  MÓDULO SQL (no caso    da  linguagem  OPUS  o próprio compilador OPUS  efetua  esta  tarefa).

Consequentemente,  toda  aplicação se encontra associada a  um  módulo SQL.  A precompilação de um fonte com comandos SQL embutidos gera  uma   cópia do fonte,  no qual os comandos SQL são substituídos por chamadas  a procedimentos,  e inclui em um módulo SQL os comandos SQL,  cada  um   associado  a  um  dos procedimentos segundo a  sintaxe  definida  para   MÓDULO (veja o capítulo LINGUAGENS). O módulo SQL pode conter comandos     provenientes de vários fontes de uma mesma aplicação.  Cada comando de     um  módulo  SQL  é então associado ao nome de um fonte . No  caso  da mudança de nome ou da eliminação de um destes fontes, os seus comandos no  módulo SQL correspondente devem ser eliminados através da execução  do utilitário tsqled (veja o capitulo UTILITÁRIOS).  A não eliminação   destes  comandos  poderá  gerar duplicação  de  identificadores  se  a   precompilação  de outros fontes da mesma aplicação provocar a inserção   de novos comandos.

1-16


A preparação de uma aplicação implica na compilação do módulo SQL e do programa hospedeiro. Quando compilado, um módulo SQL é catalogado numa base de dados.  Desta forma,  uma aplicação está associada a  uma     determinada base de dados através do modulo SQL ao qual ela se refere.

Na SQL embutida, todo esse processo é disparado automaticamente  pelo  pré-compilador.

O  modo de eliminar um módulo existente na base de dados é usando   o utilitário tsqldrop. Convém lembrar, porém,  que uma vez eliminado o módulo, as aplicações a ele associadas, apesar de ainda existirem, não   funcionarão  mais.  Isto ocorre pois não há mais representação  destas   aplicações na base de dados.

Permissões de execução dos módulos   (consequentemente  das     aplicações a ele associadas) podem ser atribuídas e revogadas.  Isto é  feito pelos utilitários tsqlgrant e tsqlrevoke.

          Veja  também Declaração, Linguagem e Utilitários.

1-17


SQL DINÂMICA

A  SQL utilizada por um programa de aplicação pode ser  executada  de duas formas: estática ou dinamicamente.

Na SQL estática o comando é embutido no programa ou pertence a um módulo  SQL. Desta forma,  durante a execução,  a parte  variável  do comando  SQL  se resume as variáveis de um programa hospedeiro ou  aos parâmetros de um procedimento de um módulo. Isto implica em que sejam conhecidos  préviamente  todos os comandos SQL que  serão  necessários  para  incluí-los no programa,  tornando  difícil  a  programação  de aplicações em que os comandos só são conhecidos durante a execução.  É  o  caso  por exemplo,  de um programa que  atende  interativamente  um usuário  que  deseja executar comandos SQL.  Os comandos são lidos  do     terminal  durante  a execução do programa.  Para atender a  aplicações como  estas  o  TSQL oferece a SQL dinâmica que  introduz  comandos  e   conceitos adicionais.

Na SQL dinâmica,  a aplicação constrói o comando SQL na forma  de  uma cadeia texto, e depois fornece a cadeia para o processador SQL.

A  seguir são apresentados suscintamente os comandos e  conceitos   introduzidos  pela  SQL  dinâmica.  Estes comandos  são  detalhados  no   capítulo comandos.

EXECUTE IMMEDIATE.

A  forma direta para usar a SQL dinâmica é com o comando  EXECUTE   IMMEDIATE.  Para usá-lo é necessário atribuir a uma variável  do  tipo cadeia  o  texto  do  comando SQL a ser  executado,  como  no  exemplo   seguinte  (todos  os  exemplos desta seção, mostram os comandos SQL usados  independentes  de  estarem embutidos em  alguma  linguagem  ou  estarem definidos em um módulo):

texto_sql= “DROP TABLE DEPARTAMENTO”

EXECUTE IMMEDIATE texto_sql

1-18


O  comando a ser executado não pode ser um comando ou  declaração  associado a um cursor como DECLARE CURSOR,OPEN, FETCH e CLOSE. Também     não  pode  ser  o comando SELECT tendo em vista que  a  SQL  dinâmica,     possui uma forma especifica para efetuar seleções que será apresentada     mais adiante.

PREPARE e EXECUTE

No  lugar do comando EXECUTE IMMEDIATE pode-se utilizar o  comando PREPARE seguido do comando EXECUTE como no exemplo a seguir:

texto_sql= “DROP TABLE DEPARTAMENTO”

PREPARE s1 FROM texto_sql

EXECUTE s1

O comando PREPARE associa um nome ao comando SQL (s1 no exemplo).

Este nome é então utilizado para a execução do comando.

Uma  vez  que um comando foi preparado,  ele pode  ser  executado   várias  vezes,  o  que torna a utilização de PREPARE  e  EXECUTE  mais  eficiente  que o EXECUTE IMMEDIATE que implicitamente prepara o comando a  cada  execução.  A preparação de um comando pode ser  uma  operação  custosa  devido à execução do otimizador.  O conjunto  PREPARE/EXECUTE possui as mesmas restrições que EXECUTE IMMEDIATE.  Em particular,  não se   pode   utilizar  EXECUTE  ou  EXECUTE  IMMEDIATE   para   executar dinamicamente um comando SELECT. No caso da aplicação desconhecer se o comando  preparado  é um comando SELECT,  a SQL  dinâmica  oferece  o comando DESCRIBE que retorna esta informação.  O comando DESCRIBE  só  pode ser utilizado no módulo SQL de uma aplicação em C e está descrito  no próximo item.

1-19


SELECT Dinâmico

O comando SELECT dinâmico é preparado como qualquer outro comando SQL dinâmico. Após a preparação, se o número de colunas selecionadas e seus  tipos  não são conhecidos em tempo de compilação,  é  necessário     utilizar  o  comando  DESCRIBE que preenche a  estrutura  SQLDA.  Esta estrutura de dados é formada por um contador e um grupo de  estruturas do tipo SQLVAR.  Cada SQLVAR é alocada para conter a descrição de  uma das  colunas  da  tabela resultante e contém  informações  como  tipo,  tamanho, nome, ponteiro para o valor etc. No TSQL,  o comando DESCRIBE   só  pode  ser utilizado no módulo SQL de uma aplicação em C  tendo  em  vista a necessidade de variáveis do tipo ponteiro.

Como  no  caso  do SELECT estático,  a criação  de  um  cursor  é  necessária.  A  forma  dinâmica de DECLARE cursor utiliza  o  nome  do  comando como no exemplo a seguir:

texto_sql = “SELECT nome FROM cliente WHERE cidade= 'Rio'”

PREPARE s1 FROM texto_sql

- - - - - - - - - - - - -

DECLARE c1 CURSOR FOR s1

A  abertura de um cursor em SQL dinâmica é idêntica a abertura em SQL estática.

             OPEN c1

O  comando FETCH dinâmico difere necessariamente do comando FETCH   estático somente se os elementos da cláusula SELECT só são  conhecidos  em  tempo  de execução.  Neste caso ele se refere  a  estrutura  SQLDA  associada ao comando.

FETCH c1 USING DESCRIPTOR sqlda_ds

1-20


Finalmente  o fechamento do cursor é idêntico ao fechamento de um   cursor estático.

CLOSE c1

A  seguir é mostrado um exemplo da sequência de comandos a  serem utilizados  para  a execução de um SELECT dinâmico,  no caso em que  o número  e os tipos dos itens da cláusula SELECT só são  conhecidos  em  tempo de execução:

texto_sql = “SELECT nome FROM cliente WHERE cidade= 'Rio'”

PREPARE s1 FROM texto_sql

DESCRIBE s1 INTO sqlda_ds

DECLARE c1 CURSOR FOR s1

OPEN c1

FETCH c1 USING DESCRIPTOR sqlda_ds

CLOSE c1

No  caso  em  que os itens da cláusula SELECT são  conhecidos  em   tempo de compilação é possível simplificar a sequência de comandos  da  seguinte forma :

             PREPARE s1 FROM texto_sql

             DECLARE c1 CURSOR FOR s1

             OPEN c1

             FETCH c1 INTO :a

             CLOSE c1

Nos exemplos apresentados, o comando FETCH deve ser executado um     número de vezes igual ao número de linhas a serem recuperadas.

Veja  também  Declare  Cursor, Open,  Fetch, Close  e Comandos Dinâmicos.

1-21


 	CAPÍTULO 2 - ELEMENTOS DA LINGUAGEM

PALAVRAS RESERVADAS

Sintaxe

ADD 	ALL 	ALTER

AND 	ANY	AS

ASC	AUTHORIZAT	IONAVG

BEGIN 	BETWEEN 	BY

C	CASCADE	CHAR          CHARACTER	CHECK	CLOSE

COBOL	COMMIT	 	CONTINUE

COUNT	CREATE	CURRENT

CURSOR

DATETIME 	DAY	DEC

DECIMAL       	DECLARE	DELETE

DESC	DESCRIBE	      DESCRIPTOR

DISPLACEMENT	DISTINCT	      DOUBLE

DROP

END 	ESCAPE	        EXCLUSIVE

EXEC	EXECUTE	EXISTS

EXTEND

OPUS	FETCH	FLOAT

FOR 	FOREIGN 	FORTRAN

FOUND	FRACTION	FROM

GO 	GOTO	 	GRANT

GROUP

HAVING	HOUR

IMMEDIATE	IN	INDEX

INDICATOR	INSERT	INT

INTEGER	INTERVAL	 	INTO

IS

KEY

LANGUAGE	LENGTH	LIKE

LOCAL	LOCK

MAXMIN           	MINUTE

MODE	MODULE	MONTH

NONE	NOT	NULL

2-3


NUMERIC

OF            	ON	OPEN

OPTION	OR	ORDER

PASCALPLI           	PRECISION

PREPARE	PRIMARY	        PRIVILEGES

PROCEDURE	PUBLIC

REAL	REFERENCES	REVOKE

ROLLBACK

SCHEMA 	SECOND	SECTION

SELECT 	SET	SHARE

SMALLINT      	SOME 	SQL

SQLCODE	SQLERROR	        SUBSTRING

SUM	SYSTEM

TABLETIME 	TO

UNION  	UNIQUE	 	UPDATE

USER	USING

VALUES        	VARCHAR	 	VARYING

VIEW

WHENEVER 	WHERE	WITH

WORK

YEAR

Regras

As palavras reservadas devem ser escritas em letras maiúsculas.

2-4


IDENTIFICADOR

Sintaxe

 identificador : [ letra | _ { letra | digito | # } ]

                     [ [_] { letra | digito | # } ]...

Regras

O  identificador deve ter no máximo 18 caracteres e pode  começar com  o caracter sublinhado caso nomeie um parâmetro.  Não devem  haver caracteres brancos entre letras e/ou números.

2-5


CONSTANTE

Sintaxe

constante : cadeia_de_caracteres |

                 constante_numérica |

                 constante data-hora

cadeia_de_caracteres : 	cadeia_padrão | cadeia_C

constante_numérica : 	constante_numérica_exata | 	constante_numérica_aproximada

constante data-hora :

                   DATETIME < {data [hora] | hora [data]} >

                   [qualificador_data-hora]

hora :

        valor_hora [ “:” valor_minuto [ “:” valor_segundo ]]

     data :

       [ [ [BC | AD] valor_ano - ] valor_mes - ] valor_dia |

       valor_dia [ / valor_mes [ / valor_ano [AC | DC] ] ]

     qualificador_data-hora :

                         campo_data-hora TO campo_data-hora

 campo_data-hora :

     YEAR | MONTH | DAY | HOUR | MINUTE | SECOND

Regras

Uma  cadeia  de  caracteres padrão é  delimitada  por  caracteres apóstrofe (') e pode conter qualquer caracter válido.  O apóstrofe (')  dentro  de  uma cadeia deve ser representado por um par de  caracteres  apóstrofe ('').

Uma cadeia de caracteres C é delimitada por aspas (“) e segue  as    mesmas  regras  de formação de cadeia da linguagem C,  podendo  conter    caracteres de controle como “\n”, “\r”...

Uma constante numérica exata é uma sequência de dígitos  precedida ou  não por sinal (+ ou -).  Ele pode conter uma parte inteira  e  uma  parte  decimal  separados por um ponto (.).  Se a constante não  tiver  parte decimal,  o ponto no fim é opcional,  porém se o número só tiver  parte  decimal  o  ponto  no inicio é obrigatório  (não  é  necessário  colocar um 0 inteiro o precedendo).

2-6

Uma  constante  numérica aproximada é uma mantissa  seguida  pelo caracter 'E' ou 'e' seguido de um expoente. A mantissa é uma constante numérica   exata   e  o  expoente  deve  ser  um   inteiro   precedido  opcionalmente por um sinal.  A constante numérica aproximada tem  como   valor,   o  valor  da  mantissa  multiplicado  pela  potência  de 10     correspondente ao expoente especificado.

Os valores de ano,  mês, dia, hora, minuto e segundo são inteiros  sem  sinal  e  devem respeitar a correção do valor  de  uma  data.  Os identificadores “BC” e “AC” indicam ano da era pré-cristã.

Em  geral,  as constantes data-hora são auto-explicativas no  que  diz  respeito  ao  significado de seus valores  (2/4/1992  e  1992-4-2  significam 2 de abril de 1992 e 17:22:30 indica 17 horas, 22 minutos e  30  segundos).  Existem apenas três casos que podem gerar  ambiguidade para  os  quais exitem uma interpretação default.  Para  alterá-los  é   necessária a definição do qualificador.

§ DATETIME <valor> indica um dia.

§ DATETIME <valor / valor> indica dia e mês.

§ DATETIME <valor - valor> indica mês e dia.

§ DATETIME <valor : valor> indica hora e minuto.

Em   todos  os  outros  casos,   o  possível  qualificador   deve  corresponder a definição da constante.

Dentro de uma constante numérica,  não pode haver nenhum caracter  branco, seja entre o sinal e o número, seja entre dígitos.

Veja Tipos de Dados.

2-7


COMENTÁRIO

Sintaxe

comentário : — caracter... <fim_de_linha>

Regras

Pode-se  inserir  comentários  (delimitados  por — e  o  fim  da  linha), após identificadores, palavras reservadas e constantes.

2-8


TIPOS DE DADOS

Sintaxe

     tipo_de_dados :

           tipo_cadeia_de_caracteres | tipo_numérico_exato |

           tipo_numérico_aproximado | tipo_data-hora

     tipo_cadeia_de_caracteres :

              { CHARACTER | CHAR } [ (tamanho) | VARYING ] |

              VARCHAR

   tipo_numérico_exato : INTEGER | INT | SMALLINT |

                           { NUMERIC | DECIMAL | DEC }

                                    [ (precisão [,escala]) ]

     tipo_numérico_aproximado :

                DOUBLE PRECISION | REAL | FLOAT [(precisão)]

     tipo_data-hora : DATETIME [qualificador_data-hora]

     qualificador_data-hora :

                         campo_data-hora TO campo_data-hora

     campo_data-hora :

                YEAR | MONTH | DAY | HOUR | MINUTE | SECOND

Regras

Tamanho, precisão e escala são números inteiros.

Os  tipos CHARACTER e CHAR são equivalentes e especificam o  tipo  de  dados  cadeia  de  caracteres de tamanho  fixo.  O  campo  tamanho   especifica o tamanho da cadeia e deve estar entre 0 e 32767,  caso ele seja  omitido, é considerado igual a 1.

VARCHAR e CHARACTER VARYING são equivalentes e especificam o tipo    de dados cadeia de caracter de tamanho variado.

INTEGER  e INT são equivalentes e especificam um  número  inteiro  que varia entre -2147483648 e 2147483647.  Já números do tipo SMALLIN  são inteiros entre -32768 e 32767.

2-9

DECIMAL,  DEC  e  NUMERIC são equivalentes  e  especificam  dados    numéricos de representação exata e ponto decimal fixo.  O número total  de  dígitos fracionários é especificado pela precisão que pode  variar   entre  0 e 18 (se for omitido é considerado 18). O número de  dígitos  decimais  fracionários é especificado pela escala e varia entre 0 e  o valor da precisão.  Caso seja omitida,o número de dígitos decimais é   considerado igual a zero.

Os  tipos  DOUBLE  PRECISION,  REAL  e  FLOAT  especificam  dados   numéricos  não exatos com ponto flutuante e número de dígitos binários  igual  a  56  para  a  DOUBLE PRECIOSION,  24  para  o  tipo  real  ou   especificada  pela  precisão  para  o  tipo  FLOAT.  O  tipo  FLOAT  é   equivalente  ao  tipo REAL se a precisão for omitida ou for menor ou igual  a 24 e equivalente ao tipo DOUBLE PRECISION se a  precisão  for   maior que 24.

O  tipo DATETIME especifica datas com uma precisão indicada  pelo    qualificador. O  campo inicial do qualificador deve ser sempre  maior  que  o  final e indica uma precisão que inclui todos os  campos  entre   eles.  Se  este  não  for definido,  o valor é  considerado  “YEAR  TO   SECOND”.

Os campos do tipo data-hora estão restritos a determinadas faixas  de valores. O campo ano (YEAR) pode variar entre 9999 AC e 9999 DC e  o   campo mês (MONTH) varia entre 1 e 12.  O valor de dia (DAY) está entre  1  e 31 e está sujeito aos valores do mês e ano para formar  uma data  correta. O campo hora (HOUR) varia entre 0 e 23 e os valores de minuto     (MINUTE) e segundo (SECOND) variam entre 0 e 59.

2-10


TABELA

Sintaxe

     tabela : [ identificador_de_autorização . ]

              identificador_de_tabela

Regras

Uma  tabela é declarada em uma definição de tabela ou de visão  e quando aparece em um comando SQL deve identificar uma tabela  definida no esquema pertencente ao identificador de autorização.

Quando a tabela não contém um identificador de autorização,  este  é implicitamente considerado igual ao identificador de autorização  do   módulo ou esquema de onde a tabela ocorre.

2-11


VARIÁVEL

Sintaxe

     No contexto SQL embutida,

     variável :  “:” identificador_de_variável

                  [ variável_indicator ]

     variável_indicator :

                [ INDICATOR ] “:” identificador_de_variável

     No contexto da linguagem de módulo,

     variável : identificador_de_parâmetro

                [ parâmetro_indicator ]

     parâmetro_indicator :

                [ INDICATOR ] identificador_de_parâmetro

Regras

Uma variável identifica um parâmetro e opcionalmente um parâmetro  indicador associado,  quando está contida em um módulo e uma  variável   hospedeira  e  opcionalmente  uma  variável  indicador  associada,  se  estiver  contida  em um comando SQL embutido.  Uma variável  indicador  deve  ser de um tipo numérico exato de escala igual a 0 e indica se  a     variável a ela associada tem valor válido ou não (indica nulo,  se for  negativa).

Parâmetros  e variáveis hospedeiras podem ser especificados  para entrada ou saída.  Ou seja,  os valores podem ser  passados para o comando  SQL a partir de variáveis do programa de aplicação  (entrada)  ou podem ser variáveis do programa de aplicação onde valores devem ser     armazenados (saída).

2-12


COLUNA

Sintaxe

referência_à_coluna :

 	  [{ tabela : [ identificador_de_correlação} . ]

              identificador_de_coluna

Regras

Como o próprio nome diz,  referência_à_coluna identifica a coluna   a ser considerada.

Se  a coluna estiver qualificada por uma tabela ou  identificador  de correlação,  o nome da coluna deve estar definido na tabela (uma ou   mais) associada ao qualificador e será considerada a tabela de  escopo mais interno.

O  escopo de uma tabela ou identificador de correlação é definido  por  uma  cláusula FROM contida na sub-consulta,  na especificação  de  consulta ou no comando SELECT INTO mais próximo.

Caso  a  coluna  não  esteja  qualificada,   está  implicitamente     especificada (se for a única possível) uma tabela ou correlação dentro do escopo mais interno que contenha a coluna em sua definição.

Veja também Tabela e Cláusula FROM.

2-13


FUNÇÃO

Sintaxe

     função : COUNT(*) | funçao_DISTINCT | função_ALL |

              função_escalar

     função_DISTINCT :

        {AVG | MAX | MIN | SUM | COUNT} (DISTINCT expressão)

     função_ALL :

        { AVG | MAX | MIN | SUM } ( [ALL] expressão)

    função_escalar : função EXTEND | função_SUBSTRING |

                      função LENGTH

     função_EXTEND :

         EXTEND ( expressão [ , qualificador_data-hora ] )

     qualificador_data-hora :

                         campo_data-hora TO campo_data-hora

     campo_data-hora :

YEAR | MONTH | DAY | HOUR | MINUTE | SECOND

     função_SUBSTRING :

        SUBSTRING ( expressão , expressão [,expressão] )

     função_LENGTH : LENTGH (expressão)

Regras

O  argumento  de  uma função DISTINCT é um  conjunto  de  valores derivado  da aplicação da expressão a cada linha da tabela  ou  grupo, eliminados todos os valores nulos ou duplicados. Já o argumento de uma  função ALL é o conjunto de valores derivado da aplicação da expressão, eliminados apenas os valores nulos.

COUNT(*) tem como resultado a cardinalidade (número de linhas) da  tabela ou grupo.

O  resultado  da função DISTINCT COUNT é a cardinalidade  de  seu  argumento e é do tipo INTEGER.

2-14


O resultado da função AVG é a média aritmética dos valores de seu argumento  e  o  da  função  SUM é o  somatório  dos  valores  de  seu  argumento.  Ambas só podem ser aplicadas a valores do tipo numérico  e retornam  um  valor de tipo DOUBLE PRECISION, caso sejam aplicados  a valores  numéricos aproximados;  ou um valor de tipo  INTEGER,  quando aplicados  a  valores INTEGER ou SMALLINT.  A função SUM  aplicada  a valores  NUMERIC  resulta  num valor de mesmo  tipo,  mesma  escala  e precisão  18;  já  a função AVG aplicada a esses valores  resulta  num  valor de mesmo tipo,  de escala somada a 18 e decrementada da precisão  original e precisão igual a 18.

As funções MAX e MIN tem como resultado respectivamente o maior e o  menor  valor  de seu argumento e é do mesmo tipo da  coluna  ou  da avaliação  da expressão.  As funções DISTINCT MAX e DISTINCT  MIN  são   equivalentes a MAX e MIN, respectivamente.

A  função  EXTEND ajusta a precisão do argumento para a  precisão indicada pelo qualificador. Esta função só pode ser aplicada a valores   de  tipo  DATETIME  e retorna um valor do mesmo tipo e com  precisão  especificada pelo qualificador.  Se este for omitido,  é retornado  um  valor de precisão YEAR TO SECOND.

Se a precisão do argumento da função EXTEND contém  campos não incluídos na precisão especificada pelo qualificador data-hora,  então os  campos excedentes são truncados.  Se a precisão especificada  pelo  qualificador  contém campos à esquerda dos campos do argumento,  então     campos  adicionais são iniciados com valores extraídos da data e  hora  correntes. O resultado deve constituir uma data correta.

2-15


Se a precisão especificada  pelo qualificador contém campos a direita dos campos  do argumento,  então estes campos adicionais são iniciados com o valor  1  para os campos mês e dia e com o valor 0 para os campos hora, minuto e  segundo.

A  função  LENGTH  retorna  um SMALLINT indicando  o  tamanho  do  operando que deve ser uma cadeia de caracteres.  Os caracteres brancos  não significativos,  ou seja,  a direita do último caracter não branco são  excluídos  no  cálculo do tamanho.  Se o  operando  for  nulo,  o  resultado da função também será nulo.

A função SUBSTRING retorna a sub-cadeia do primeiro argumento que começa  no  caracter de ordem definida pelo segundo argumento  e  cujo tamanho é dado pelo terceiro argumento.  O primeiro argumento deve ser do  tipo  cadeia de caracteres e os demais do tipo numérico exato  com     precisão igual a zero. Se a cadeia é do tipo VARCHAR, o resultado será  do  mesmo tipo,  senão seu tamanho será o especificado  pelo  terceiro  argumento.  No  caso  de  um  dos argumentos  ser  nulo,  o  resultado  retornado será nulo.

O  argumento da função que especifica a posição inicial deve  ser maior  que  zero  e menor ou igual ao tamanho da  cadeia  original.  O  terceiro argumento, se especificado,  deve ser maior ou igual a zero e menor  ou igual ao tamanho da cadeia original menos a posição  inicial  especificada  acrescido de um (tamanho da cadeia original a partir  da  posição  inicial).   Quando  este  argumento  não  é  especificado,  é  considerado um tamanho igual ao tamanho da cadeia a partir da  posição     inicial.

Mais  de uma função contendo a opção DISTINCT não podem  aparecer  na mesma especificação de consulta.

Quando o argumento das funções AVG, MAX, MIN, SUM, for vazio, seu  resultado é nulo.

Veja também Expressão e Tipos de Dados.

2-16


VALOR

Sintaxe

     valor : constante | USER | CURRENT | variável

Regras

O  tipo  de  dado de USER é uma cadeia de  tamanho  18.  O  valor     especificado  por  USER  é igual ao identificador  de  autorização  do  módulo  que contém o comando SQL cuja execução provocou a avaliação  do valor USER. No caso de um comando executado dinamicamente,  o valor de  USER é igual ao identificador do usuário que executa o comando.

O  valor indicado por CURRENT é do tipo “DATETIME YEAR TO SECOND”  e  é igual ao valor da data e hora correntes no inicio da execução  do  comando SQL onde aparece.

Veja também Variável  e Constante.

2-17


EXPRESSÃO

Sintaxe

     expressão : [ + | - ] primário

                 [ { + | - | * | / | “||” } expressão ]...

     primário : valor | referência_à_coluna | função |

                (expressão)

Regras

A avaliação de uma expressão respeita a seguinte ordem:

- expressões entre parênteses

- operações unárias

- operações de multiplicação e divisão

- operações de adição e subtração

-  operações de mesma precedência da esquerda para

   a direita.

Se  o  valor  de qualquer primário for nulo,  então  o  valor  da    expressão é nulo. Numa divisão, o divisor deve ser diferente de 0.

Uma expressão contendo uma cadeia de caracteres ou um primário do tipo data-hora não deve conter operadores matemáticos.

Um operador unário não pode ser seguido de uma constante numérica  iniciada por um sinal.

Operações  binárias  entre  dois  tipos  INTEGER  e/ou   SMALLINT retornam valores do tipo INTEGER;  se um dos operandos for de um  tipo   numérico aproximado, o tipo do resultado é DOUBLE PRECISION.

Se  um  operando  de uma operação binária é do tipo NUMERIC  e  o   outro  de  qualquer tipo numérico exato,  então o tipo do resultado  é   NUMERIC  com precisão igual a maior das precisões incrementado de 1  e  escala igual a maior das duas escalas,  no caso de soma ou subtração e     precisão  igual  a soma das duas precisões e escala igual a  soma  das     duas escalas,no caso de multiplicação ou divisão.

2-18


O  operador  '||'  executa  a concatenação  de  duas  cadeias  de     caracter. Seus operandos devem ser cadeias de caracter e seu resultado será a concatenação dos dois operandos, excluído os caracteres brancos não significativos. No caso de um dos operandos ser do tipo VARCHAR, o resultado  é  do  tipo  VARCHAR,  senão  o  tamanho  do  resultado  da     concatenação  é  a  soma  do tamanho de  seus  operandos.  Se  um  dos  operandos da concatenação é nulo, seu resultado também será.

Veja também Valor, Coluna, Função.

2-19


CONDIÇÃO

Sintaxe

     condição : item_de_seleção |

                item_de_seleção {AND|OR} item_de_seleção

     item_de_seleção : [NOT] { predicado | (condição) }

     predicado : predicado_de_comparação |

                 predicado_BETWEEN | predicado_LIKE |

                 predicado_NULL | predicado_IN |

                 predicado_quantificado | predicado_EXISTS

Regras

Retorna o valor verdadeiro, falso ou não conhecido, dependendo do   resultado  da aplicação de operadores lógicos a outras  condições.  O valor desconhecido como resultado final de uma condição é tratado como  falso  pelas cláusulas SQL (WHERE e HAVING),  pois ambas as  respostas  não retornam nenhum valor válido.  A diferença entre esses valores  se  dá na avaliação da condição segundo as tabelas-verdade abaixo.

 A avaliação de uma condição é feita na seguinte ordem:

§ Expressões entre parênteses.

§ Operações NOT.

§ Operações AND.

§ Operações OR.

§	Operações de mesma precedência da esquerda para a direita.

NOT  AND   V	F	?	OR	V	F     ?

2-21


ESPECIFICAÇÃO DE CONSULTA

Sintaxe

     especificação_de_consulta : cláusula_SELECT

                                 cláusula_FROM

                               [ cláusula_WHERE ]

                               [ cláusula_GROUP_BY ]

                               [ cláusula_HAVING ]

Regras

Retorna  uma  tabela  definida pelas  cláusulas  SELECT,  FROM  e opcionalmente pelas cláusulas WHERE, GROUP_BY e HAVING.

O  resultado de uma especificação de consulta é a tabela  formada  pelas  colunas  definidas  na  cláusula SELECT a  partir  das  tabelas  especificadas  na  cláusula FROM e segundo as  restrições  das  demais cláusulas. Cada coluna da tabela resultante tem o mesmo tipo, tamanho, precisão e escala da expressão da qual é derivada.

Se  o  resultado das cláusulas for uma tabela  agrupada  de  zero   grupos, o resultado da especificação de consulta é uma tabela vazia.

Apenas uma função DISTINCT AVG, COUNT ou SUM deve aparecer em uma  especificação  de  consulta,  a  não ser que esteja  presente  em  uma  sub-consulta.

Uma  especificação  de  consulta  é  dita  atualizável  se:

§	A opção DISTINCT não for especificada na cláusula 	SELECT.

§ 	Toda  expressão  definida  na  cláusula  SELECT  for  	uma  referência à coluna.

§ 	A cláusula FROM especificar exatamente uma  única  tabela  que seja atualizável.

§ 	A cláusula WHERE não incluir uma subconsulta.

§ 	Não forem definidas as cláusulas GROUP BY ou   	HAVING.

2-22


Cada  uma das cláusulas de uma especificação de consulta  realiza determinada  operação  sobre uma tabela,  retornando uma outra  tabela  modificada de algum modo.

A  primeira cláusula a ser executada é a cláusula FROM que faz  o  produto  cartesiano  entre  as  tabelas  especificadas.  A  seguir,  a  cláusula  WHERE,  se houver,  seleciona linhas da tabela  gerada  pela  cláusula  anterior  de acordo com uma condição.  A cláusula  GROUP  BY  agrupa  uma  tabela  e a cláusula HAVING seleciona  grupos  da  tabela segundo uma condição.

Finalmente,  a cláusula  SELECT  é  executada  sobre  a  tabela resultante  da aplicação das demais cláusulas e indica as colunas  que  pertencerão a tabela retornada pela consulta.

Veja também Cláusulas.

2-23


EXPRESSÃO DE CONSULTA

Sintaxe

     expressão_de_consulta :

            { especificação_de_consulta |

                            ( expressão_de_consulta ) }

            [ UNION  [ ALL ]

            { especificação_de_consulta |

                            ( expressão_de_consulta ) } ]...

Regras

Uma expressão de consulta especifica uma tabela a ser  retornada  numa consulta.

Se o operador UNION não for especificado:

§ A  expressão  de  consulta  é  atualizável,  no  caso da   	especificação de consulta ser atualizável.

§ A descrição da expressão de consulta é igual à descrição      	da especificação de consulta.

Se o operador UNION for especificado:

§ A expressão de consulta não é atualizável.

§ O grau de todas as especificações de consulta deve ser  o mesmo.

§ Os  nomes  das  colunas  da  tabela  especificada pela expressão  de consulta são  iguais aos  nomes das  colunas     	da primeira especificação  de consulta.

§ Os tipos das colunas correspondentes das  especificações     	de consulta devem ser comparáveis.

2-24

§ Quando o tipo de duas colunas correspondentes  é       CHARACTER, o tipo  da coluna  resultante   é CHARACTER de tamanho igual ao maior dos dois  tamanhos. Se o tipo  de   uma  das  duas  colunas correspondentes é NUMERIC e o outro é numérico exato,  então o tipo da coluna resultante     é NUMERIC. No caso do tipo de uma das duas colunas  correspondentes  ser numérico aproximado, então o  tipo da coluna resultante é DOUBLE PRECISION.

§ Se o tipo de duas colunas correspondentes é  DATETIME, o tipo da coluna resultante é DATETIME.  As  precisões das duas colunas devem ter o mesmo campo inicial que será o campo inicial da precisão da coluna resultante. O campo final da precisão resultante é o  maior dos campos finais.

§	Se uma das duas colunas correspondentes pode ter  valores nulos, então a coluna resultante pode ter valores nulos.

Na  avaliação de uma expressão de consulta, as expressões  entre parênteses são primeiro avaliadas. As operações de mesma procedência são avaliadas da esquerda para a direita.

O operador UNION elimina as linhas duplicadas na  operação  de  união  entre  os operandos. Para que  linhas  duplicadas  não  sejam   eliminadas, é necessário especificar a opção UNION ALL.

Veja também Especificação de Consulta,  Cláusulas e 	Select.

2-25


SUB-CONSULTA

Sintaxe

     sub-consulta : ( especificação_de_consulta )

Regras

Uma  sub-consulta  especifica uma coleção de  valores  obtidos  do  resultado de uma especificação de consulta.  Ou seja, retorna a tabela formada  pelas  colunas  definidas na cláusula  SELECT  a  partir da tabelas  especificadas  na cláusula FROM e segundo as  restrições  das  demais cláusulas.

O grau da tabela (número de colunas) derivada na sub-consulta é o número  de elementos da cláusula SELECT e deve ser igual a um,  a  não ser quando a sub-consulta está especificada em um predicado EXISTS.

Podem  ser  feitas,  nas  cláusulas SELECT,  WHERE ou  HAVING  da  sub-consulta,  referências a colunas das tabelas definidas na cláusula  FROM  da consulta externa.  É a chamada referência externa.  Quando um   nome de coluna aparece na sub-consulta e esta não pertence às  tabelas   especificadas  na  cláusula FROM,  ela pode  referênciar  colunas  das  tabelas tratadas pelos níveis externos da consulta.

Deste  modo,  podem existir situações ambíguas na  definição  das  cláusulas. A SQL  considera  que  uma  referência  a  coluna numa  sub-consulta  indica  uma coluna de uma tabela referenciada no mesmo  nível  ou  em algum dos níveis externos,  priorizando o mais  próximo.

Possíveis  ambiguidades  devem   ser  resolvidas  com   o   uso   de  qualificadores ou identificadores de correlação.

Veja também CLáusula e Especificação de Consulta.

2-26


CAPÍTULO 3 - PREDICADOS

BETWEEN

Sintaxe

predicado_between :

     expressão [NOT] BETWEEN expressão AND expressão

Regras

O predicado BETWEEN especifica a comparação de um valor dentro de  uma  faixa  de  valores,  para isso os  tipos  resultantes  das  três  expressões devem ser comparáveis.

A  sentença “x BETWEEN y AND z” é equivalente à sentença “x >=  y  AND  x  <=  z”,  assim  como o predicado “x NOT BETWEEN  y  AND  z”  é  equivalente à condição “NOT ( x BETWEEN y AND z)”.

Veja também Expressão e Condição.

3-3


COMPARAÇÃO

Sintaxe

      predicado_de_comparação :

             expressão comparador {expressão | subconsulta}

      comparador : = | <> | < | <= | > | >= | != | !> | !<

Regras

Compara dois valores que devem ser de tipos comparáveis.  O valor de uma comparação é verdadeiro,  falso ou não conhecido.  A comparação  tem  resultado desconhecido se o valor de uma das expressões for  nulo  ou  se  o resultado da sub-consulta é nulo ou vazio.  O  resultado  da   sub-consulta deve ter no máximo um único valor.

O comparador “!=” é equivalente a “<>” e retorna verdadeiro se as   expressões  são  diferentes.  Os comparadores “!>” e  “!<“  equivalem,  respectivamente aos operadores “<=” e “>=”.

A  comparação  de duas cadeias de caracteres é feita  caracter  a   caracter  da  esquerda  para a direita e respeitando  a  ordenação  da  tabela ASCII. Se duas cadeias de tamanhos diferentes são comparadas, a  menor  delas  é  completada com caracteres brancos para que  tenham  o  mesmo comprimento e a seguir comparadas.

A comparação de dois valores do tipo data-hora é efetuada após  o   ajuste  de  ambos  os valores à precisão especificada pelo  maior  dos  campos  iniciais  das  precisões dos valores até o  maior  dos  campos  finais.

Veja também Condição, Expressão e Sub-consulta.

3-4


EXISTS

Sintaxe

     predicado_exists : EXISTS sub-consulta

Regras

O  predicado EXISTS  é  verdadeiro  se o  conjunto  de  valores  retornado pela sub-consulta não é vazio.

Veja também <sub-consulta> e <condição>.

Exemplo

A consulta a seguir lista os nomes dos clientes que fizeram um  pedido de mais de 200 unidades:

               SELECT clientes.nome

               FROM clientes

               WHERE EXISTS (SELECT *

                    FROM pedidos

                    WHERE clientes.cód_cliente = pedidos.cliente

                    AND pedidos.quantidade >= 200)

3-5


IN

Sintaxe

     predicado_IN : expressão [NOT] IN {

                    ( expressão [ ,expressão ]... ) |

                     sub-consulta }

Regras

O  predicado  IN compara o valor da expressão com uma coleção  de  valores especificado na lista ou pela sub-consulta,  assim os tipos de todos  os  valores  envolvidos devem ser  comparáveis.  Uma  lista  de  valores  não  deve conter funções de grupamento ou  especificações  de  coluna.

Os predicados “x IN S” e “x = ANY S” são equivalentes, assim como  “x NOT IN S” e “NOT (x IN S)”.

Veja também Expressão, Valor, Sub-Consulta e Condição.

Exemplos

O  exemplo 1 lista os pedidos feitos nos três primeiros dias de  março  de 1992:

     SELECT cód_pedido, data, cliente

     FROM pedidos

     WHERE data IN (DATETIME<01/03/1992>, DATETIME<02/03/1992>,  DATETIME<03/03/1992>)

O  exemplo  2  lista os vendedores que trabalham  em  escritórios  que  venderam acima da meta:

     SELECT nome

     FROM vendedores

     WHERE escritório IN (SELECT escritório

                          FROM escritórios

                          WHERE vendas > meta)

3-6


LIKE

Sintaxe

    predicado_like :

    expressão [NOT] LIKE padrão [ ESCAPE valor_escape]

    padrão : expressao

    valor_escape : expressao

Regras

O predicado LIKE compara um valor com um padrão de caracteres.  O  valor da expressão, o padrão e o valor ESCAPE devem ser do tipo cadeia  de caracteres.

O  valor  do  predicado é desconhecido quando a  expressão  ou  o  padrão tem valor nulo.

Quando  o valor ESCAPE não é especificado ou é nulo,  o  caracter  sublinhado  (_)  no  padrão representa a  ocorrência  de  um  caracter qualquer  e o caracter porcentagem (%) representa a sequência de 0  ou  mais caracteres. Os demais caracteres representam a si mesmos.

Se  o  valor  ESCAPE  for  especificado,  as  interpretações  dos caracteres (_) e (%) podem ser desabilitadas usando-os precedido  pelo   primeiro  caracter  do valor ESCAPE.  Neste caso o par  de  caracteres  representará o próprio caracter sublinhado ou porcentagem,  conforme o  caso.

O predicado “x NOT LIKE y” é equivalente a “NOT (x LIKE y)”.

Veja também Expressão e Condição.

Exemplo

O  exemplo 1 retorna verdadeiro se o nome contiver a palavra Silva  em  qualquer parte da cadeia:

               nome LIKE '%Silva%'

3-7


O  exemplo  2  retorna verdadeiro se a referência  do  produto  contém exatamente 3 caracteres, sendo o primeiro deles um S:

               produto LIKE 'S__'

O exemplo 3 retorna verdadeiro se a referência do produto começa com o   caracter sublinhado (_):

               produto LIKE '\_%' ESCAPE '\'

3-8


NULL

Sintaxe

     predicado_NULL : expressão IS [NOT] NULL

Regras

O  predicado  compara  o  valor da expressão com  o  valor  nulo,  retornando  verdadeiro se a expressão for nula. A condição “NOT  (x  IS  NULL)” equivale à “x IS NOT NULL”.

Veja também Expressão e Condição.

3-9


QUANTIFICADO

Sintaxe

     predicado_quantificado :

       expressão comparador [ALL|ANY|SOME] sub-consulta

     comparador : = | <> | < | <= | > | >= | != | !> | !<

Regras

O  predicado  quantificado  compara um valor com uma  coleção  de  valores  retornado  pela  sub-consulta.  Os tipos da  expressão  e  do resultado da sub-consulta devem ser comparáveis.

O  predicado ALL é verdadeiro se o resultado da sub-consulta  for vazio  ou se a comparação entre a expressão e cada valor resultante da sub-consulta for verdadeiro. O predicado é falso se a comparação entre  a expressão e algum valor resultante da sub-consulta for falso.

Já   os  predicados  ANY  e  SOME  são  equivalentes  e  retornam verdadeiro se o resultado da comparação entre a expressão e algum  dos  valores  retornados  na  sub-consulta for  verdadeiro.  E  são  falsos  somente se o resultado da sub-consulta for vazio ou se as  comparações   entre a expressão e todos os valores da sub-consulta forem falsos.

O  valor  do predicado é não conhecido se não for verdadeiro  nem  falso.

Veja também Expressão, Sub-consulta e Comparação.

3-10


Exemplo

O  exemplo  1  lista os vendedores que tem PELO MENOS  UM  pedido  que  representa mais de 20 por cento de sua cota:

SELECT nome

FROM vendedores

WHERE (.2 * cota) < ANY (SELECT preco

    FROM pedidos

    WHERE pedidos.vendedor =

       vendedores.cod_vendedor)

O exemplo 2 lista os escritórios onde TODOS os  vendedores venderam mais que metade da meta do escritório.

SELECT escritório, cidade

     FROM escritorios

     WHERE (0.50 * meta) < ALL (SELECT vendas

         FROM vendedores

         WHERE escritorios.escritorio =

              vendedores.escritorio)

3-11


CAPÍTULO 4 - CLÁUSULAS

From	4-3

Where	4-5

Group by	4-6

Having	4-7

Select	4-8

Order by	4-10


FROM

Sintaxe

     cláusula_FROM :

              FROM tabela [identificador_de_correlação]

                [ ,tabela [identificador_de_correlação] ]...

Regras

A  cláusula  FROM especifica uma tabela derivada de uma  ou  mais tabelas e a descrição de seu resultado é a concatenação das descrições  das tabelas nela especificadas, na ordem em que seus nomes aparecem.

Um  identificador de correlação é usado para identificar a tabela   a  ele associada.  Caso a tabela não possua um,  ela é  dita exposta. Nomes  de  tabela expostos e/ou identificadores de correlações em  uma  cláusula FROM não podem ser iguais.  Quando se deseja fazer referência  a  mais  de uma instância uma mesma tabela ao mesmo tempo,  o  uso  de     identificadores  de  correlação  se  torna  necessário  para  eliminar possíveis ambiguidades.  O identificador de correlação pode ser  usado  mesmo sem  que  haja  necessidade explícita,  apenas  para  tornar  a  identificação da tabela mais legível no contexto.

O escopo dos nomes de correlação e dos nomes de tabelas  expostos   de uma cláusula FROM é a sub-consulta mais interna, ou a especificação de consulta, ou o comando SELECT INTO que contém a cláusula FROM.  Uma   cláusula   FROM  define  um  escopo  para  um  nome  de  tabela   nela     especificado somente se o nome de tabela estiver exposto.

Veja também Especificação de Consulta, Tabela, Sub-Consulta e SELECT.

4-3

Exemplo

Quando  a cláusula FROM contém mais de uma tabela,  ela especifica uma  junção.  O exemplo abaixo mostra o nome dos vendedores e a cidade onde  trabalham a partir de uma junção.

          SELECT nome,cidade

          FROM vendedores, escritorios

          WHERE vendedores.escritorio = escritorios.escritorio

O uso de identificadores de correlação é,  por exemplo,  necessário no  caso  de  uma junção de uma tabela com ela mesma.  O exemplo a  seguir lista todos os pares de pedidos feitos no mesmo dia.

          SELECT primeiro.pedido #, segundo.pedido #

          FROM pedidos primeiro, pedidos segundo

          WHERE primeiro.data = segundo.data

4-4


WHERE

Sintaxe

     cláusula_WHERE : WHERE condição

Regras

O resultado da cláusula WHERE é uma tabela contendo linhas  sobre a  qual o resultado da condição é verdadeiro.  Quando a cláusula  está inserida  numa especificação de consulta,  as linhas são oriundas  das  tabelas especificadas na cláusula FROM precedente.  Se a cláusula está   inserida num comando DELETE ou UPDATE, ela se refere à tabela indicada     no comando.

Cada especificação de coluna diretamente contida na condição deve  ser uma referência não ambígua a uma coluna da tabela original ou deve ser uma referência exterior.

Se  uma expressão diretamente contida na condição de seleção  for  uma função,  então a cláusula WHERE deve estar contida em uma cláusula  HAVING  e  a  referência à coluna na função deve  ser  uma  referência  exterior.

Veja   também  Condição,   Função,   Referência  à  Coluna,     Especificação de Consulta, FROM e HAVING.

4-5


GROUP BY

Sintaxe

    cláusula_GROUP_BY : GROUP BY referência_à_coluna

                                 [ ,referência_à_coluna ]...

Regras

A cláusula GROUP BY retorna uma tabela agrupada pelos valores das  colunas  listadas na cláusula,  chamadas de colunas de grupamento.  Em cada grupo, todos os valores de cada coluna de grupamento são iguais.

Quando  uma  condição ou uma expressão é aplicada a um  grupo  de  linhas,  uma referência a uma coluna de grupamento é uma referência ao valor desta coluna no grupo.

Para  o  GROUP  BY,  dois valores nulos de  uma  coluna   são  considerados  iguais entre  si e diferentes de todos os  valores  não  nulos desta coluna.

Veja também Referência à Coluna e Especificação de Consulta.

Exemplo

O  exemplo  abaixo apresenta a média das vendas de  cada  vendedor.  A  coluna  vendedor  é a coluna de grupamento e a tabela  retornada  pela  cláusula GROUP BY tem tantas linhas quanto o número de vendedores.

SELECT vendedor, AVG(preço_total) AS Media_de_Vendas

FROM pedidos

 GROUP BY vendedor

4-6


HAVING

Sintaxe

     cláusula_HAVING : HAVING condição

Regras

O  resultado  da cláusula HAVING é a tabela agrupada contendo  os  grupos resultantes da cláusula precedente que aplicando-se a condição,  o resultado é verdadeiro.

Se  a  cláusula precedente não for GROUP BY,  a  cláusula  HAVING  considera o resultado desta como um único grupo contendo toda a tabela  resultante da cláusula. Neste caso não há coluna de grupamento.

Veja também Especificação de Consulta.

Exemplo

O exemplo a seguir mostra o número dos vendedores que venderam mais de  $200000.00 e valor médio de suas vendas.

SELECT vendedor, AVG(preço_total)

     FROM pedidos

     GROUP BY vendedor

     HAVING SUM (preço_total) > 200000.00

4-7


SELECT

Sintaxe

cláusula_SELECT : SELECT [ALL | DISTINCT] lista_select

lista_select : * | item_lista [ ,item_lista ]...

item_lista : expressao [AS identificador_de_coluna] |

                  tabela.*

Regras

A  cláusula SELECT especifica os itens (lista_select) da tabela a ser retornada numa especificação de consulta. Um novo identificador de coluna pode ser atribuído às colunas da tabela resultante com o uso da  cláusula AS. O novo identicador apenas pode ser usado para referenciar  colunas  da  tabela na cláusula ORDER BY e nos comandos CREATE VIEW  e     DESCRIBE,  pois  são estes que podem operar sobre a  tabela  retornada pela cláusula SELECT.

A  cláusula  SELECT  é aplicada sobre  a  tabela  resultante  das cláusulas FROM e opcionalmente das cláusulas WHERE, GROUP BY e HAVING.

Se a cláusula GROUP BY tiver sido aplicada,  a tabela é dita agrupada.

A cláusula SELECT * é equivalente a uma lista_select que contenha  todas as colunas que constituem a tabela retornada pela cláusula  FROM  na  ordem  em que a tabela foi definida.  O item  tabela.*,  da  mesma forma, especifica todas as colunas na tabela indicada.

Se  a cláusula SELECT for aplicada a uma tabela não agrupada e  a lista_select incluir uma função, então o resultado da especificação de consulta  é  uma  tabela de linha única contendo em  suas  colunas os valores resultantes da avaliação das funções correspondentes aplicadas  à tabela original.

Se a lista_select não incluir funções,  cada expressão é avaliada  para  cada linha da tabela original.  A tabela resultante tem a  mesma cardinalidade (número de linhas) da primeira e suas colunas contêm  os valores derivados das expressões correspondentes.

Se  a  cláusula SELECT é aplicada a uma tabela agrupada em um  ou  mais grupos,  a tabela resultante tem cardinalidade igual ao número de grupos  e  cada  linha corresponde à aplicação das expressões  à  cada  grupo.

Se  DISTINCT  é especificado,  o resultado  da  especificação  de consulta retornará a tabela definida pela cláusula SELECT com todas as linhas duplicadas eliminadas.  Duas linhas são consideradas duplicadas se  os valores em todas as colunas correspondentes forem iguais.  Dois valores  nulos são considerados iguais e são diferentes  de  quaisquer outros valores.

Se   o  resultado  das  cláusulas  subsequentes  for  uma  tabela  agrupada,  as referências às colunas presentes em cada expressão devem ser referências à colunas de grupamento (especificadas em uma cláusula GROUP BY) ou estar dentro de uma função.

Se  o  resultado das cláusulas subsequentes não  for  uma  tabela agrupada  e  alguma  expressão  incluir uma  função,  então  todas  as referências  à  coluna  devem  estar numa  função  e  o  resultado  da  especificação de consulta é uma tabela de linha única.

Veja  também  Especificação  de  Consulta,   Select  Into e Select  Dinâmico.


ORDER BY

Sintaxe

cláusula_ORDER_BY : ORDER BY especificação_de_ordem

                             [ ,especificação_de_ordem ]...

especificação_de_ordem :

                 {referência_à_coluna | inteiro} [ASC|DESC]

Regras

A cláusula ORDER BY ordena as linhas de uma tabela.

As  especificações de ordem são referências à colunas  da  tabela  tratada  ou  números  inteiros  que indicam a  posição  da  coluna  na  definição  da tabela.  Os números inteiros devem ser maior que zero  e menor ou igual ao grau da tabela.

As  linhas são ordenadas pela primeira especificação de ordem.  A  seguir,   as   linhas  são  reordenadas  por  cada  uma   das   demais   especificações   de   ordem   dentro  do  conjunto  de   linhas   cuja especificação  de  ordem anterior têm valores iguais para  as  colunas  especificadas.

Se  a  opção DESC é especificada,  a tabela é ordenada  em  ordem decrescente. Caso contrário, a cláusula indica uma ordem ascendente.

Valores  nulos são menores que todos os valores não nulos de  uma  coluna.

Veja também Referência à Coluna, Cursor.

4-10


CAPÍTULO 5 - COMANDOS DINÂMICOS

SELECT DINÂMICO	5-3

SELECT INTO	5-4

INSERT	5-6

DELETE SELECIONADO	5-9

UPDATE SELECIONADO...............	5-10

OPEN 	5-12

FETCH  	5-13

DELETE POSICIONADO	5-15

UPDATE POSICIONADO  	5-16

CLOSE 	5-18

COMMIT	5-19

ROLLBACK	5-20

LOCK TABLE 	5-21


SELECT DINÂMICO

Sintaxe

     comando_SELECT_dinâmico : expressão_de_consulta

                               [ cláusula_ORDER_BY |

                               clausula_FOR_UPDATE ]

     clausula_FOR_UPDATE : FOR UPDATE OF { * |

                                   referência_à_coluna

                                 [,referência_à_coluna]... }

     expressão_de_consulta :

            { especificação_de_consulta |

                            ( expressão_de_consulta ) }

            [ UNION  [ ALL ]

            { especificação_de_consulta |

                            ( expressão_de_consulta ) } ]...

     especificação_de_consulta : cláusula_SELECT

                                 cláusula_FROM

                                 [ cláusula_WHERE ]

                                 [ cláusula_GROUP_BY ]

                                 [ cláusula_HAVING ]

Regras

O   comando  SELECT  dinâmico  retorna  a  tabela  definida  pela expressão de consulta, opcionalmente ordenada pela cláusula ORDER BY.

O comando SELECT dinâmico deve ser usado para fazer consultas  na  base de dados via utilitário tsqlI ou comando PREPARE.

Maiores  detalhes no uso do SELECT dinâmico podem ser encontrados nas seções PREPARE, DESCRIBE e FETCH dinâmico.

A  cláusula  FOR UPDATE tem efeito apenas quando se trata  de  um   SELECT  a  ser  usado numa declaração dinâmica de cursor.  Seu  uso  é  obrigatório   quando  o  cursor  for  ser  usado   para   atualizações  posicionadas na tabela. Neste caso somente as colunas especificadas na cláusula poderão ser atualizadas com o comando UPDATE.

Veja também CLáusulas, SELECT INTO, Expressão de Consulta e  Especificação de Consulta.

5-3


SELECT INTO

Sintaxe

     comando_SELECT_INTO : cláusula_SELECT

                           INTO variável [,variável ]...

                           cláusula_FROM

                         [ cláusula_WHERE ]

                         [ cláusula_GROUP_BY ]

                         [ cláusula_HAVING ]

Regras

O  comando  SELECT  INTO atribui valores de uma linha  da  tabela   resultante da cláusula SELECT às variáveis indicadas na cláusula INTO.

A  atribuição  será  feita  respeitando a ordem  das  colunas  na  definição da tabela. Os tipos das variáveis devem ser iguais aos tipos dos valores das colunas a elas correspondentes.  Se o tipo da variável   é  numérico  aproximado,  o tipo da coluna a ela  associada  pode  ser  numérico exato ou aproximado.

Se a tabela estiver vazia,  o parâmetro SQLCODE receberá o  valor  100  e não serão atribuídos valores às variáveis da cláusula INTO.  Se   houver erro durante a atribuição de valores às variáveis,  o parâmetro SQLCODE receberá um valor negativo.

Se  um valor é nulo,  a variável a ele correspondente deve  estar associada  a uma variável INDICATOR à qual será atribuído o valor  -1.

Se  o  valor a ser retornado for uma cadeia de caracteres  de  tamanho   maior que a variável, a variável INDICATOR retorna o tamanho da cadeia   e são atribuídos à variável os primeiros caracteres. Em outros casos o valor atribuído a variável INDICATOR será 0.

5-4

Se  o  valor  é uma cadeia de caracteres de tamanho  menor  que  a  variável,  esta é completada com caracteres brancos.  Se o valor é  do  tipo DATETIME de precisão diferente da precisão da variável,  então os  campos excedentes são truncados ou os campos adicionais são  iniciados  com  o valor 1 para os campos mês e dia e com o valor 0 para os campos hora, minuto e segundo.

Para  que  o comando seja executado,  é necessário que o  usuário  possua o privilégio SELECT sobre a tabela.

Veja também Cláusulas, GRANT, Variável e SELECT Dinâmico.

Exemplo

O  exemplo  abaixo  coloca  nas variáveis  do  programa  de  aplicação  (nome_vendedor,  sua_cota e suas_vendas), o nome, a cota e o valor das  vendas do vendedor especificado pelo número na variável  num_vendedor.

               SELECT nome, cota, vendas

               INTO :nome_vendedor, :sua_cota, :suas_vendas

               FROM vendedores

               WHERE cód_vendedor = :num_vendedor

5-5


INSERT

Sintaxe

     comando_insert :

         INSERT INTO tabela [ ( identificador_de_coluna

                           [,identificador_de_coluna]... ) ]

         { lista_de_valores | expressão_de_consulta }

     lista_de_valores : VALUES ( {expressão | NULL}

                        [ {, {expressão | NULL} }... ] )

     expressão_de_consulta :

            { especificação_de_consulta |

                            ( expressão_de_consulta ) }

            [ UNION  [ ALL ]

            { especificação_de_consulta |

                            ( expressão_de_consulta ) } ]...

     especificação_de_consulta : cláusula_SELECT

                                       cláusula_FROM

                                     [ cláusula_WHERE ]

                                     [ cláusula_GROUP_BY ]

                                     [ cláusula_HAVING ]

Regras

Este comando insere uma ou mais linhas em uma tabela atualizável.

Para  que  seja  feita  uma  inserção,   deve  constar  entre  os  privilégios  aplicáveis à tabela,  o privilégio INSERT.  A tabela  não  pode  aparecer  em  nenhuma cláusula FROM na  expressão  de  consulta.

Nenhuma  coluna  da tabela pode aparecer mais de uma vez na  lista  de  colunas.  Se a lista de identificadores de coluna for  omitida,  ficam implicitamente  especificadas  todas as colunas da tabela na ordem  em   que aparecem na definição da tabela.

5-6

O  número de valores relacionados na cláusula VALUES ou o grau da   tabela  (número de colunas) resultante da expressão de  consulta  deve     ser  igual ao tamanho da lista de colunas implícita ou  explicitamente  especificados.  A lista de valores na cláusula VALUES não deve  conter   funções de grupamento ou especificações de coluna.

Caso a tabela seja uma visão, as linhas serão inseridas na tabela  da qual a visão foi derivada.

Cada  nova  linha  da tabela  contém  os  valores  explicitamente   especificados   no  comando  e  valores  nulos  para  as  colunas  não  identificadas  na  lista ou para colunas não visíveis,  caso a  tabela  seja uma visão.

Se o tipo de um valor a ser inserido for cadeia de caracteres  de  tamanho  menor  que  a  cadeia  da coluna  na  tabela,  o  valor  será completado com caracteres brancos.  Se for de tamanho  maior,  nenhuma  linha  será  inserida e o parâmetro SQLCODE indicará o erro.  O  mesmo acontece  se  o  tipo da coluna for numérico exato  e não  houver  uma   representação  do  valor a ser inserido sem que haja perda de dígitos     significativos de sua parte inteira.

Se  uma coluna é do tipo DATETIME,  o valor a ela  correspondente deve  ser  do mesmo tipo com precisão de mesmo campo inicial.  Se  sua  precisão  for diferente da precisão do valor correspondente a  coluna,  os  campos  excedentes  são  truncados ou  os  campos  adicionais  são     iniciados com o valor 1 para os campos mês e dia e com o valor 0  para os campos hora, minuto e segundo.

A cardinalidade da tabela resultante da expressão de consulta é o   número  de linhas a serem inseridas.  Se esta tabela estiver vazia,  o   parâmetro  SQLCODE  receberá  o  valor 100 e  não  será  feita  nehuma  inserção.

5-7

Se  o valor a ser inserido numa coluna em cuja definição não seja permitido  valores  nulos for nulo,  nenhuma linha será inserida  e  o parâmetro SQLCODE indicará o erro.

Veja  também  Tabela,  Valor, GRANT e  Especificação de Consulta.

Exemplos

O  comando  abaixo  insere  na tabela de  clientes  a  empresa  Arruda  Associados  com o número 1111 e com o vendedor de contato especificado  por  101.  O crédito deste cliente ainda não foi definido e  recebe  o  valor nulo.

          INSERT INTO clientes (cód_cliente, nome, contato)

          VALUES (1111, 'Arruda Associados', 101)

O  comando  abaixo insere uma linha na tabela produtos.  Valores  para  todas  as colunas são especificados na ordem em que as  colunas  foram  definidas.

 INSERT INTO produtos

 VALUES ('CAT', '_w234', 'Parafuso tipo B2', 10.50, 500)

5-8


DELETE SELECIONADO

Sintaxe

     comando_DELETE_selecionado :

DELETE FROM tabela

                                  [ cláusula_WHERE ]

Regras

O  comando  DELETE selecionado é usado para eliminar uma ou  mais linhas  de  uma tabela atualizável.  A cláusula  WHERE  identifica  as linhas da tabela a serem eliminadas (todas sobre as quais a condição é verdadeira).  Se  não for especificada uma cláusula  WHERE,  todas  as linhas da tabela são eliminadas.

A  cláusula  WHERE  não  pode conter uma  sub-consulta  que  faça  referência à tabela a ser atualizada.

Se nenhuma linha for eliminada,  o parâmetro SQLCODE retornará  o valor 100.

Para  eliminar  linhas de uma tabela,  os privilégios do  usuário   aplicáveis à tabela devem incluir o privilégio DELETE.

Veja  também  Cláusula WHERE,   Tabela,   GRANT  e  DELETE    POSICIONADO.

Exemplo

O  exemplo abaixo apaga todos os pedidos feitos no dia 28 de fevereiro   de  1992.  Se  não  houver nenhum pedido  feito  nesta  data,  SQLCODE  receberá o valor 100.

          DELETE pedidos

          WHERE data = DATETIME <28/02/1992>

5-9


UPDATE SELECIONADO

Sintaxe

     comando_UPDATE_selecionado :

           UPDATE tabela SET atribuição [ ,atribuição ]...

           [ cláusula_WHERE ]

     atribuição :

             identificador_de_coluna = { expressão | NULL }

Regras

O  comando UPDATE selecionado atualiza uma ou mais linhas de  uma  tabela selecionadas pela condição da cláusula WHERE.  Se esta condição  não for especificada, todas as linhas da tabelas serão modificadas.

A  tabela  deve  ser atualizável e não pode aparecer  em  nenhuma cláusula  FROM de qualquer sub-consulta presente na cláusula WHERE.  O usuário deve possuir o privilégio UPDATE sobre a tabela.

A avaliação das expressões é feita antes da alteração do valor de qualquer coluna da linha. As expressões de atribuição não devem conter  funções. Cada coluna só deve aparecer uma única vez na cláusula SET.

Um  valor  nulo só será atribuído a uma coluna se  sua  definição  assim  o permitir.  Caso contrário,  nenhuma linha será alterada  e  o parâmetro SQLCODE indicará o erro.

5-10


Se  o tipo de um valor a ser atualizado for cadeia de  caracteres de  tamanho menor que a coluna da tabela,  o valor será completado com caracteres  brancos.  Se  for  de tamanho  maior,  a  linha  não  será atualizada e o parâmetro SQLCODE indicará o erro.  O mesmo acontece se o tipo da coluna for numérico exato e não houver uma representação  do   valor a ser atualizado sem que haja perda de dígitos significativos de     sua  parte  inteira.  Se o tipo de uma coluna é DATETIME  de  precisão  diferente  da  precisão  do  valor  correspondente,  então  os  campos excedentes  são truncados ou os campos adicionais são iniciados com  o  valor  1 para os campos mês e dia e com o valor 0 para os campos hora,  minuto e segundo.

No caso da tabela ser uma visão,  as linhas serão atualizadas  na   tabela da qual a visão foi derivada.

Veja também Tabela, Cláusula WHERE, Expressão e GRANT.

Exemplos

A  atualização a seguir aumenta em 20 por cento o crédito de todos  os   clientes da tabela.

               UPDATE clientes

               SET crédito = crédito * 1.2

A próxima atualização remaneja os vendedores do escritório 023 para  o   escritorio 123, atualizando, também, o nome do gerente.

              UPDATE vendedores

              SET gerente = 'João Marinho', escritório = 123

              WHERE escritório = 023

5-11


OPEN

Sintaxe

     comando_OPEN : OPEN identificador_de_cursor

Regras

Este comando abre um cursor que deve estar fechado e declarado no módulo.  O cursor é posicionado antes da primeira linha da tabela  por  ele especificada.

O  comando OPEN pode ser um comando dinâmico.  Se for o caso  ele deve  ser  executado após o comando PREPARE para  o  identificador  de comando associado ao cursor em sua declaração dinâmica.  O comando SQL  preparado deve ser um comando SELECT dinâmico.

Veja também Módulo, Cursor e PREPARE.

5-12


FETCH

Sintaxe

comando_FETCH : FETCH identificador_de_cursor

         INTO variável [ ,variável ] ...

Regras

O comando FETCH posiciona o cursor na próxima linha de uma tabela e coloca seus valores nas respectivas variáveis. O cursor deve estar declarado no módulo e deve, também, estar aberto.

O número de váriaveis especificadas deve ser igual ao grau (número de colunas) da tabela. Cada variável só pode aparecer uma vez na cláusula INTO.

Se uma váriavel for do tipo numérico aproximado, a coluna correspondente pode ser do tipo numérico aproximado ou exato. Se uma variável for do tipo DATETIME, a coluna correspondente deve ser do mesmo tipo e com precisão com o mesmo campo inicial. Em outros casos, os tipos da variável e da coluna correspondente devem ser idênticos.

Se um valor é nulo, a variável a ele correspondente deve estar associada a uma variável INDICATOR ao qual será atribuído o valor -1.

Se  o  valor a ser retornado for uma cadeia de caracteres  de  tamanho maior que a variável, a variável INDICATOR retorna o tamanho da cadeia e à variável são atribuídos os primeiros caracteres. Em outros casos o valor atribuído à variável INDICATOR será 0.

Se  o  valor é uma cadeia de caracteres de tamanho  menor  que  a variável,  esta é completada com caracteres brancos.  Se é DATETIME de precisão  diferente  da precisão da coluna  correspondente,  então  os campos excedentes são truncados ou os campos adicionais são  iniciados com  o valor 1 para os campos mês e dia e com o valor 0 para os campos  hora, minuto e segundo.

5-13

Caso  a  tabela esteja vazia,  ou o cursor esteja  posicionado  na última linha ou depois dela,  o cursor será posicionado após a  última linha, o parâmetro SQLCODE receberá o valor 100 e não serão atribuídos   valores às variáveis.

Se  houver um erro na atribuição de valores,  o parâmetro SQLCODE receberá um valor negativo.

Veja também  Módulo, Variável  e Cursor.

5-14


DELETE POSICIONADO

Sintaxe

     comando_DELETE_posicionado :

                   DELETE FROM tabela

                   WHERE CURRENT OF identificador_de_cursor

Regras

Este  comando  elimina  da  tabela a linha  onde  o  cursor  está   posicionado.

O cursor deve estar declarado no módulo e estar aberto no momento  da execução do DELETE. A tabela aqui especificada deve ser atualizável  e  igual a declarada na especificação do cursor.  O privilégio  DELETE deve  estar  incluído  entre os privilégios do  usuário  aplicáveis  à  tabela.

O  cursor  passa  a se posicionar  imediatamente  antes  da  linha seguinte  à  eliminada ou no fim da tabela se não houver linha após  a eliminada.

Veja também Tabela, Cursor, GRANT e DELETE Selecionado.

5-15


UPDATE POSICIONADO

Sintaxe

     comando_UPDATE_posicionado :

                   UPDATE tabela

                   SET atribuição [ ,atribuição ]...

                   WHERE CURRENT OF identificador_de_cursor

     atribuição :

              identificador_de_coluna = { expressão | NULL }

Regras

O  comando UPDATE posicionado altera na tabela a linha na qual  o  cursor está posicionado. Este deve estar aberto e declarado no módulo.

A  tabela  deve  ser  a mesma especificada na  cláusula  FROM  da declaração  do cursor e deve ser atualizável.  A expressão presente em  uma  atribuição  não  pode  conter uma função.  Cada  coluna  só  pode aparecer  uma  única  vez na cláusula SET.  O usuário deve  possuir  o   privilégio UPDATE sobre a tabela.

A  avaliação  das  expressões é feita  antes  da  atualização  de  qualquer valor da linha. Um valor nulo só é atribuído a uma coluna, se  a definição da mesma assim o permitir. Caso não permita, a atualização  não é feita em nenhum campo da linha e o parâmetro SQLCODE receberá um  valor identificando o erro.

5-16

Se  o tipo de um valor for cadeia de caracteres de tamanho  menor  que  a  coluna  da tabela,  o valor  será  completado  com  caracteres  brancos.  Se  for de tamanho maior,  a linha não será atualizada  e  o   parâmetro  SQLCODE  indicará o erro.  O mesmo acontece se  o  tipo  da   coluna  for  numérico exato e não houver uma representação do valor  a ser  atualizado  sem que haja perda de dígitos significativos  de  sua  parte  inteira.  Se  o  tipo  de uma coluna  é  DATETIME  de  precisão  diferente  da  precisão  do  valor  correspondente,  então  os  campos  excedentes  são truncados ou os campos adicionais são iniciados com  o valor  1 para os campos mês e dia e com o valor 0 para os campos hora, minuto e segundo.

No caso da tabela ser uma visão,  as linhas serão atualizadas  na tabela da qual a visão foi derivada.

Veja  também Tabela,  Cursor,  Expressão,  Create View e  Módulo.

5-17


CLOSE

Sintaxe

     comando_CLOSE : CLOSE identificador_de_cursor

Regras

Este comando fecha um cursor aberto anteriormente no módulo.

O  comando CLOSE pode ser um comando dinâmico.  Neste  caso,  ele fechará  um  cursor que foi declarado com uma  declaração  dinâmica  e aberto por um comando OPEN dinâmico.

Veja também Módulo, OPEN e Cursor.

5-18


COMMIT

Sintaxe

     comando_COMMIT : COMMIT WORK

Regras

Este  comando termina normalmente uma transação,  efetuando todas as  alterações feitas no banco de dados e fechando todos  os  cursores  abertos.

Veja também Transação e Cursor.

5-19


ROLLBACK

Sintaxe

     comando_ROLLBACK : ROLLBACK WORK

Regras

O  comando  ROLLBACK  termina  a  transação  corrente.  Todas  as alterações feitas na base de dados durante a transação são canceladas.

Todos os cursores abertos são automaticamente fechados.

Veja também Transação.

5-20


LOCK TABLE

Sintaxe

     comando_LOCK_TABLE : LOCK TABLE tabela

                          IN { SHARE | EXCLUSIVE } MODE

Regras

O  comando  LOCK TABLE faz uma reserva de tabela até o  final  da transação.

Quando  uma transação faz uma reserva com a opção SHARE,  é feita  uma  reserva  compartilhada  e outras transações podem  ler  dados  da  tabela,  porém somente a transação que fez a reserva pode atualizar  a  tabela.

Já  quando  a  reserva é feita com  a  opção  EXCLUSIVE,  nenhuma transação  diferente da que fez a reserva pode fazer qualquer  reserva de linhas da tabela, seja para atualização ou para leitura.

No  momento  em que a reserva é feita,  a tabela não  pode  estar aberta.  Deve  constar entre os privilégios do usuário,  o  privilégio  SELECT.

Veja também Tabela e Transação.

5-21


CREATE TABLE

 Sintaxe

     comando_CREATE_TABLE : CREATE TABLE tabela

                 ( item_def_tabela [ ,item_def_tabela ]... )

     item_def_tabela :

          identificador_de_coluna tipo_de_dadoSQL

                                  [restrição_de_coluna]... |

          restrição_de_unicidade |

          restrição_referencial  |

          especificação_de_indice

     restrição_de_unicidade :

            especificação_de_unicidade

                    ( identificador_de_coluna

                        [ , identificador_de_coluna ]... )

     especificação_de_unicidade : PRIMARY KEY | UNIQUE

     restrição_referencial :

          FOREIGN KEY ( identificador_de_coluna

                        [ , identificador_de_coluna ]... )

                        especificação_de_referencia

     restrição_de_coluna : NOT NULL | UNIQUE | PRIMARY KEY |

                           INDEX | especificação_de_referencia

     especificação_de_referencia :

                          REFERENCES tabela [ ação_gatilho ]

     ação_gatilho : regra_UPDATE [regra_DELETE] |

                    regra_DELETE [regra_UPDATE]

     regra_UPDATE : ON UPDATE { CASCADE | SET NULL }

     regra_DELETE : ON DELETE { CASCADE | SET NULL }

     especificação_de_indice :

                      INDEX ( identificador_de_coluna

                      [ , identificador_de_coluna ] ...)

5-22

Regras

O  comando CREATE TABLE define uma nova tabela cujo nome deve ser diferente  de  qualquer  outro  definido  no  mesmo  esquema.  Deve-se especificar  o  nome e o tipo de dados de todas as colunas da  tabela, sendo que duas colunas de uma tabela não podem ter o mesmo nome.

Quando o comando CREATE está em um esquema ou em um módulo,  se o nome da tabela especificar um identificador de autorização,  este deve ser igual ao do esquema ou módulo ao qual a tabela pertence.

Não  podem  ser definidas colunas do tipo  VARCHAR  ou  CHARACTER  VARYING.

A  restrição  NOT  NULL  na definição  de  uma  coluna  impede  a existência de valores nulos em qualquer de suas linhas. Esta restrição é considerada por todos os comandos SQL.

A definição de uma tabela pode conter uma restrição de  unicidade UNIQUE  ou PRIMARY KEY,  obrigando cada linha a ser criada a ter,  nas colunas especificadas (uma ou mais) , uma combinação de valores única, diferente  de  todas as outas combinações presentes  na  tabela.  Duas combinações  são  consideradas  iguais se o valor de  cada  coluna  na primeira  linha não é nulo e é igual ao valor da coluna correspondente     na segunda linha.

Apenas  uma  chave PRIMARY KEY com uma ou mais colunas  pode  ser definida   na   tabela.   A  restrição  NOT  NULL   será   considerada automaticamente  para todas as colunas desta chave.

Se existe uma especificação de unicidade UNIQUE ou PRIMARY KEY em   uma definição de coluna,  então é implicita uma restrição de unicidade formada pela especificação de unicidade e o nome da coluna.

5-23

A especificação de uma restrição referencial está subordinada  às   seguintes regras:

§ A   definição   da   tabela     de  referência    deve conter   	uma especificação de unicidade PRIMARY KEY.

§ Cada  nome de coluna da restrição referencial deve identificar uma  coluna da tabela e deve ser diferente de qualquer  outro na  mesma   definição.   A  lista composta destas colunas deve ser  de tamanho  igual  à  lista de  colunas da  PRIMARY KEY da tabela  de referencia.  As  colunas correspondentes  nas duas listas  devem ser do mesmo tipo.

§ O  usuário  que define a restrição referencial deve  possuir  o privilégio REFERENCES sobre a tabela de referencia.

§  Se,  em um esquema,  uma  tabela é  definida  e também referida na definição  de outra tabela,  então a definição da  tabela  deve preceder a referência à 	tabela.

§ Se,  é especificada uma regra DELETE(ou UPDATE) SET NULL   então  nenhuma   coluna  da   lista  de colunas que  define  a   restrição  referêncial  deve  ser restrita à valores não nulos.

§ Se,  na  definição de uma tabela,  duas restrições  referencias fazem  referencia  à  mesma tabela e as listas de  colunas   que definem  as  restrições  não são   disjuntas,   então    em   nenhuma  pode   ser especificada  uma  regra UPDATE e somente a  regra  DELETE CASCADE pode ser especificada.

5-24

A  restrição  referencial é verificada automaticamente para  cada comando SQL. Ela é satisfeita se, alguma coluna da restrição tem valor nulo,  ou  todas  as colunas da restrição contem valores não  nulos  e estes   são   iguais   aos   valçores  das   colunas   de   referencia correspondentes,   em  alguma  linha  da  tabela  de  referencia (linhacasada).

Se uma regra DELETE é especificada em uma restrição  referencial,então quando uma linha da tabela de referencia é eliminada:

§ Se  é  especificada  a regra DELETE CASCADE,  todas  as   	linhas casadas são eliminadas.

§ Se  é especificada a regra DELETE SET NULL,  em todas as 	linhas casadas  as  colunas que definem a restrição  recebem  	 o  valor nulo.

Se  uma regra UPDATE é especificada em uma restrição referencial,então quando em uma linha da tabela de referencia,  é alterada o valor de alguma coluna da chave primária(PRIMARY KEY):

§ Se  é  especificada a regra UPDATE CASCADE,  então em todas  as linhas  casadas,   a   coluna  correspondente   na  	definição  da  restrição recebe o mesmo valor.

§ Se  é especificada a regra UPDATE SET NULL,  então em 	todas  as linhas  casadas,   a   coluna  correspondente   na  	definição  da restrição recebe o valor nulo.

Se  existe uma especificação de referencia em uma definição  de coluna, então é implícita uma restrição referencial formada pela mesma coluna e a especificação de referencia.

Uma especificação de índice define sobre a tabela um índice.

5-25

Se  existe  uma  restrição de coluna INDEX em  uma  definição  de coluna,  então  é implícita uma especificação de indice cuja  chave  é   formada pela coluna.

Veja  também Tabela,  Referência à Coluna,  Tipo de Dado e Esquema.

 Exemplo

A  seguir  apresenta-se  a  definição da  tabela  clientes.  A  coluna  cod_cliente  é  a chave da tabela.  O código e o nome do  cliente  são campos  obrigatórios em todas as linhas (NOT NULL).

     CREATE TABLE clientes

          (cod_cliente INTEGER NOT NULL UNIQUE,

           nome CHARACTER (30) NOT NULL,

           vendedor INT,

           credito NUMERIC (10,2),

           PRIMARY KEY (cod_cliente))

5-26


CREATE VIEW

Sintaxe

     comando_CREATE_VIEW :

          CREATE VIEW tabela [ ( identificador_de_coluna

                       [ ,identificador_de_coluna ]... ) ]

          AS especificação_de_consulta

          [ WITH CHECK OPTION ]

     especificação_de_consulta : cláusula_SELECT

                                 cláusula_FROM

                                 [ cláusula_WHERE ]

                                 [ cláusula_GROUP_BY ]

                                 [ cláusula_HAVING ]

Regras

O  comando  CREATE  VIEW define uma visão.  Visão  é  uma  tabela virtual, ou seja, apesar de não existir fisicamente,  é vista como uma tabela.  A  visão é uma tabela cujas colunas estão especificadas  pela lista  de identificadores de coluna e são definidas pela especificação de  consulta.  Se  a lista de identificadores  não  for  definida,  as colunas  serão  nomeadas  pelos identificadores de  coluna  da  tabela  derivada na especificação de consulta.

Os   identificadores   de  coluna  devem   ser   obrigatoriamente especificados  no  caso de duas ou mais colunas terem nomes iguais  na     especificação  de  consulta ou pelo menos uma das  colunas  não  tenha nome. A lista de identificadores de coluna deve ter o mesmo tamanho do    grau da tabela (número de colunas da tabela) e duas colunas não  podem ter o mesmo identificador.

5-27

Para  que uma visão seja uma tabela atualizável é necessário que:

§ a especificação de consulta não contenha a opção 	DISTINCT na cláusula SELECT;

§ as   expressões   contidas  na  cláusula    SELECT   sejam referencias a colunas;

§	a cláusula FROM  especifique uma única  tabela atualizável;

§ a cláusula WHERE não inclua uma sub-consulta e não  sejam     usadas as cláusulas GROUP BY ou HAVING.

A  inserção,  atualização  e  eliminação  de  linhas  numa  visão atualizável é feita na tabela de onde a visão foi derivada.  Não serão permitidas  inserções  e  atualizações numa visão  que  contenha  duas colunas diferentes derivadas de uma única coluna na tabela original.

Quando o comando CREATE está em um esquema ou em um módulo,  se o nome da tabela especificar um identificador de autorização,  este deve ser igual ao do esquema ou módulo ao qual a tabela pertence.

Quando a cláusula WITH CHECK OPTION é especificada e a  definição da  visão  contém uma cláusula WHERE,  as inserções e atualizações  na visão  só  serão feitas se respeitarem a condição da  cláusula  WHERE.

Veja também Tabela, Cláusulas e Especificação de Consulta.

5-28

Exemplo

A  visão  a seguir foi criada para que o vendedor 101 trabalhe  apenas com os pedidos de seus clientes. Como esta visão é atualizável,  todas as alterações feitas nela serão atualizadas na tabela pedidos.

     CREATE VIEW meus_pedidos

     AS SELECT *

        FROM pedidos

        WHERE vendedor = 101

5-29


CREATE INDEX

Sintaxe

     comando_CREATE_INDEX :

          CREATE [ UNIQUE ] INDEX identificador_de_índice

          ON tabela ( identificador_de_coluna

                         [ , identificador_de_coluna ]... )

Regras

O  comando  CREATE  INDEX define um índice sobre colunas  de  uma tabela  anteriormente  definida.  O identificador do índice  deve  ser  único em um esquema. Cada coluna só pode aparecer uma vez na definição do  índice e deve identificar uma das colunas da tabela. O tamanho do  índice não deve exceder 128 bytes.

A  opção UNIQUE impede a existência de linhas duplicadas para  os valores   das  colunas  componentes  do  índice.   Se  esta  opção   é especificada, nenhuma coluna deve permitir valores nulos.

Se  o  nome da tabela contiver um identificador  de  autorização,  este deve ser o mesmo do módulo.

Veja  também Tabela.

5-30


DROP TABLE

Sintaxe

comando_DROP_VIEW : DROP VIEW tabela

Regras

O comando DROP VIEW elimina uma visão anteriormente definida. Para que seja eliminada, a visão não pode aparecer em nenhuma outra definição de visão.

Na eliminação de uma visão, as definições de privilégios sobre ela também são eliminadas.

Se tabela contiver um identificador de autorização, este deve ser igual ao identificador de autorização do módulo.

Veja também Tabela e Módulo.

5-31


DROP VIEW

Sintaxe

     comando_DROP_VIEW : DROP VIEW tabela

Regras

O  comando  DROP VIEW elimina uma visão  anteriormente  definida.

Para  que seja eliminada,  a visão não pode aparecer em nenhuma  outradefinição de visão.

Na  eliminação de uma visão,  as definições de privilégios  sobre ela também são eliminadas.

Se tabela contiver um identificador de autorização, este deve ser igual ao identificador de autorização do módulo.

Veja também Tabela e Módulo.

5-32


DROP INDEX

Sintaxe

comando_DROP_INDEX : DROP INDEX     	identificador_de_índice

Regras

O  comando DROP INDEX elimina um índice anteriormente definido no esquema.

Veja também CREATE INDEX.

5-33


GRANT

Sintaxe

     comando_GRANT :

        GRANT { ALL PRIVILEGES  |

                              privilégio [ ,privilégio ]...}

       ON tabela

       TO { PUBLIC | identificador_de_autorização }

          [ , { PUBLIC | identificador_de_autorização } ]...

        [ WITH GRANT OPTION ]

     privilégio :

          SELECT | INSERT | DELETE |

          UPDATE [(identificador_de_coluna

                          [ , identificador_de_coluna]...) ]

Regras

O  comando GRANT define privilégios de operação sobre  tabelas  e visões.  Consultas, inserções,  eliminações e atualizações numa tabela só  podem  ser  feitas  pelo usuário que  a  criou  (identificador  de autorização  do  módulo ou do esquema) ou por usuários que possuam  os privilégios   correspondentes  a  essas  operações  sobre   a   tabela   (especificados em algum comando GRANT).

Os  privilégios  definidos sobre a tabela são dados aos  usuários identificados pelo seu identificador de autorização na cláusula TO.  O  privilégio  UPDATE  é aplicável a cada coluna  individualmente.  Se  a lista  de colunas relativa ao privilégio UPDATE não for  especificada,considera-se  que  o  privilégio  é aplicável a todas  as  colunas  da tabela.

A  opção ALL PRIVILEGES dá aos usuários definidos na cláusula  TO  todos os privilégios aplicáveis à tabela.

A  opção PUBLIC define os privilégios especificados para      possíveis  usuários.  Estes  privilégios não podem  ser  atribuídos  a  terceiros.

5-34


Um  comando GRANT não pode tentar atribuir privilégios sobre  uma  tabela a seu dono.

Se  é o dono de uma tabela quem está executando o comando,  podem ocorrer as seguintes situações:

§ Se  se  tratar  de  uma  tabela,  o  dono  possui  todos  os          privilégios e pode atribuí-los livremente.

§ Se  se  tratar  de  uma  visão não  atualizável,  somente o	privilégio  SELECT tem sentido,  já que não podem ser feitas atualizações  nesta  tabela.  Este  privilégio só  poderá   ser atribuído   a   terceiros   se   o  dono  da  visão  possuir   o   privilégio SELECT com a  opção  WITH  GRANT  OPTION sobre  todas as tabelas das quais a visão é derivada.

§ Caso se trate de uma visão  atualizável,  serão válidos  os 	privilégios que o dono tem sobre a tabela que dá origem à  esta  visão.  Ele só poderá  atribuir a   terceiros  privilégios definidos  com  a opção WITH GRANT OPTION  sobre  a tabela  da qual a visão é derivada.

Para  que  um privilégio possa ser atribuído por um usuário a  um  terceiro, a opção WITH GRANT OPTION deve ter sido especificada num dos comandos grant que lhe deu este privilégio.

Veja também Tabela, CREATE VIEW, Módulo e Esquema.

5-35


Exemplo

O  exemplo 1 define os privilégios de consulta da tabela produtos e de  atualização  da  coluna  estoque para os  usuários  identificados  por silvia,  arnaldo e alex.  A opção WITH GRANT OPTION faz com que  esses  usuários possam delegar esses privilégios a outros usuários.

          GRANT SELECT,UPDATE (estoque)

          ON produtos

          TO silvia, arnaldo, alex

          WITH GRANT OPTION

O exemplo 2 dá a todos os usuários do sistema,  todos os direitos sobre a  tabela  pedidos.  Desta  forma todos podem  alterar  a  tabela  sem restrições.

          GRANT ALL PRIVILEGES

          ON pedidos

          TO PUBLIC

5-36


REVOKE

 Sintaxe

     comando_REVOKE :

       REVOKE { ALL PRIVILEGES  |

                             privilégio [ , privilégio ]... }

       ON tabela

       FROM { PUBLIC | identificador_de_autorização }

          [ , { PUBLIC | identificador_de_autorização } ]...

     privilégio : SELECT | INSERT | DELETE | UPDATE

Regras

O comando REVOKE retira os privilégios especificados dos usuários indicados na lista de identificadores de autorização da cláusula FROM.

Só  serão eliminados os privilégios que tenham sido especificados pelo usuário que está executando o comando REVOKE.

As   definições  de  privilégios  que  dependiam  do   privilégio  eliminado também serão eliminados.

A opção ALL PRIVILEGES retira dos usuários definidos na  cláusula TO todos os privilégios que estes possuíam em relação à tabela.

A  opção  PUBLIC retira os privilégios especificados de todos  os  usuários  que  os  possuía a partir de um GRANT  do  usuário  dono  do esquema.

Veja também Tabela e GRANT.

Exemplo

Digamos  que  silvia  tenha  recebido os  privilégios  de  consulta  e atualização da tabela produtos através do seguinte comando GRANT:

               GRANT SELECT,UPDATE (preço, estoque)

               ON produtos

               TO silvia, arnaldo, alex

 WITH GRANT OPTION

5-37


O  comando  REVOKE  a seguir executado pelo mesmo o  REVOKE  a seguir executado pelo mesmo usuário  que  deu  o comando  GRANT acima,  retira os privilégios que silvia tinha sobre  a  tabela.

               REVOKE ALL PRIVILEGES

               ON produtos

               FROM silvia

Já o comando REVOKE abaixo,  retira de arnaldo e alex o privilégio  de atualizar o preço e estoque dos produtos.

               REVOKE UPDATE

               ON produtos

               FROM arnaldo, alex

5-38


PREPARE

Sintaxe

comando_PREPARE : PREPARE identificador_de_comando

                       	FROM identificador_de_parâmetro

O parâmetro deve conter um dos comandos SQL listados abaixo.

comando_SQL  :  comando_COMMIT |

                          comando_DELETE_selecionado |

                          comando_DELETE_posicionado |

                          comando_INSERT |

                          comando_ROLLBACK |

                          comando_SELECT_dinâmico |

                          comando_UPDATE_selecionado |

                          comando_UPDATE_posicionado |

                          comando_CREATE_TABLE |

                          comando_CREATE_VIEW |

                          comando_GRANT |

                          comando_DROP_TABLE |

                          comando_DROP_VIEW |

                          comando_REVOKE |

                          comando_ALTER_TABLE |

                          comando_CREATE_INDEX |

                          comando_DROP_INDEX

Regras

O comando PREPARE prepara o comando SQL especificado no parâmetro para execução.

O  parâmetro  deve  ser do tipo cadeia de caracteres e  ter  como valor um comando SQL variável não nulo.  O comando SQL não pode conter variáveis.

Se o identificador de comando for igual ao usado em outro comando  PREPARE, o comando SQL anteriormente preparado será destruído.

5-39


O  identificador de comando permanece associado a  algum  comando preparado até o fim da transação.

Veja também Variável, Comandos e SQL dinâmica.

Exemplo

A  variável var_comando é uma cadeia de caracteres C que  contém,  por exemplo o comando

   SELECT *

                    FROM clientes

   WHERE vendedor = 101

O primeiro passo é preparar o comando para execução:

                    PREPARE comando1

                    FROM var_comando

A seguir deve ser executado o comando DESCRIBE que reconhecerá  o comando   como  uma  consulta  e  retornará  a  estrutura  da   tabela resultante.

5-40


DESCRIBE

Sintaxe

comando_DESCRIBE : DESCRIBE identificador_de_comando

                        	INTO identificador_de_parâmetro

Regras

O  comando  DESCRIBE  retorna informações sobre  um  comando  SQL préviamente preparado.

A  linguagem especificada no módulo deve ser C e o parâmetro deve ser do tipo SMALLINT.

O comando retornará a seguinte estrutura :

              struct SQLDA {

                    short SQLN;

                    short SQLD;

                    struct SQLVAR *SQLVAR;

               }

              struct SQLVAR {

                    char *SQLDATA;

                    long *SQLIND;

                    short SQLTYPE;

                    short SQLNULL;

                    short SQLLEN;

                    short SQLSCALE;

                    struct {

                         short SQLNAMEL;

                         char  SQLNAMEC[18];

                    }    SQLNAME;

               }

O parâmetro corresponde ao campo SQLN e deve especificar o número de estruturas SQLVAR. O campo SQLD retorna zero se o comando preparado não for um comando SELECT dinâmico.

5-41


Se  o  comando for um SELECT dinâmico,  SQLD indica o  número  de colunas  da tabela por ele especificada.  Se SQLD for maior que  SQLN,  não  serão retornadas as informações sobre as colunas da tabela.  Caso contrário serão retornadas nas primeiras estruturas SQLVAR a descrição das colunas correspondentes na tabela.

No  campo SQLTYPE é retornado um valor numérico indicando o  tipo  da coluna segundo a tabela abaixo.

Tipo da Coluna	Valor Numérico

CHARACTER	1

NUMERIC	3

DECIMAL	3

INTEGER	4

SMALLINT	5

FLOAT	         7 OU 8

REAL	7

DOUBLE PRECISION	8

DATETIME	9

VARCHAR	12

No  campo  SQLNULL é retornado o valor 1 se a  coluna  puder  ter valores nulos.

No campo SQLLEN é retornado o tamanho, em “bytes”, da coluna,  em função de seu tipo:

§ Se  o tipo é CHARACTER,  é  retornado  o   tamanho  da          	coluna;

§ Se  o  tipo  é NUMERIC  ou  DECIMAL,  é   retornada   a        precisão da coluna mais 1.

§ Se o tipo é INTEGER ou REAL, é retornado  4.

5-42


§ Se o tipo é SMALLINT, é retornado 2.

§ Se o tipo é FLOAT, é retornado 4 ou 8,  segundo a 	sua precisão.

§ Se o tipo é DOUBLE PRECISION, é retornado 8.

§ Se o  tipo  é  DATETIME, é função da precisão da coluna  da seguinte forma:

- 	2 “bytes” para o campo dia (de 01 a 31).

- 	1 “byte”  para  o  separador “/” entre  os  camposdia e mês.

- 	2 “bytes” para o campo mês (de 01 a 12).

- 	1  “byte”  para  o  separador “/” entre os  campo mês e ano.

- 	5 “bytes” para  o campo ano (de 9999-  a   9999,          ajustado a esquerda e completado com caractes espaço).

- 	1 “byte” para o separador “ “ entre o campo dia,          	 mês ou ano e o campo hora.

- 	2 “bytes” para o campo hora (de 00 a 23).

- 	1 “byte” para  o separador “:” entre   os   campos          hora e minuto.

- 2 “bytes” para o campo minuto (de 00 a 59).

-	1  “byte” para  o  separador “:” entre  os  campos      minuto e segundo.

- 	2 “bytes” para o campo segundo (de 00 a 59).

§ Se o tipo é VARCHAR, em SQLLEN é retornado o valor 0.

5-43


Em  SQLSCALE é retornada a escala do tipo NUMERIC ou DECIMAL ou a precisão  do  tipo DATETIME.  Esta é representada  numericamente  pelo  valor  numérico  do  campo  inicial somado com  o  do  final,  se  são diferentes. Os valores de cada campo são:

ano	64

mês	32

dia	16

hora	 8

minuto	 4

segundo	 2

Em SQLNAMEC é retornado o nome da coluna. Se este tem menos de 18 caracteres, o nome é completado com caracteres brancos.

Em  SQLNAMEL  é  retornado o tamanho do nome da coluna  que  será igual a 18, se a coluna tiver nome ou igual a 0, se a coluna não tiver nome.

A    estrutura    SQLDA   encontra-se   declarada   no    arquivo \usr\include\sqlda.h que pode ser incluído no programa de aplicação.

Veja também PREPARE.

5-44


EXECUTE

Sintaxe

comando_EXECUTE : EXECUTE identificador_de_comando

Regras

O  comando EXECUTE executa um comando SQL  previamente  preparado pelo comando PREPARE para o identificador de comando especificado.

O comando preparado a ser executado não pode ser o comando SELECT dinâmico.

Veja  também  SQL Dinâmica, Comandos,  PREPARE  e  EXECUTE IMMEDIATE.

Exemplo

Digamos  que  no programa de aplicação tenha uma variável  var_comando com o seguinte comando SQL:

                    UPDATE clientes

                    SET crédito = 80000.00

                    WHERE cód_cliente = 3456

Antes da execução propriamente dita,  o comando deve ser preparado com  o comando PREPARE e só então a execução pode ser completada:

                    PREPARE comando2

                    FROM :var_comando

                    EXECUTE comando2

5-45


FETCH DINÂMICO

Sintaxe

     comando_FETCH_dinâmico :

            FETCH identificador_de_cursor

            { USING DESCRIPTOR identificador_de_parâmetro |

            INTO variável [, variável ]... }

Regras

O comando FETCH dinâmico é utilizado para recuperar linhas geradas por um comando SELECT dinâmico que tenha sido preparado e associado a um cursor dinâmico.  Ele posiciona o cursor na próxima linha de uma tabela e recupera os seus valores.

O cursor já deve estar aberto por um comando OPEN dinâmico.

Se  o  cursor estiver posicionado numa linha,  o comando FETCH  o posicionará   na   linha  imediatamente  seguinte.   Se  ele   estiver  posicionado antes de uma linha,  o comando o colocará nesta linha.  Em ambos  os  casos  os  dados presentes na  linha  serão  atribuídos  às variáveis do programa de aplicação.

Caso  a  tabela  associada ao cursor esteja  vazia  ou  o  cursor     estiver  na  última linha,  o cursor será posicionado  após  a  última linha,  o  valor 100 será retornado no parâmetro SQLCODE e  não  serão atribuídos valores às variáveis do programa de aplicação.

5-47

Pode-se  fazer uso da cláusula INTO no comando FETCH se o número   e os tipos dos itens da clásula SELECT do comando SELECT dinâmico  são conhecidos em tempo de compilação.  No caso em que eles são conhecidos  somente  em  tempo  de execução,  deve-se utilizar  a  cláusula  USING   DESCRIPTOR.  Neste  último caso,  após a execuçaõ do  comando  PREPARE   deve-se  executar  o comando DESCRIBE que retorna as hospedeira  é a linguagem C e consequentemente se o comando FETCH  faz   parte  de um módulo SQL.  O parâmetro deve ser do tipo SMALLINT,  e  o comando  retornará  os  campos  segundo  as  informações  contidas  na    seguinte estrutura :

          struct SQLDA {

                    short SQLN;

                    short SQLD;

                    struct SQLVAR *SQLVAR;

               }

          struct SQLVAR {

                    char *SQLDATA;

                    long *SQLIND;

                    short SQLTYPE;

                    short SQLNULL;

                    short SQLLEN;

                    short SQLSCALE;

                    struct {

                         short SQLNAMEL;

                         char  SQLNAMEC[18];

                    }    SQLNAME;

               }

O  parâmetro corresponde ao campo SQLN e especifica o  número  de estruturas SQLVAR retornadas.

SQLD  corresponde  ao grau da tabela e deve ser menor ou igual  a  SQLN.  As  sucessivas  estruturas SQLVAR conterão  as  descrições  das   variáveis que retornarão os valores das colunas.

5-48

O campo SQLTYPE deve conter um valor numérico indicando o tipo da   coluna segundo a tabela abaixo.

Tipo da Coluna	Valor Numérico

CHARACTER	1

NUMERIC	2

DECIMAL	3

INTEGER	4

SMALLINT	5

FLOAT	6

REAL	7

DOUBLE PRECISION	8

DATETIME	9

VARCHAR	           12

O  campo  SQLNULL é igual a 1 se a variável  tiver  uma  variável INDICATOR a ela associada.  O campo SQLLEN é equivalente ao tamanho da variável.  O  campo SQLSCALE contém a escala do tipo numérico  caso  a variável seja desse tipo. O campo SQLNAME não é usado.

SQLDATA  aponta  para a área da memória para onde é  retornado  o valor  da  variável.  SQLIND  aponta para a área  da  memória  onde  é  retornada a variável INDICATOR, se SQLNULL é igual a 1.

Os  tipos das variáveis devem corresponder aos tipos das  colunas  correspondentes na tabela.  Se ocorrer um erro durante a atribuição de valores às variáveis, o parâmetro SQLCODE retornará um valor negativo.

5-49

Se a variável tiver a ela associada uma variável INDICATOR,  esta receberá  o  valor -1 se a coluna correspondente tiver valor  nulo;  o tamanho  do  valor da coluna se este for uma cadeia de  caracteres  de tamanho maior que o tipo da variável ou nos demais casos, retorna 0.

Se  o  tipo de uma variável é DATETIME de precisão  diferente  da  precisão da coluna correspondente,  os campos excedentes são truncados ou os campos adicionais são iniciados com o valor 1 para os campos mês e dia e com o valor 0 para os campos hora, minuto e segundo.

Veja também FETCH, Variável e OPEN.

5-50


EXECUTE IMMEDIATE

Sintaxe

comando_EXECUTE_IMMEDIATE : EXECUTE IMMEDIATE

                                 	   identificador_de_parâmetro

O parâmetro deve conter um dos comandos SQL abaixo.

comando_SQL :comando_COMMIT |

                        comando_DELETE_selecionado |

                        comando_DELETE_posicionado |

                        comando_INSERT |

                        comando_ROLLBACK |

                        comando_UPDATE_selecionado |

                        comando_UPDATE_posicionado |

                        comando_CREATE_TABLE |

                        comando_CREATE_VIEW |

                        comando_GRANT |

                        comando_DROP_TABLE |

                        comando_DROP_VIEW |

                        comando_REVOKE |

                        comando_ALTER_TABLE |

                        comando_CREATE_INDEX |

                        comando_DROP_INDEX

Regras

O  comando EXECUTE IMMEDIATE executa o comando  SQL  especificado  pelo parâmetro.

O  parâmetro deve ser do tipo cadeia de caracteres e seu valor  é um  comando  SQL  dinâmico  não nulo que não  seja  o  comando  SELECT dinâmico nem contenha nenhuma variável.

Veja também  Comandos, EXECUTE e SQL dinâmica.

5-52


Exemplo

Há um comando SQL numa variável do programa de aplicação e sabe-se que este  não  é  um  SELECT  dinâmico.   Pode-se  executa-lo  sem  prévia preparação:

               EXECUTE IMMEDIATE var_comando

var_comando  é  uma variável do programa de  aplicação  contendo,  por exemplo, o comando DELETE FROM pedidos

  	DELETE FROM pedidos

WHERE vendedor = 102

5-53


CAPÍTULO 6 - DECLARAÇÕES

CURSOR

Sintaxe

     cursor : DECLARE identificador_de_cursor CURSOR

              FOR expressão_de_consulta

              [ cláusula_ORDER_BY ]

     expressão_de_consulta :

            { especificação_de_consulta |

                            ( expressão_de_consulta ) }

            [ UNION  [ ALL ]

            { especificação_de_consulta |

                            ( expressão_de_consulta ) } ]...

     especificação_de_consulta : cláusula_SELECT

                                 cláusula_FROM

                                 [ cláusula_WHERE ]

                                 [ cláusula_GROUP_BY ]

                                 [ cláusula_HAVING ]

Regras

Para  trabalhar  com  um cursor,  este  deve  ser  definido  numa declaração DECLARE CURSOR,  onde lhe é associado um nome diferente  de qualquer outro definido no módulo.  Para ser usado,  o cursor deve ser aberto com o comando OPEN.

A  tabela  especificada  pelo  cursor é  a  tabela  retornada  na especificação  de consulta,  podendo ou não estar ordenada  segundo  a cláusula ORDER BY. Será dita atualizável, se a especificação do cursor for atualizável e não for declarada a cláusula ORDER BY.

Se a cláusula ORDER BY não for especificada,  as linhas da tabela poderão   ser  recuperadas  em  qualquer  ordem,   com  resultado  não previsível.

Veja  também Especificação de Consulta, CLáusulas,  Comando OPEN, Comando CLOSE, FETCH, DELETE e UPDATE.

6-3

Exemplo

O primeiro passo é a declaração do cursor que associa a consulta a ser  feita  (escritórios e gerentes que venderam menos que sua meta) com um nome de cursor:

               DECLARE cursor1 CURSOR

               FOR SELECT escritório, gerente, vendas

                   FROM escritórios

                   WHERE vendas < meta

Para que se possa usar o cursor, este deve ser aberto:

               OPEN cursor1

Leitura  das sucessivas linhas da tabela resultante podem  ser  feitas com  o  comando FETCH que atribui os valores de cada coluna  da  linha para onde o cursor está apontando a variáveis do programa:

               FETCH cursor1

               INTO :local, :nome, :valor

Mais  duas  operações  podem  ser feitas sobre  as  linhas  da  tabela indicada pelo cursor.  O exemplo a seguir altera o nome do gerente  da linha corrente:

               UPDATE escritórios

               SET gerente = 'Mauro Amaral'

               WHERE CURRENT OF cursor1

A seguir, mostra-se como apagar uma linha da tabela:

               DELETE FROM escritórios

               WHERE CURRENT OF cursor1

Após o fim da utilização do cursor, este deve ser fechado:

               CLOSE cursor1

6-4

CURSOR DINÂMICO

Sintaxe

cursor_dinâmico :

                     DECLARE identificador_de_cursor CURSOR

                      FOR identificador_de_comando

Regras

Uma  declaração dinâmica de cursor associa um nome de cursor a um  comando  SQL  preparado.  O nome do cursor tem que  ser  diferente  de qualquer outro declarado no mesmo módulo.

Veja também Cursor e PREPARE.

6-5


PROCEDIMENTO

 Sintaxe

     procedimento :

            PROCEDURE identificador_de_procedimento

                  declaração_de_parâmetro

                               [declaração_de_parâmetro]...;

            comando_SQL;

     declaração_de_parâmetro :

            identificador_de_parâmetro tipo_de_dadoSQL |

                SQLCODE

     comando_SQL : manipulação_de_dados |

                    manipulação_de_esquema |

                    comando_dinâmico

     manipulação_de_dados : comando_CLOSE |

                            comano_COMMIT |

                            comando_DELETE_posicionado |

                            comando_DELETE_selecionado |

                            comando_FETCH |

                            comando_INSERT |

                            comando_LOCK |

                            comando_OPEN |

                            comando_ROLLBACK |

                            comando_SELECT_INTO |

                            comando_UPDATE_posicionado |

                            comando_UPDATE_selecionado |

manipulação_de_esquema: comando_CREATE_TABLE |

                              comando_CREATE_VIEW |

                              comando_GRANT |

                              comando_CREATE_INDEX |

                              comando_DROP_TABLE |

                              comando_DROP_VIEW |

                              comando_REVOKE |

                              comando_DROP_INDEX |

     comando_dinâmico : comando_PREPARE |

                        comando_EXECUTE |

                        comando_EXECUTE_IMMEDIATE |

                        comando_DESCRIBE |

                        comando_OPEN |

                        comando_FETCH_dinâmico |

                        comando_CLOSE

6-6


Regras

Num  módulo,   um  procedimento  é  formado  de  um  conjunto  de declarações  de parâmetros seguido de um comando SQL  especificado  em termos dos parâmetros.

Um  dos parâmetros deve ser obrigatoriamente o parâmetro SQLCODE.

Neste  será  retornado  um valor indicando o  que  ocorreu  durante  a execução  do comando SQL.  O valor retornado será negativo no caso  da  ocorrência  de  algum  erro  durante  a  operação.  Se  nenhuma  linha satisfizer as condições do comando, SQLCODE terá valor 100.  Em outros casos, o comando foi realizado com sucesso e SQLCODE terá valor 0.

O  nome  do procedimento deve ser diferente de todos  os  outros, assim  como dois parâmetros em um mesmo procedimento não devem  ter  o mesmo  nome.  Todos  os  parâmetros usados no comando  SQL  devem  ser declarados no procedimento.

No caso de uma coluna ter o o mesmo nome de um dos parâmetros,  a  coluna deverá sempre ser identificada com um qualificador.

Para a linguagem C:

Podem  ser especificados os tipos  CHARACTER,  VARCHAR,          INTEGER,  SMALLINT,  DOUBLE  PRECISION,  REAL  ou  FLOAT  ou DATETIME. O parâmetro C correspondente à SQLCODE deve ser do  tipo 'long'.

6-7


A um parâmetro do tipo CHARACTER deve ser associada uma variável  C  do tipo vetor de char de mesmo tamanho.  Não  é necessário o caracter '\0' no fim do vetor.  Ao tipo VARCHAR deve  ser  associado um vetor de 'char' cujo valor deve  ser terminado pelo caracter '\0'.  Aos tipos INTEGER,  SMALLINT,  DOUBLE  PRECISION e REAL devem ser associados respectivamente  os tipos 'long',  'smallint',  'double' e 'float'.  Ao  tipo FLOAT  podem  ser associados os tipos 'double'  ou  'float',  conforme a precisão especificada.

O  tipo DATETIME corresponde a um vetor de elementos do   tipo  char.  O tamanho do vetor e o seu conteúdo  devem  ser função da precisão do parâmetro, da seguinte forma:

§ 2 caracteres para o campo dia (de 01 a 31).

§ 1 caracter  para  o  separador “/” entre os campos 	dia e mês.

§ 2 caracteres para o campo mês (de 01 a 12).

§ 1 caracter para o  separador “/” entre  os  campos mês e ano.

§ 5 caracteres para o campo ano (de 9999- a 9999, ajustado a  esquerda  e completado  com  caractes 	espaço).

§ caracter para o separador “ “ entre o campo dia, mês ou ano e o campo hora.

§ 2 caracteres para o campo hora (de 00 a 23).

§ 1  caracter para o separador “:” entre os  campos hora  e minuto.

§ 2 caracteres para o campo minuto (de 00 a 59).

§ 1 caracter para o separador “:” entre os campos minuto  e   segundo.

§ 2 caracteres para o campo segundo (de 00 a 59).

6-8


Para a linguagem COBOL:

Podem  ser  especificados os tipos  CHARACTER,  NUMERIC  (DECIMAL)ouDATETIME. O parâmetro COBOL correspondente  à SQLCODE  deve  ser 'PICTURE S9(t) USAGE  IS  COMPUTACIONAL', onde t deve ser maior ou igual a 4.

Se   um  parâmetro  for  do  tipo   CHARACTER(t),   seu correspondente COBOL deve ser do tipo PICTURE X(t), onde t é o tamanho especificado. Se o parâmetro for NUMERIC(p,e), seu correspondente  COBOL deve ser 'USAGE DISPLAY  SIGN  LEADING  SEPARATE PICTURE S9(p-e)V9(e), onde 'p' e 'e' são a precisão e a escala especificadas.

Se uma declaração de parâmetro especificar o tipo  DATETIME,  então  o  tipo  da variável COBOL  correspondente  deve  ser  “PICTURE  X(t)”.  O  valor de “t” e o conteúdo  da  variável  devem ser função da precisão do parâmetro da mesma forma que em C.

Para a linguagem OPUS:

Podem  ser especificados os tipos CHARACTER,  VARCHAR,	DECIMAL,  DOUBLE  PRECISION  ou DATETIME (de  campo  inicial YEAR).  O parâmetro OPUS correspondente à SQLCODE deve  ser  do tipo numérico sem decimais.

A uma variável do tipo CHARACTER de tamanho T deve  ser  associada  uma  variável  OPUS do tipo  alfanumérico  de  T caracteres.  Ao tipo VARCHAR deve ser associado um parâmetro  do  tipo alfanumérico.  O tipo DECIMAL corresponde  ao  tipo  numérico e o tipo DOUBLE PRECISION corresponde ao tipo ponto flutuante de OPUS.  O tipo DATETIME YEAR TO DAY corresponde ao  tipo  data.  Para  precisões SQL menores  que  esta,  os valores  excedentes serão truncados.  Não há correspondencia   em fácil para campos DATETIME que apenas especificam hora.

6-9


Quando  um procedimento é chamado pelo programa de aplicação,  se não  tiver  sido  iniciada  nenhuma transação,  uma  será  iniciada  e associada a esta chamada e às próximas chamadas no módulo até que seja  terminada.

Veja  também  Comandos eTipo de Dado.

6-10


CAPÍTULO 7- LINGUAGENS

Esquema

Módulo

C

SQL Embutida

OPUS Hospedeira


ESQUEMA

Sintaxe

     esquema : CREATE SCHEMA

               [ AUTHORIZATION identificador_de_autorização ]

               [ definição... ]

     definição : comando_CREATE_TABLE |

                 comando_CREATE_VIEW |

                 comando_GRANT

Regras

Cria um esquema formado por um identificador de autorização,  um conjunto de tabelas, um conjunto de visões e um conjunto de definições de  privilégios. Não  é  obrigatória  a  definição  de  todos  esses conjuntos.

As tabelas e visões de um esquema pertencem ao usuário cujo  nome é o identificador de autorização.

Se  a  claúsula  AUTHORIZATION  é  omitida  é  considerado   como identificador  de autorização o nome do usuário que executa a  criação do esquema.

     Veja CREATE TABLE, CREATE VIEW e GRANT.

7-3


MÓDULO

 Sintaxe

     módulo : MODULE [identificador_de_módulo]

              LANGUAGE { C | COBOL | OPUS }

            [ AUTHORIZATION identificador_de_autorização ]

              [ declaração ]...

     declaração : cursor | cursor_dinâmico | procedimento

 Regras

Um módulo deve estar associado a um programa de aplicação durante sua execução e não pode ter nome igual ao de outro módulo na mesma base de dados.

Uma  declaração de cursor deve preceder qualquer comando que faça referência  a ele.  Para cada uma,  deve haver um  único  procedimento neste módulo que contenha um comando OPEN para o dado cursor.

Se  o  programa de aplicação associado ao módulo terminar  a  sua execução  sem que a transação iniciada tenha sido terminada,  todas as alterações  efetuadas  sobre a base de dados  durante  esta  transação serão efetivadas.

Se   a  claúsula  AUTHORIZATION  é  omitida  é  considerado  como identificador de autorização o nome do usuário que compila o módulo.

Veja também Cursor, Cursor Dinâmico  e Procedimento.

7-4


Desenvolvimento de programas de aplicação :

1. Geração do programa de execução da aplicação

Para  preparar o programa de execução,  o programador deve seguir  os seguintes passos:

i) 	compilar o(s) módulo(s) na linguagem hospedeira

ii)	compilar o(s) módulo(s) SQL, através do utilitário tsqlbind

iii) 	Ligar:

§ o(s) objeto(s)  proveniente(s)  do(s)  módulo(s)  em

linguagem hospedeira

§ o(s)  objeto(s)  sql gerado(s) pelo  utilitário  tsqlbind          (veja utilitário tsqlbind).

§ a biblioteca tsql ou rsql: -ltsql ou -lrsql

§ a biblioteca matemática: -lm

As bibliotecas tsql e rsql tem como finalidade principal  efetuar a   comunicação   entre   o  programa  de  aplicação   (chamadas   aos  procedimentos  associados  aos comandos SQL) e o processador  TSQL.  O  objeto  sql  por sua vez contém as definições dos parâmetros  de  cada procedimento  de um módulo SQL,  necessárias a comunicação.  Quando  a     base  acessada é local deve ser utilizada a biblioteca tsql.  Para uma base cliente(servidor TSQL remoto) deve-se utilizar a biblioteca rsql.

7-5


Exemplo

Geração de um programa de aplicação na linguagem C

nome do módulo sql   :  modulo1

nome do fonte sql    :  exemplo.s

nome do fonte C      :  exemplo.c

diretório da base      :  subdiretorio db1 do diretorio corrente

. compilação do módulo sql

tsqlbind db1 -i exemplo.s   (gera db1/modulo1.o)

. compilação do módulo C

cc -c exemplo.c  (gera exemplo.o)

. geração do programa de aplicação

cc -oexemplo exemplo.o db1/modulo1.o -ltsql -lm

2. Aplicação com mais de um módulo SQL

Através   de  chamadas  a  procedimentos,   uma  aplicação   pode referenciar vários módulos SQL,  inclusive acessando bases  distintas.

No entanto, comandos de módulos distintos são executados em transações distintas.

Veja também Linguagem C.

7-6


C

Programas de aplicação com módulo SQL - particularidades da linguagem C

1- Retorno das chamadas aos procedimentos do módulo SQL

Quando um procedimento do módulo SQL é executado,  é retornado um inteiro  identificando o módulo,  se o procedimento foi realizado  com sucesso ou o valor -1:

id_modulo    : se SQLCODE contém o valor 0.

-1 : se SQLCODE contém  um valor diferente  de 0 (inclusive igual a  100).

2- Rotina tsqlKILL da biblioteca tsql

Sintaxe

int tsqlKILL(id_modulo)

int id_modulo;

Descrição

Termina  o processo TSQL responsável pela execução  dos          procedimentos  do  módulo SQL  identificado  pelo  parâmetro          id_modulo. A informação id_modulo é retornada por  qualquer chamada  a um procedimento do módulo executado com  sucesso.

No  caso  da execução de mais de um módulo  SQL  pelo  mesmo programa de aplicação, o usuário através da rotina  tsqlKILL reduz o número de processos em execução e consequentemente a memória ocupada.

Retorno

             0 :  sucesso

            -1 :  módulo não está mais sendo executado

7-7


3 - Rotina tsqlPASSWD

Sintaxe

int tsqlPASSWD(p)

char *p;

Descrição

Através  desta  rotina um programa de aplicação  comunica  a “password” do usuário.  Se não for chamada antes da execução do  primeiro  comando  SQL,   a  “password”  é   requisitada automaticamente através de uma mensagem na tela.

Retorno

0: sucesso

-1: erro na execução

4 - Erros retornados pelos procedimentos de um módulo SQL

O status da execução de um comando SQL a partir de um programa de aplicação  é fornecido pelo conteúdo do parâmetro SQLCODE.  No caso de um erro, o parâmetro retorna um código identificando o erro.  A rotina  tsqlERROR  da  biblioteca  tsql  retorna  uma  mensagen  de  erro  com informações sobre o contexto em que ele ocorreu. (Ver também mensagens de erro).

Sintaxe

char *tsqlERROR(endereco)

               char * endereco;

Descrição

7-8


Se  o  parâmetro SQLCODE da última chamada a um  módulo   SQL  é  negativo,  tsqlERROR  constrói a  mensagem  de  erro  correspondente,  devolvendo  o  seu  endereço.  O  parâmetro endereço  da   mensagem.  Se  ele  é  passado com o valor (CHAR  *)  0L,  a  mensagem  é construída em uma área interna da rotina,  que é alterada a cada nova chamada.  A mensagem é terminada com  o  caracter '\0' e possui um tamanho máximo de 120 bytes.

7-9


SQL EMBUTIDA

Sintaxe

     comando_SQL_embutido : EXEC SQL { cursor |

                            cursor_dinâmico | exceção |

                            comando_SQL } terminador_SQL

     exceção : WHENEVER condição ação

     condição : SQLERROR | NOT FOUND

     ação : CONTINUE | GO TO rótulo | GOTO rótulo

     rótulo : “:” identificador_da_linguagem_hospedeira

     seção_de_declaração :

             EXEC SQL BEGIN DECLARE SECTION terminador_SQL

                   [ variável_hospedeira ]...

             EXEC SQL END DECLARE SECTION terminador_SQL

     variável_embutida :

                  “:” identificador_da_linguagem_hospedeira

     terminador_SQL :  END [-] EXEC  | ;

Regras

Um  programa hospedeiro é uma unidade de compilação que  consiste de  trechos  escritos  na linguagem hospedeira e trechos  em  SQL.  Os  trechos escritos na linguagem hospedeira devem obedecer os  requisitos  de programação da linguagem.  Os trechos em SQL podem ser comandos SQL embutidos ou seções de declaração SQL.

Todo  texto que segue o prefixo EXEC SQL deve obedecer a  sintaxe  da linguagem SQL até o terminador SQL. Se o início ou fim de uma seção  de  declaração ou um prefixo 'EXEC SQL' não estiverem na mesma  linha, vale a regra de continuação de linha da linguagem hospedeira.  O mesmo acontece para o uso de comentários.

7-10

Todo  identificador  da linguagem hospedeira especificado  em  um  comando  SQL  embutido deve estar definido em uma única  definição  de variável hospedeira. Esta definição deve preceder qualquer comando SQL  embutido  que  faça  referência à variável.  A definição  da  variável hospedeira  deve  ser tal que a referência à variável seja  válida  em todo  comando SQL embutido que faça referência à variável,  segundo as  regras   de  programação  da  linguagem  hospedeira.   Esta  definição especifica o tipo de dados da variável.

Uma  exceção  é aplicada a um comando SQL quando  o  comando  SQL aparece  depois  da declaração da exceção e nenhuma outra exceção  que especifica a mesma condição aparece entre a declaração da exceção e  o comando SQL.

Todo programa hospedeiro deve conter uma variável SQLCODE.

No final da execução de um comando SQL em um programa  hospedeiro  o valor em SQLCODE é testado.  Se é aplicada ao comando uma declaração  de  exceção  com a condição NOT FOUND e ação GOTO,  o comando  GOTO  é executado  se o valor de SQLCODE for 100.  Se existe uma declaração de exceção  com  a  condição  SQLERROR e ação  GOTO,  o  comando  GOTO  é executado se o valor de SQLCODE for negativo. Se não houver declaração de exceção e a ação desta é CONTINUE ou o valor de SQLCODE é 0, nenhum outro passo é o programa continua normalmente.

Veja também OPUS Hospedeira.

7-11


OPUS HOSPEDEIRA

Regras

Nas  linhas do programa hospedeiro que contém um comando embutido  SQL, nenhum caracter deve ser usado para continuação do comando de uma linha em outra.  Especialmente o caracter “;” (ponto-e-vírgula) que na linguagem  OPUS  tem esta função,  porque ele será  tratado  como  um terminador SQL.

A  definição  do tipo de dado da variável hospedeira  OPUS  deve preceder o comando SQL embutido onde ela é usada.  Esta definição pode ser  obtida por qualquer uma das formas estabelecidas pelos requisitos de programação OPUS,  porém não é necessária a definição de variáveis hospedeiras OPUS em seções de declaração SQL.

O  tipo dado lógico da linguagem OPUS não tem correspondência na linguagem SQL. O tipo de dado SQL equivalente ao tipo de dado numérico da  linguagem OPUS é DECIMAL de precisão igual a 18 dígitos e  escala definida pelo comando SET DECIMALS.  O tipo de dado SQL equivalente ao tipo  de dado alfanumérico (cadeia de caracteres) é CHARACTER de mesmo tamanho  ou  VARCHAR  (se a variável hospedeira está  definida  em  um comando PARAMETERS).  O tipo de dado data de OPUS corresponde ao tipo DATETIME de precisão “YEAR TO DAY”.  O tipo de dado SQL equivalente ao tipo  de  dado ponto flutuante da linguagem hospedeira OPUS é  DOUBLE  PRECISION.

Se uma exceção especifica um comando GOTO , então o identificador da linguagem OPUS deve fazer parte de uma declaração do tipo LABEL SQL <identificador> no módulo em que a exceção aparece.

7-12


Arquivos  fonte  contendo  comandos embutidos  SQL  e  seções  de declaração  SQL  podem  ser adicionados ao programa OPUS  através  do comando OPUS INCLUDE.

Todo programa hospedeiro  OPUS  deve  conter   uma   variável hospedeira  de nome SQLCODE e tipo numérico.  Se ela não for  definida até  o primeiro comando SQL,  a partir daí ela estará  automaticamente definida.

Pode-se  obter  automaticamente uma mensagem de erro a partir  do  resultado do último comando SQL executado com o comando “DO  tsqlERROR WITH PARAMETERS <nome da variável OPUS>.  A variável OPUS passada como  parâmetro deve ser de tipo cadeia de caracteres de tamanho mínimo  120  caracteres.

Veja também SQL Embutida  e Tipo de Dado.

Desenvolvimento de aplicações

Um programa em linguagem OPUS com SQL embutida, é um programa de aplicação  formado por um ou mais módulos “OPUS” que contém  comandos  da linguagem OPUS e comandos da linguagem SQL.

Os   módulos   formados  pelos  dois  tipos  de  comandos   devem  obrigatoriamente conter a diretiva:

$SQLMODULE = <nome do módulo sql> [<nome de arquivo>]

7-13


Para  cada módulo deste tipo,  o compilador OPUS,  que  gera  um  fonte C, procede da seguinte forma:

§ Substitui  no  módulo “OPUS” os comandos SQL 	por  chamadas  a  procedimentos em C,  passando como parâmetros, o conteúdo das variáveis  OPUS referênciadas no comando correspondente.

§ Acrescenta  a   um  módulo  do tipo SQL    (veja módulo),   os comandos  SQL,  cada um associado  ao procedimento pelo qual ele foi   substituído  no  item  anterior.  O  nome  do  módulo  SQL  é  dado pela  diretiva  $SQLMODULE, assim como o arquivo que o contém.  Se este último não foi  especificado, é considerado o nome do  módulo   acrescido   do sufixo “.s”.

Se  o  módulo  SQL não existe,  ele é  criado  com  as  seguintes características:

§ 	nome do módulo e nome do arquivo que o contém,  fornecidos pela diretiva $SQLMODULE.

§ 	OPUS é a linguagem hospedeira associada.

§ 	o usuário corrente é o identificador de autorização.

A  recompilação de um módulo “OPUS” atualiza automaticamente  no fonte que contém o módulo SQL, os comandos SQL correspondentes.

Eventualmente um módulo OPUS pode conter a opção:

$SQLBIND = ( [<nomeBD>] , [<nivel>] , [<nomeLIB>])

7-14


Esta opção provoca a compilação do módulo SQL associado ao módulo OPUS  (definido  pela opção $SQLMODULE) especificando o nome  da  base  TSQL  na qual deve ser catalogado o módulo SQL,  o nível de isolamento com  o  qual  devem  ser  executados os seus  comandos  e  o  nome  da biblioteca  na qual deve ser colocado o objeto (SQL) proveniente desta compilação.  Se algum item da opção $SQLBIND não é  especificado,  são  considerados os seguintes valores “default”:

§ subdiretório db do diretório corrente

§ nível 1 de isolamento

§ o objeto proveniente da compilação  do  módulo SQL não é colocado em nenhuma biblioteca.

A   compilação   do  módulo  OPUS   principal (PROGRAM),   dispara automaticamente  o procedimento para a geração do programa  executável da  aplicação,  provocando a compilação do módulo SQL a ele  associado mesmo  sem  a especificação da opção $SQLBIND.  Este procedimento é  o procedimento  para  a  geração de uma aplicação em C com  um  ou  mais módulos SQL (veja MÓDULO).

No  módulo OPUS principal(PROGRAM) devem  ser  especificados na opção $LIBRARY as bibliotecas  referenciadas  nas  opções  $SQLBIND contidas nos módulos OPUS que compõem a aplicação.  Esta exigência não é necessária em se tratando do próprio módulo principal,  considerando que para este módulo o objeto proveniente da compilação do módulo  SQL a   ele   associado   é  ligado  automaticamente  com   a   aplicação, independentemente dele estar catalogado em uma biblioteca.

7-15


Se uma aplicação OPUS contém comandos SQL embutidos que acessam uma base cliente, o módulo OPUS principal deve conter a opção:

           $LIBRARY = -lrsql

Se  uma  aplicação  OPUS contém comandos SQL  embutidos  que  só  acessam  bases  locais,  mas  nenhum deles  pertence  ao  módulo  OPUS  principal(PROGRAM), então este módulo deve conter a opção :

           $LIBRARY = -ltsql

Veja utilitário tsqldrop para eliminação de módulos e utilitários  trsqlgrant  e  tsqlrevoke para atribuição/eliminação de  permissão  de  execução de módulo.

Se  um  programa  “OPUS” embutido ativa outro  programa  “OPUS” embutido,  os  dois  programas estão em transações distintas  e  podem referenciar bases de dados distintas.

7-16


CAPÍTULO 8- LINGUAGENS

O DICIONÁRIO DE DADOS

Um  sistema de gerenciamento de banco de dados deve ter acesso  a   um  conjunto  de informações sobre a estrutura de uma base para  poder   gerenciá-la.  Em uma base relacional estas informações são armazenadas   no  dicionário  de dados.  O dicionário é composto de um  conjunto  de  tabelas  que  o  TSQL mantém para o seu próprio  uso,  e descreve  as  tabelas, colunas, índices, privilégios e módulos SQL de uma base.

As  tabelas do dicionário são criadas automaticamente  quando  da criação da base  de  dados e formam  um  esquema  especial  cujo  identificador de autorização é o identificador SYSSQL.

Seus dados são acessíveis para os usuários através dos  comandos     SQL de consulta.  Estes não tem permissão para atualizar ou  modificar  diretamente   as  tabelas  do  dicionário  tendo  em vista  que  tais alterações  podem implicar na perda da integridade da base.  O TSQL  é   que  se  encarrega  de inserir, eliminar e  atualizar as  tabelas  do dicionário  conforme as modificações na estrutura da base.  Observa-se que  o  dicionário existe prioritariamente para o uso do TSQL  e  está     portanto sujeito a alterações na sua estrutura.

Todas  as colunas de todas as tabelas do dicionário de dados  são restritas a conter somente valores não nulos.

A  seguir  são  descritas  as  tabelas  que  contêm   informações     relevantes para o usuário.

8-3


SYSBTREE

Armazena  informações  de  cada índice e restrição  de  unicidade     definida sobre uma tabela.

As colunas de SYSBTREE são:

    	SCHNAME      - CHAR (18)

    	= identificador de autorização do esquema

    	TNAME        - CHAR (18)

    	= identificador da tabela

    	OBID         - INTEGER

    	= identificador numérico do índice

    	TYPE         - CHAR (1)

    	= “I” (índice),

    	= “U” (restrição de unicidade) ou

    = “E” (restrição referencial)

  	UNIQUERULE   - CHAR (1)

   	= “D” (valores duplicados de chave são permitidos),

= “U” (valores duplicados de chave não são permitidos)   ou

    	= “P” (chave primária)

 	COLCOUNT     - SMALLINT

    	= número de colunas que compõem a chave do índice

FIRSTKEYCARD - INTEGER

      = número de valores distintos da primeira coluna da  	chave

      = -1, se não é válido

      FULLKEYCARD  - INTEGER

       = número de valores distintos da chave do índice ou

       = -1, se não é válido

8-4


NLEAF        - INTEGER

= número de folhas ou

= -1, se não é válido

NLEVELS      - SMALLINT

= número de níveis ou

= -1, se não é válido

CLUSTERED    - CHAR (1)

= “Y” (tabela está fisicamente ordenada pela chave),

= “N” (tabela nao está fisicamente ordenada pela chave) ou

= “ “, se não é válido

A  chave  primária  de SYSBTREE é composta pelas  colunas  TNAME,     SCHNAME e OBID.

O  valor das colunas FIRSTKEYCARD,  FULLKEYCARD, NLEAF,  NLEVELS e     CLUSTERED  são  válidos apenas quando o utilitário de  atualização  de     estatísticas foi executado.

8-5


SYSCOLAUTH

Armazena os privilégios UPDATE atribuídos individualmente sobre colunas de tabelas e visões.

As colunas de SYSCOLAUTH são:

SCHNAME      - CHAR (18)

= identificador de autorização do nome da tabela ou  visão

TNAME        - CHAR (18)

= identificador da tabela ou visão

GRANTOR      - CHAR (18)

= identificador do usuário que atribuiu o privilégio

GRANTEE      - CHAR (18)

= identificador do usuário que recebeu o privilégio

PTIMESTAMP   - INTEGER

= data e hora em que foi atribuído o privilégio

COLNAME      - CHAR (18)

= nome da coluna

UPDATEAUTH   - CHAR (1)

= “G” (o privilégio UPDATE pode ser atribuído) ou

= “Y” (o privilégio UPDATE pode ser exercido)

A  chave  primária de SYSCOLAUTH é composta pelas colunas  TNAME,     SCHNAME, GRANTEE, GRANTOR, PTIMESTAMP e COLNAME.

8-6


SYSCOLUMNS

Armazena  informações  sobre colunas de tabelas  e  visões. Cada linha de SYSCOLUMNS corresponde a uma coluna de uma tabela ou visão.

 As colunas de SYSCOLUMNS são:

  SCHNAME      - CHAR (18)

  = identificador de autorização do esquema

  TNAME        - CHAR (18)

  = identificador da tabela ou visão

  COLNO        - SMALLINT

  = número de ordem (maior ou igual a 1)

  COLNAME      - CHAR (18)

  = nome da coluna

  COLTYPE      - CHAR (18)

  = “CHARACTER”,

  = “NUMERIC”,

  = “DECIMAL”,

  = “INTEGER”,

  = “SMALLINT”,

  = “FLOAT”,

  = “REAL”,

  = “DOUBLE PRECISION” ou

  = “VARCHAR”

8-7


 SYSTYPE      - SMALLINT

 = 1 (tipo CHARACTER),

 = 2 (tipo NUMERIC),

 = 3 (tipo DECIMAL),

 = 4 (tipo INTEGER),

 = 5 (tipo SMALLINT),

 = 6 (tipo FLOAT),

 = 7 (tipo REAL),

 = 8 (tipo DOUBLE PRECISION) ou

 = 12 (tipo VARCHAR)

 CLENGTH       - SMALLINT

 = tamanho (se o tipo da coluna é CHARACTER) ou

 = precisão (se tipo numérico)

 SCALE        - SMALLINT

  = escala (se o tipo da coluna é numérico) ou

  = 0 (zero)

  NULLS        - CHAR (1)

   = “Y” (pode ter valor nulo) ou

   = “N”

   ITEMNO       - SMALLINT

   = COLNO (se tabela definida pelo comando CREATE 	TABLE) ou

   = número da coluna em relação à primeira coluna 	da tabela (se tabela catalogada pelo utilitário 	tsqlbd))

8-8


   FIRSTKEY   - CHAR (1)

   = “Y” (primeira coluna da chave de algum índice) ou

   = “N”

COLCARD   - INTEGER

= número de valores distintos da coluna ou

= -1, se não é válido

HIGH2KEY   - CHAR (8)

= contém o segundo maior valor da coluna ou

= “        “, se não é válido

LOW2KEY   - CHAR (8)

= contém o segundo menor valor da coluna ou

= “        “, se não é válido

A  chave primária de SYSCOLUMNS é composta pelas  colunas  TNAME,   SCHNAME e COLNO.

O  valor  das colunas COLCARD,  HIGH2KEY e  LOW2KEY  são  válidos   apenas  quando  o  valor da coluna FIRSTKEY é “Y” e  o  utilitário  de atualização de estatísticas foi executado.

8-9


SYSCUSAGE

Armazena  as  dependências  de privilégios  UPDATE  exercidos  em   módulos e na definição de visões.

As colunas de SYSCUSAGE são:

SCHNAME      - CHAR (18)

= identificador de autorização do nome da tabela ou visão    básica

TNAME        - CHAR (18)

= identificador da tabela ou visão básica

GRANTOR      - CHAR (18)

= identificador do usuário que exerceu o privilégio

DTYPE        - CHAR (1)

= “V” (objeto dependente é uma visão) ou

= “M” (objeto dependente é um módulo)

DSCHEMA      - CHAR (18)

= identificador de autorização do objeto dependente

DNAME        - CHAR (18)

= identificador do objeto dependente

COLNAME      - CHAR (18)

= nome da coluna

DCOLNAME     - CHAR(18)

= nome da coluna ou

= nome da coluna correspondente na definição da visão

A chave  primária de SYSCUSAGE é composta pelas  colunas  TNAME, SCHNAME, GRANTOR, DTYPE, DNAME, DSCHEMA e COLNAME.

Outra  restrição  de unicidade é composta  pelas  colunas  DTYPE, DNAME, DSCHEMA, DCOLNAME, TNAME, SCHNAME e GRANTOR (chave secundária)

8-10


SYSINDEXES

Armazena informações sobre cada índice definido sobre uma tabela.

As colunas de SYSINDEXES são:

      SCHNAME      - CHAR (18)

      = identificador de autorização do esquema

      TNAME        - CHAR (18)

       = identificador da tabela

      OBID         - INTEGER

      = identificador numérico do índice

      NAME         - CHAR (18)

      = nome do índice

A  chave  primária de SYSINDEXES é composta pelas colunas NAME  e SCHNAME.

Outra  restrição  de unicidade é composta  pelas  colunas  TNAME, SCHNAME e OBID (chave secundária).

8-11


SYSIUSAGE

Armazena as dependências de índices em módulos.

As colunas de SYSIUSAGE são:

SCHNAME      - CHAR (18)

= identificador de autorização do índice

NAME         - CHAR (18)

= identificador do índice

DNAME        - CHAR (18)

= identificador do módulo

A  chave  primária  de SYSIUSAGE é composta pelas  colunas  NAME,     SCHNAME e DNAME.

Outra restrição de unicidade é composta pelas colunas DNAME, NAME     e SCHNAME (chave secundária).

8-12


SYSKEYS

Armazena  informações sobre colunas que compõem chaves de índices     e  restrições de unicidade.  Cada linha de SYSKEYS corresponde  a  uma coluna que compõe uma chave.

As colunas de SYSKEYS são:

SCHNAME      - CHAR (18)

= identificador de autorização do esquema

TNAME        - CHAR (18)

= identificador da tabela

OBID         - INTEGER

= identificador do índice

COLSEQ       - SMALLINT

=  número de ordem da coluna na definição do índice 	(maior  ou     igual a 1)

COLNO        - SMALLINT

= número de ordem da coluna na definição da tabela

ORDERING     - CHAR (1)

= “A” (ordem da coluna na chave é ascendente) ou

= “D”

A  chave  primária  de SYSKEYS é composta  pelas  colunas  TNAME,   SCHNAME, OBID e COLSEQ.

8-13


SYSMODAUTH

Armazena as permissões atribuídas sobre módulos.

As colunas de SYSMODAUTH são:

NAME         	- CHAR (18)

= nome do módulo

GRANTOR  - CHAR (18)

=  identificador  de  autorização do usuário  que  	atribuiu  a  permissão

GRANTEE  - CHAR (18)

=  identificador  de  autorização do  usuário  que  	recebeu  a permissão

PTIMESTAMP  - INTEGER

A  chave  primária de SYSMODAUTH é composta pelas  colunas  NAME,  GRANTEE, GRANTOR e PTIMESTAMP.

   8-14


SYSMODULES

Armazena  informações  sobre módulos.  Cada linha  de  SYSMODULES  corresponde a um módulo.

As colunas de SYSMODULES são:

NAME - CHAR (18)

= nome do módulo

OWNER - CHAR (18)

= identificador do usuário proprietário

BTIMESTAMP - INTEGER

= data e hora da última compilação do módulo

BINDTIME - INTEGER

= data e hora da primeira compilação do módulo

SIZE  - INTEGER

= tamanho do código interpretável correspondente ao  módulo

ISOLATION - CHAR(1)

= “0” (nível 0 de isolamento),

= “1” (nível 1 de isolamento),

= “2” (nível 2 de isolamento) ou

= “3” (nível 3 de isolamento)

VALID  - CHAR(1)

=   “Y”   (o  módulo  pode  ser  executado  sem   	recompilação     automática),

=   “N”  (o  módulo  pode  ser  executado   com   	recompilação   automática)  ou

=  “R”  (o  módulo  não pode ser  executado  sem  	recompilação     explícita)

USERS - SMALLINT

= 0 (o módulo não está sendo executado) ou

= número de execuções do módulo que estão em curso

A chave primária de SYSMODULES é composta pela coluna NAME.

8-15


SYSTABAUTH

Armazena os privilégios atribuídos sobre tabelas e visões.

As colunas de SYSTABAUTH são:

SCHNAME   	- CHAR (18)

= identificador de autorização do nome da tabela 	ou visão

TNAME   	- CHAR (18)

= identificador da tabela ou visão

GRANTOR   	- CHAR (18)

= identificador do usuário que atribuiu o privilégio

GRANTEE   	- CHAR (18)

= identificador do usuário que recebeu o privilégio

PTIMESTAMP   	- INTEGER

= data e hora em que foi atribuído o privilégio

DELETEAUTH 	- CHAR (1)

= “G” (o privilégio DELETE pode ser atribuído),

= “Y” (o privilégio DELETE pode ser exercido) ou

= “N”

UPDATEAUTH- CHAR (1)

= “G” (o privilégio UPDATE pode ser atribuído),

= “Y” (o privilégio UPDATE pode ser exercido),

= “S” (o privilégio UPDATE foi atribuído a algumas colunas) ou

= “N”

INSERTAUTH   	- CHAR (1)

= “G” (o privilégio INSERT pode ser atribuído),

*= “Y” (o privilégio INSERT pode ser exercido) ou

      = “N”

8-16


SELECTAUTH   	- CHAR (1)

= “G” (o privilégio SELECT pode ser atribuído),

= “Y” (o privilégio SELECT pode ser exercido) ou

= “N”

REFEREAUTH   	- CHAR (1)

= “G” (o privilégio REFERENCES pode ser atribuído),

= “Y” (o privilégio REFERENCES pode ser exercido)  ou

= “N”

A  chave primária de SYSTABAUTH é composta pelas  colunas  TNAME, SCHNAME, GRANTEE, GRANTOR e PTIMESTAMP.

8-17


SYSTABLES

Armazena  informações  sobre  tabelas e  visões.  Cada  linha  de    SYSTABLES corresponde a uma tabela ou visão.

As colunas de SYSTABLES são:

SCHNAME    	- CHAR (18)

= identificador de autorização do esquema

TNAME  	- CHAR (18)

= identificador da tabela ou visão

TYPE  	- CHAR (1)

= “T” (tabela definida pelo comando CREATE TABLE),

= “t” (tabela catalogada pelo utilitário tsqlbd),

= “Y” (visão atualizável derivada de tabela do mesmo esquema) ou

= “N” (visão)

VIEWTYPE   	- CHAR (1)

= “G” (visão agrupada),

= “1” (visão um-agrupada),

= “D” (visão DISTINCT),

= “R” (visão não atualizável),

= “N” (visão atualizável sem cláusula WITH  CHECK OPTION),

= “Y” (visão atualizável com cláusula WITH  CHECK OPTION)  ou

= “ “

COLCOUNT   	- SMALLINT

= número de colunas

8-18


SIZE         	- INTEGER

= tamanho da AST da visão

CARD         	- INTEGER

= número total de linhas da tabela ou

= -1, se não é válido

NPAGES       	- INTEGER

= número de páginas que armazenam linhas da  tabela ou

= -1, se não é válido

SYSNAME      	- CHAR (10)

= identificador interno da tabela

A  chave primária de SYSTABLES é composta pelas colunas  TNAME  e   SCHNAME.

O  valor  das colunas CARD e NPAGES são válidos apenas  quando o utilitário de atualização de estatísticas foi executado.

8-19


SYSTUSAGE

Armazena as dependências de privilégios exercidos em módulos e na  definição de visões.

 	As colunas de SYSTUSAGE são:

 SCHNAME   - CHAR (18)

    	 = identificador de autorização do nome da tabela ou  visão básica

      TNAME   	- CHAR (18)

      = identificador da tabela ou visão básica

      GRANTOR   	- CHAR (18)

      = identificador do usuário que exerceu o privilégio

     DTYPE	- CHAR (1)

     = “V” (objeto dependente é uma visão) ou

     = “M” (objeto dependente é um módulo)

     DSCHEMA   	- CHAR (18)

= identificador de autorização do objeto  dependente

DNAME   	- CHAR (18)

= identificador do objeto dependente

PTIMESTAMP   	- INTEGER

    = data e hora em que foi exercido o privilégio

    DELETEAUTH   	- CHAR (1)

   =  “G” (o privilégio DELETE sobre a visão pode ser atribuído),

    = “Y” (o privilégio DELETE foi exercido) ou

    = “N”

  8-20


  UPDATEAUTH - CHAR (1)

   = “G” (o privilégio UPDATE sobre a visão pode ser atribuído),

= “Y” (o privilégio UPDATE foi exercido) ou

    = “N”

    INSERTAUTH   	 - CHAR (1)

  = “G” (o privilégio INSERT sobre a visão pode ser atribuído),

  = “Y” (o privilégio INSERT foi exercido) ou

  = “N”

   SELECTAUTH   	 - CHAR (1)

 = “G” (o privilégio SELECT sobre a visão pode ser atribuído),

  = “Y” (o privilégio SELECT foi exercido) ou

  = “N”

A  chave  primária de SYSTUSAGE é composta pelas  colunas  TNAME,SCHNAME, GRANTOR, DTYPE, DNAME e DSCHEMA.

Outra  restrição  de unicidade é composta  pelas  colunas  DTYPE, DNAME, DSCHEMA, TNAME, SCHNAME e GRANTOR (chave secundária).

8-21


SYSRUSAGE

Armazena  as dependências de privilégios REFERENCES exercidos  na     definição de tabelas.

  As colunas de SYSRUSAGE são:

  SCHNAME  	- CHAR (18)

 =  identificador  de autorização do nome da  tabela  referida

 TNAME  	- CHAR (18)

 = identificador da tabela referida

 GRANTOR    	- CHAR (18)

 = identificador do usuário que exerceu o privilégio	(PUBLICou conteudo de DSCHEMA)

 DSCHEMA    	- CHAR (18)

 = identificador de autorização da tabela dependente

 DNAME   	- CHAR (18)

 = identificador da tabela dependente

 OBID   	- INTEGER

 = identificador numérico do indice da chave estrangeira

 PTIMESTAMP   	- INTEGER

 = data e hora em que foi exercido o privilégio

 UPDATERULE   	- CHAR(1)

 = “R” (RESTRICT)

 = “C” (CASCADE)

 = “S” (SET NULLS)

 8-22


DELETERULE  - CHAR(1)

 = “R” (RESTRICT)

 = “C” (CASCADE)

 = “S” (SET NULLS)

A  chave  primária de SYSRUSAGE é composta pelas  colunas  TNAME,  SCHNAME, GRANTOR, DNAME, DSCHEMA e OBID.

8-23


CAPÍTULO 9- UTILITÁRIOS

TSQLCRDB

Sintaxe

tsqlcrdb  [ nomeDB ] [+s]     [ -j |   -J | -b nomeTSGBD 	 [-s cód_segurança]    [-n palavra_nível] |

                   -h maquina: caminho ]

Regras

O  utilitário tsqlcrdb cria uma base de dados TSQL,  TSQL híbrida  ou TSQL cliente <veja anexos 2 e 3>.  Esta operação implica na criação do  diretório  especificado  por nomeDB e na criação dos  arquivos  do dicionário de dados quando a base não é uma base cliente.

O  usuário que cria a base é o administrador da base de  dados  e deve  ter  permissão  de  escrita  no diretório no  qual  é  criado  o diretório nomeDB.

As opções são:

nomeDB

Especifica o diretório sob o   qual devem  residir os subdiretórios e arquivos  da  base de dados. Ele pode  ser especificado na forma de um caminho completo  ou de  um caminho em relação  ao  diretório  corrente.   Se este   parâmetro não  for fornecido, o diretório padrão (subdiretório   db   do   diretório  corrente)   será considerado.

+s

Execução  do  utilitário  no modo  não  conversacional. 	Normalmente,   o    utilitário   interage  com    o    usuário dinâmicamente,   pedindo   confirmação   de  suas  ações.   	O   parâmetro   +s   suspende  esta  opção, permitindo  que  	o utilitário seja usado num fluxo.

9-3


-j  |  -J

Estas  opções  não podem ser usadas com as 	opções -b  e-h.  Elas  fazem  com   que   as alterações sobre a base  de dados  sejam  registradas  em   diário.  Com  o  uso  da  primeira  opção,  são  guardadas as informações necessárias  para  desfazer transações  registradas  no diário. Já a opção -J possibilita que transações possam ser desfeitas ou refeitas.

-b nome OpenBASE

Esta  opção  implica  na  criação  de uma base TSQL híbrida.   Ela indica o nome da base OpenBASE	 a ser adaptada.  Quando pelo  menos  um dos arquivos de uma  base  	OpenBASE  não   for  definido em  relação  ao  diretório raiz,  a  base  TSQL  híbrida  só  pode ser   criada sob    o 	diretório em  relação ao qual está definido este arquivo.

-s cód_segur

Esta  opção  só  pode ser usada com  a  opção  -b.  Ela  especifica  o código de segurança da base  OpenBASE    a  	ser adaptada.  Se não for especificado,  será considerado o 	valor 1.

-n pal_nível

Esta   opção   só   pode   ser  usada com  a  opção  -b.  Ela especifica   o   nível de acesso que a SQL terá  sobre  a  base OpenBASE. Se não for especificado, será considerado o  nível  do  usuário  corrente.  Se não houver  palavra  de                    nível definida na base, esta opção será ignorada.

-h máquina: caminho

Esta opção implica na criação de uma base TSQL cliente.                    Especifica  a  máquina remota e o caminho (a  partir  da raiz) que identifica a base remota.

9-4


TSQLRMDB

Sintaxe

tsqlrmdb [ nomeDB ] [ +s ]

Regras

O  utilitário  tsqlrmdb elimina uma base de  dados  definida     pelo  parâmetro nomeDB.  O diretório cujo nome é nomeDB e todo  o  seu   conteúdo  é removido.  Somente o administrador da base de dados  ou  o super-usuário podem executar o utilitário.

As opções são:

nomeDB

Especifica  a  base  de dados  identificada  pelo  diretório               	nomeDB  (ver  utilitário  tsqlcrdb).  O diretório  pode    ser               especificado  na  forma  de  um  caminho completo ou um caminho em relação ao diretório corrente.Se a opção  não é    fornecida,   é  considerada a   base de dados   "default” (subdiretório db  do diretório corrente).

+s

Normalmente,   o   utilitário   interage   com   o     usuário               	dinâmicamente,   pedindo   confirmação  de  suas  ações.   O parâmetro   +s  suspende  esta  opção,   permitindo  que   o utilitário seja usado num fluxo.

Veja também tsqlcrdb.

9-5


TSQLRECDB

Sintaxe

     tsqlrecdb [nomeDB]

Regras

Recupera  uma  base  de dados quando ocorre  interrupção  de  uma  aplicação. A última transação não terminada é desfeita.

As opções são:

nomeDB

Especifica  a   base   de dados  identificada  pelo  diretório               nomeDB   (ver  utilitário  tsqlcrdb).  O  diretório  pode  ser  especificado  na forma de um caminho  completo  ou  um  caminho em relação ao diretório corrente. Se a opção  não é fornecida, é considerada a Base “default”(subdiretório db do  diretório  corrente).

9-6


TSQLRJDB

Sintaxe

tsqlrjdb [nomeDB] [+s] [ {-j | +j} [diário] [-d data] ]

Regras

Refaz  ou  desfaz  transações em uma base de dados  a  partir  do arquivo diário.

As opções são:

nomeDB

Especifica  a   base  de  dados  identificada  pelo  diretório      nomeDB  (ver  utilitário  tsqlcrdb).  O diretório   pode   ser               especificado   na  forma  de um caminho completo ou um  caminho em  relação  ao  diretório  corrente.   Se  a  opção  não   é fornecida,  é  considerada  a base   “default” (subdiretório  db do diretório corrente).

+s

Execução do utilitário no modo não conversacional.

-j | +j

Refaz  ou  desfaz  as transações gravadas no  diário.  Se  o               diário   não   é   especificado,   é  considerado  o   arquivo               /usr/tsgbd/tsdic/diário.   Se  nenhuma  das  duas  opções  é               fornecida, as transações são refeitas.

-d [data]

Somente são consideradas as transações completadas a  partir  da data fornecida.

9-7


TSQLSCHEMA

Sintaxe

     tsqlschema [ nomeDB ] -i arquivo

Regras

O utilitário tsqlschema define um esquema SQL (veja L esquema) na  base de dados identificada pelo diretório nomeDB.          	Se  o  usuário corrente não é o administrador da  base  de  dados (DBA)  ou o super-usuário,  o identificador de autorização do  esquema deve ser igual ao nome do usuário corrente.

Novas   definições  (tabela,   visão  ou  permissão)  podem   ser acrescentadas  a um esquema a qualquer momento.  Para isso,  basta ser criado  um  esquema  com o mesmo identificador de  autorização  do  já  existente.  Neste  caso,  as  estruturas  definidas  devem  ter  nomes diferentes das anteriormente existentes no esquema.

As opções são:

nomeDB

Especifica   a  base  de dados identificada   pelo   diretório                  nomeDB   (ver utilitário  tsqlcrdb).  O diretório   pode   ser                  	especificado  na  forma  de um  caminho  completo  ou  um                  caminho em relação ao diretório corrente.Se a opção  não é fornecida, é considerada a Base “default”(subdiretório db                  do diretório corrente).

-i arquivo

Especifica  o  nome do arquivo que contém a definição  do   esquema.

9-8


TSQLBIND

Sintaxe

tsqlbind [nomeDB] { -i arquivo | -m modulo } [ -n nível ]

Regras

O utilitário tsqlbind compila ou recompila um módulo sql. O usuário corrente deve ser um super-usuário, o administrador da base dedados ou o identificador de autorização do módulo.

Na versão “run-time” do sistema TSQL, só é permitida a opção para  recompilação.

A  compilação de um modulo SQL realiza basicamente  as  seguintes  ações:

§ Cataloga no dicionário de dados o módulo.

§ Gera o “plano da aplicação”, que é formado pelo conjunto dos códigos  interpretáveis dos comandos do módulo. Este plano é armazenado na base de dados. A    execução de um comando SQL provoca    automaticamente a execução do código interpretável correspondente no “plano da aplicação”.

§ 	Gera um arquivo que contém um objeto,  chamado objeto sql, a  ser  ligado  com  a  biblioteca tsql  e  com  os  objetos produzidos   pela    compilação    dos    módulos   em linguagem hospedeira.

Veja Linguagem Módulo> para a criação de um programa de aplicação com  o  uso de um módulo SQL.

9-9


As opções são:

-i arquivo

Esta opção  especifica  que  deve  ser catalogado um novo                      módulo na base de dados. O parâmetro arquivo contém o                      texto  do  módulo sql. Se o nome do módulo não estiver especificado na definição do módulo (cláusula  MODULE no arquivo), então o nome  será  automáticamente  gerado                      pelo utilitário e  mostrado ao usuário  no  final  da compilação.

O  módulo  é descrito no dicionário de dados,  e  são criados dois arquivos:

§ um  arquivo objeto <nomeDB> / <nome do  módulo>.o,  que contém o objeto  sql para ser l igado   com  o programa de  aplicação. O nome  do arquivo  é

 	mostrado ao usuário. Na execução do “plano da  aplicação” (conjunto dos códigos interpretáveis dos comandos do módulo), o TSQL possui um mecanismo que verifica se o arquivo objeto e o plano foram gerados pela mesma compilação. A cada nova compilação com a opção -i,  o  programa  de  aplicação deve ser ligado com o  objeto sql.

§ um arquivo <nomeDB> / <nome do modulo>.s que contém uma cópia do fonte da especificação do módulo e que oferece permissão de leitura para todos. A existência deste arquivo fornece ao usuário uma cópia exata do fonte de um módulo catalogado.

Esta opção não está disponível na versão “run-time”.

9-10


-m módulo

Esta   opção   especifica  que  deve  ser   recompilado  um                      módulo  anteriormente catalogado.  O nome do módulo é                      fornecido como parâmetro.

O arquivo  objeto  não  é gerado novamente e o módulo  é                      descrito   no dicionário de dados  de  maneira  que  não  é necessário  religar a aplicação.  Esta opção pode ser útil no caso da criação de um índice sobre uma tabela para otimizar uma  pesquisa.  O “plano da aplicação” é atualizado  com os novos caminhos de acesso.

nomeDB

Especifica   a   Base  de  dados  identificada   pelo diretório nomeDB.  O diretório pode ser  especificado na  forma de um caminho completo ou de um caminho  em relação  ao  diretório   corrente.  Se  a  opção    não    é   fornecida,   é  considerada a  Base  de  dados  “default” (sub-diretório db do diretório corrente).

-n nível

Esta opção especifica o nível de isolamento para o mecanismo de acesso concorrente a base de dados.

0 - sem reserva.

1 - estabilidade de cursor.

2 - leitura repetida.

3 - uso exclusivo sem transação

  4 - uso exclusivo com transação

Se a opção não é fornecida considera-se o nível 1.

  Veja também Concorrência.

9-11


TSQLDROP

Sintaxe

tsqldrop [ nomeDB ] -m módulo

Regras

O utilitário tsqldrop remove um módulo catalogado em uma base  de dados.  O  usuário que executa o utilitário deve ser quem  compilou  o  módulo, o DBA (administrador da base de dados) ou o super-usuário.

As  opções são:

nomeDB

Especifica  a Base de dados identificada pelo diretório nomeDB.

O  diretório  pode  ser especificado na  forma  de  um  caminho completo ou de um caminho em relação ao diretório corrente. Se  a  opção  não  é fornecida,  é considerada  a  Base  “default" (sub-diretório db do diretório corrente).

-m módulo

Indica nome do módulo a ser removido da base.

Veja também tsqlrmdb.

9-12


TSQLGRANT

Sintaxe

tsqlgrant [nomeDB] -m módulo [+G] [-r grantor] -e grantee...

Regras

O  utilitário  tsqlgrant atribui permissão de execução  sobre  um módulo, para um ou mais usuários.  O parâmetro módulo determina o nome do módulo.

As opções são:

nomeDB

Esta  opção especifica a Base de dados  identificada   pelo                 diretório  nomeDB.  O diretório pode ser  especificado  na                 forma  de  um  caminho  completo ou de um caminho em  relação  ao diretório corrente. Se a opção não é fornecida,  a Base “default”  (sub-diretório  db  do  diretório  corrente)  é considerada.

+G

Esta  opção  especifica que o(s) usuário(s) para quem   está  sendo atribuído o privilégio tem permissão de atribuí-lo  a outros.

-r grantor

Esta  opção especifica quem está atribuindo  a  permissão.                 Somente  o administrador da Base ou o super usuário  podem utilizá-la. Se a opção não for especificada, o   usuário corrente é considerado.

-e grantee

Esta opção especifica o nome de cada usuário para quem                 está sendo atribuída a permissão. Pode ser dado privilégio                 para todos (PUBLIC).

Veja também tsqlcrdb e tsqlrevoke.

9-13


TSQLREVOKE

sintaxe

     tsqlrevoke [nomeDB] -m módulo [-r grantor] -e grantee...

Regras

Retira  permissão  de  execução  sobre um módulo de  um  ou  mais usuários. O parâmetro módulo determina o nome do módulo.

As opções são as mesmas do utilitário tsqlgrant:

nomeDB

Esta  opção especifica a Base de  dados identificada   pelo diretório  nomeDB.  O diretório pode ser especificado   na                  forma  de um caminho completo ou um caminho em relação ao diretório corrente.  Se a opção não é fornecida,  a  Base                  “default”  (sub-diretório  db  do diretório  corrente)  é considerada.

-r  grantor

Esta  opção especifica quem está retirando  a  permissão.                  Somente  o administrador da Base ou o super usuário pode mutilizá-la.  Se a opção  não  for especificada,  o   usuário corrente é considerado.

-e grantees

Esta  opção  especifica  o  nome  de cada usuário de quemestá sendo retirada  a  permissão. Pode ser retirada a permissão de todos os usuários (PUBLIC).

          	Veja também tsqlgrant.

9-14


TSQLED

Sintaxe

tsqled { -d arquivo fonte | -t arquivo }

Regras

Este utilitário se constitui em uma ferramenta de apoio  para o desenvolvimento de aplicações com comandos   SQL   embutidos.

A precompilação de cada programa gera um arquivo que  contém o programa no qual foram substituídos os comandos SQL por  chamadas a procedimentos, e inclui em um outro arquivo os comandos SQL, cada um associado  a  um dos procedimentos segundo a sintaxe definida para MÓDULO(veja o capítulo LINGUAGENS). O arquivo dos comandos SQL é denominado de módulo SQL.

Um módulo SQL pode conter comandos provenientes de  vários programas hospedeiros de uma mesma aplicação.  Cada comando de um módulo SQL é então associado ao nome do fonte de um programa. No caso da mudança de nome ou da eliminação do fonte de um programa, os seus comandos no módulo SQL associado devem ser  eliminados através  a execução do utilitário tsqled. A não eliminação destes comandos pode gerar duplicação de identificadores se a precompilação de outros fontes da mesma aplicação provocar a inserção de novos comandos.

As opções são:

-d arquivo fonte

Remove de um arquivo que contem  um módulo SQL ,  os comandos provenientes de  um programa  contido em  um arquivo fonte.

-t arquivo

Lista  os  nomes  dos  arquivos  fonte  dos  programas que contém comandos no módulo SQL contido em arquivo.

9-15


TSQLUP

Sintaxe

tsqlup [nomeDB] [+s]  [-o arquivo]

[ -t tabela [-s esquema] | -m {módulo}... | -M ]

Regras

O  utilitário tsqlup pode ser utilizado para efetuar uma  das seguintes funções:

§ Cópia de segurança de uma base TSQL. São copiadas todas as tabelas em conjunto com os  módulos SQL. O nome da base não é guardado, permitindo que esta  seja recuperada posteriormente com  qualquer  outro  nome. Durante a operação a base de dados é bloqueada de  forma exclusiva.

§ Cópia  de uma única tabela de uma base TSQL.  Além dos  dados,  a cópia  contém  o nome da tabela, os tipos  e  os nomes dos campos.

§ Cópia de um conjunto de módulos compilados SQL cadastrados em uma base TSQL ou OpenBASE.

Todas  as  funções podem ser efetuadas pelo administrador da base ou  o  super-usuário  sendo   que  as  duas últimas podem  também   ser   efetuadas  pelos  proprietários   dos objetos referenciados.

As opções são:

nomeDB

Especifica  a  Base de dados   identificada  pelo    diretório nomeDB  (ver  utilitário tsqlcrdb).  O diretório   pode    ser especificado  na  forma  de  um caminho completo ou um caminho em  relação  ao  diretório  corrente.  Se a   opção  não    é    fornecida,    é     considerada  a  Base   "default" (subdiretório db  do diretório corrente).

9-16


+s

Execução   do  utilitário  no  modo  não   conversacional.     Normalmente,   o   utilitário    interage   com   o    usuário  dinamicamente,   pedindo  confirmação  de  suas  ações.  O parâmetro  +s  suspende  esta  opção,   permitindo  que  o utilitário seja usado num fluxo.

-t tabela

É efetuada a cópia de uma única tabela.

-s esquema

Define o esquema da tabela especificada na opção “-t”.  Se                 não  é  fornecido,  é  considerado o  esquema  do  usuário                 corrente.

-m {modulo..}

Especifica  uma lista de módulos SQL.

-M

Todos os módulos SQL são copiados.

-o arquivo

Nome do arquivo que   deve receber a cópia. Se a   opção não  é  especificada,  a  cópia  é  escrita  na   saída padrão 	(stdout).

9-17


TSQLDOWN

Sintaxe

 tsqldown [nomeDB] [+s] [ -t | -m {módulo}... ] [-i arquivo]

Regras

O  utilitário  tsqldown realiza a operação inversa do  utilitário     tsqlup e pode ser utilizado para efetuar uma das seguintes funções :

§ Carregar uma base de dados TSQL a partir de uma cópia de segurança. A base pode ser recuperada   com qualquer  nome válido, desde que já não exista o sub_diretório definido por nomeDB. Se a intenção é substituir a base, esta deve ser eliminada antes da execução do utilitário.

§ Carregar uma tabela de uma base TSQL a partir da cópia de uma única tabela. O nome da tabela assim como os nomes e os tipos dos campos devem ser os mesmos  na cópia e na base.

§ Carregar,  em uma base TSQL ou OpenBASE,  módulos compilados SQL,  a partir de uma cópia destes módulos. Para evitar que eles estejam desatualizados   em relação aos objetos da base (referência a alguma    tabela inexistente), eles são cadastrados no estado inválido. Para validá-los será necessário efetuar uma recompilação de cada um através da execução do utilitário tsqlbin com a opção -m. Se existe na base algum módulo cujo nome é  igual a  um  módulo  na cópia,  ele deve ser eliminado  antes  da execução do utilitário.

9-18


As opções são:

nomeDB

Especifica  a  base de dados identificada    pelo    diretório                 nomeDB  (ver  utilitário tsqlcrdb).  O  diretório   pode    ser especificado na forma de um caminho completo   ou   um caminho em  relação  ao  diretório  corrente.  Se a  opção  não  é fornecida,  é considerada a base “default”(subdiretório db do diretório corrente).

+s

Execução   do  utilitário  no  modo  não   conversacional.                 Normalmente,   o   utilitário  interage  com     o     usuário  dinamicamente,   pedindo  confirmação  de  suas  ações.  O  parâmetro  +s  suspende  esta  opção,   permitindo  que  o utilitário seja usado num fluxo.

-t

A cópia de segurança é de uma única tabela.

-m {módulo}...

A cópia a ser restaurada é de um conjunto de módulos.

-i arquivo

Nome  do  arquivo  que contém a cópia.  Se a opção  não  é especificada, a cópia é lida da entrada padrão(stdin).

9-19


TSQLSTAT

Sintaxe

tsqlstat [nomeDB] [+s] [-s esquema] [-t tabela...]

Regras

Atualiza  as estatísticas sobre uma base no dicionário de  dados.

As  estatísticas são utilizadas pelo compilador SQL para a escolha dos caminhos de acesso mais eficientes para a execução de cada consulta.

As opções são:

nomeDB

O parâmetro nome DB  especifica  o  diretório  da Base de dados (veja  Base  de dados e esquemas).  O diretório  pode  ser   especificado  na  forma  de um caminho completo ou um  caminho  em   relação   ao   diretório   corrente.  Se a  opção     não   é  fornecida,   é  considerada  a  Base “default”(subdiretório db  do diretório corrente).

-s esquema

Especifica o esquema das tabelas, cujas estatísticas devem                 ser atualizadas. Se esta opção, em conjunto com a opção  -t                 não for fornecida, o usuário que  executa  o  utilitário deve ser  o  DBA ou super-usuário e as  estatísticas  de   toda   a base de dados são atualizadas. Se somente a opção -t não é                 fornecida  o usuário deve ser o DBA,  o super-usuário ou o                 dono  do esquema e as estatísticas de todo o  esquema  são                 atualizadas.

9-20


-t tabela

Especifica  as tabelas do esquema especificado pela  opção                 -s,  cujas  estatísticas  devem ser atualizadas.  Se  esta opção não é fornecida,  o usuário que executa o utilitário deve ser o dono do esquema ou o DBA ou o super-usuário,    e   as  estatísticas    de    todas   as   tabelas  do  esquema  são atualizadas.

+s

Execução   do  utilitário  no  modo  não   conversacional.                 Normalmente,   o    utilitário   interage   com    o   usuário dinâmicamente,   pedindo  confirmação  de  suas  ações.  O parâmetro  +s  suspende  esta  opção,   permitindo  que  o utilitário seja usado num fluxo.

9-21


TSQLI

Sintaxe

tsqlI [nomeDB] [-X arquivo | -E arquivo] [-F arquivo]

Regras

Programa  que  oferece  ao  usuário uma  interface  interativa  	e amigável para a execução de comandos SQL. O utilitário possui:

§ Um ambiente para desenvolvimento de comandos SQL

§ Um ambiente para desenvolvimento de formulários.

§ Um  gerador  de relatórios com vários   níveis   de  quebras,  com totalizações, médias e frequencias.

§ Um gerador de telas para consultas e inserções de  dados.

§ Um  gerador  de  telas de menu,  cada  opção deste  pode  ser   associada    a  execução  de  um programa qualquer,  um  comando  SQL,  um sub-menu ou uma tela para consulta e atualização  de 	dados.

§ “HELP” on line.

A descrição do utilitário se encontra no manual do usuário.

Opções:

nomeDB

O parâmetro nomeDB especifica o diretório da Base  de  dados    (veja Base de dados e esquemas). O diretório  pode  ser  especificado  na  forma de um caminho completo ou um caminho em relação  ao 	diretório  corrente.  Se  a opção   não  é  fornecida, é  considerada  a   Base “default”(subdiretório db  	do  diretório  corrente).

9-22


-X arquivo

Com esta opção o  utilitário  entra  diretamente no modo  comando,   executando   o   comando   SQL contido   em   “arquivo”.   O   usuário   que   entra diretamente neste modo  não tem acesso aos demais recursos do sistema.

-E arquivo

O  utilitário entra diretamente em modo tela,  com  a definição da tela contida em “arquivo”.O usuário  que entra diretamente  neste  modo não  tem  acesso  aos demais recursos do sistema.

-F arquivo

Com  esta opção o usuário especifica como  formulário corrente  o formulário cuja definição está contida em arquivo.Se a opção não for especificada em  conjunto   com a  opção -X,  o resultado   da execução do  comando SQL será exibido  segundo o formulário especificado.

9-23


TSQLMAN

Sintaxe

     tsqlman [seção] [item]

          seção : I | CO | E | P | CL | C | D | L | U

Regras

O utilitário tsqlman é um manual de referência do TSQL

on-line. É possível  acessar  através dele o índice geral,  sub-índices  de  cada capítulo e as entradas do manual própriamente ditas.

As opções são:

seção

Indica  seção   do  manual   a  ser   consultada.  Se  estiver seguida  por  item,  indica  seção  ao qual o item pertence, senão mostra o sub-índice relativo àquela seção.

As seções correspondem aos seguintes sub-menus:

I  : Indice 	C  : Comandos

CO : Conceitos	D  : Declarações

E  : Elementos	L  : Linguagens

P  : Predicados	U  : Utilitários

CL : Cláusulas

item

Indica  item  do manual a ser  mostrado.  Os  possíveis itens estão especificados no índice e nos sub-menus.

Na execução do manual, são válidos todos os comandos usados no pg do sistema.  Tecle h na linha de comando (sinalizada por “:”) para ver os comandos possíveis.

9-24


TSQLPASSWD

Sintaxe

tsqlpasswd    usuario  [ -X | -x cliente... | -R ]

Regras

Cadastra usuários em uma máquina que oferece o serviço  “servidor TSQL”  para  que estes possam acessar o serviço a partir  de  máquinas  clientes.  O  utilitário solicita o fornecimento de  uma  senha.  Esta  operação deve ser efetuada em modo super-usuário na máquina servidora.

O  utilitário  permite  tambem alterar a senha de um  usuário  já cadastrado. Neste caso, o próprio usuário pode efetuar esta operação.

As  informações  sobre o cadastramento de  usuários  remotos  são armazenadas no arquivo /usr/lib/tsql/passwd.

As opções são:

usuario

Nome do usuário a ser cadastrado.  Para alterar a senha de                 um  usuário  já cadastrado nenhuma outra    opção    deve  ser fornecida.

-x cliente...

Lista  dos nomes das máquinas clientes através das quais o                 usuário pode usar o serviço TSQL. Para alterar um conjunto                 de máquinas  já  associadas  ao    usuário,   é    necessário  executar o utilitário com a nova lista.

-X

O  usuário  pode usar o serviço TSQL a partir de  qualquer                 máquina cliente.

-R

Elimina do cadastro um usuário.

9-25


TSQLBD

Sintaxe

tsqlbd  [nomeDB] { -C | -R | -c arquivo | -r arquivo }

[-s esquema]   [-o esquema] [+s]

Regras

Para  acessar  uma base OpenBASE já existente através  dos  comandos  SQL,  é  necessário  criar  uma definição SQL  para  os  objetos  nela existentes  através da execução do utilitário tsqlbd.  Este utilitário define  objetos OpenBASE no dicionário SQL ou elimina deste dicionário  a definiçao  destes objetos.  Na definição de objetos,  o tsqlbd só pode ser executado pelo DBA ou super-usuário.

A execução do utilitário tsqlbd pressupõe a existencia de uma base TSQL híbrida criada a partir de uma base OpenBASE através do utilitário tsqlcrdb.

O   utilitário   tsqlbd   cria  um  esquema  com   as   seguintes     características:

§ 	O  identificador  de autorização é o  identificador  especificado pela  opção  -s  ou o identificador  do usuário  que  executa  o  utilitário(DBA ou   super-usuário).

§ As  entidades  e relações da Base OpenBASE são vistas como  tabelas SQL,  nas quais os nomes  das colunas são os nomes dos itens.  O caracter'.'   em um nome de item é convertido  para   o caracter'_' no nome da coluna correspondente.  O utilitário não permite que a   base  OpenBASE    tenha  sub-itens  de  um  campo  composto  não  explicitamente declarados  tendo em  vista que estes campos  não têm representação em SQL.

9-26


§ Os  tipos de dados do esquema são   definidos   a partir dos  tipos da Base   OpenBASE,   segundo   a seguinte correspondência:

                 	tipo tsgbd        tipo sql

                     I2             	INTEGER

                     I4             	DEC(10)

                      N            	DEC(-)

                      S             	DEC(-)

                      P             	DEC(-)

                      C             	DEC(-)

                 tipo tsgbd        tipo sql

     U             	CHAR(-)

                      D             	DATETIME YEAR TO DAY

                      L             	CHAR

                     F4             	REAL

                     F8             	DOUBLE PRECISION

                     B1             	SMALLINT

                     B2             	SMALLINT

                     B3             	INTEGER

                     B4             	INTEGER

9-27


§ Uma  chave unívoca na Base OpenBASE é definido no esquema sql por intermédio de uma <definição de restrição de unicidade>. Se a chave for o atributo determinante de uma entidade (chave primária), a <especificação de unicidade> será PRIMARY KEY. De  outra forma, será UNIQUE.

§ A proteção especificada na base OpenBASE através das palavras de nível, não é traduzida em dos   comandos  de autorização da SQL, mas permanece   assegurada. Privilégios podem ser criados com  comandos SQL.

§ Qualquer comando pode ser executado sobre uma base  híbrida, inclusive os comandos que definem tabelas e visões. No entanto os comandos DROP TABLE,    CREATE INDEX e DROP INDEX podem ser   executados somente sobre objetos da base que  tenham  sido	criados por comandos SQL, e não sobre tabelas  de uma base OpenBASE

§ As alterações sobre a estrutura de uma base híbrida provenientes de uma base OpenBASE devem ser realizadas através o utilitário define do OpenBASE. O fonte que contém a definição do banco OpenBASE sobre a qual devem ser efetuados as alterações deve ser o fonte gerado pelo utilitário bdvesq para que este  inclua o dicionário SQL e os eventuais objetos criados pela SQL.

§ Os índices correspondentes as chaves de acesso  definidas na Base OpenBASE são catalogados no Dicionário de dados TSQL como índices sem  nome.Estes  índices  são utilizados para a otimização  dos comandos SQL com algumas restrições (veja manual do usuário) .

9-28


Como documentação do esquema,  o utilitário gera opcionalmente um fonte na linguagem SQL (ver linguagem de definição de esquema).  Neste  fonte,  a declaração de um índice correspondente a uma chave de acesso  na  Base  OpenBASE,  aparece logo após à definição da tabela a  qual  ele  pertence.  Considerando  que a sintaxe da definição de um esquema  não permite definições de índices,  esta declaração aparece na forma de um comentário  SQL  no  qual  o  nome do índice é  o  nome  do  item  que representa a chave de acesso.  No entanto como foi visto anteriormente ele é catalogado sem nome no Dicionário.

As opções do utilitário são:

nomeDB

Esta  opção  especifica  a Base de  dados  TSQL.  O diretório  	pode  ser especificado na  forma  de  um caminho  completo  ou de um caminho em  relação  ao  diretório corrente.  Se a 	opção não é fornecida,  a  Base   “default”    (sub-diretório  db  do  diretório corrente) é considerada.

-s esquema

Especifica   o  identificador  de  autorização   do esquema  SQL do qual são acrescentados ou retirados objetos    SQL provenientes de uma base OpenBASE.  Se  a  opção  não  é fornecida,  é considerado o  nome  do usuário  que  executa 	o utilitário.  Esta opção  só  pode ser especificada pelo DBA ou super-usuário.

-C

Todas as entidades e relacionamentos da base  OpenBASE                        são  catalogados no dicionário SQL,e são associados  a um determinado esquema SQL.(veja opção -s).

9-29


-R

Elimina  do   dicionário    SQL a    definição   de todos  os  objetos  OpenBASE   associados   a   um     determinado  esquema     SQL(veja opção -s).

-c arquivo

Entidades e relacionamentos da base OpenBASE especificados   no    arquivo, são catalogados   no dicionário     SQL,  associados    a um   determinado  esquema(veja opção -s).  O arquivo deve conter  uma  lista  de nomes de objetos da base OpenBASE   separados   por brancos.

-r arquivo

Elimina do  dicionário SQL  as entidades   e    relacionamentos  da  base  OpenBASE  especificados    no arquivo,  e    que   estão associados   a   um    determinado esquema  SQL(veja opção -s).  O arquivo deve conter uma  lista  de  nomes  de  objetos  da  base  OpenBASE separados por brancos.

-o esquema

Esta  opção    especifica o nome do arquivo que contém a documentação da  definição do   esquema em   linguagem SQL.  Só  deve   ser   especificada   quando     entidades  e    relacionamentos  de   uma    base são catalogados em  um  dicionário SQL.

+s

Execução  do utilitário no modo não conversacional.                        Normalmente,   o    utilitário   interage   com   o    usuário dinâmicamente, pedindo confirmação   de   suas ações. O parâmetro  +s suspende   esta   opção,     permitindo que o utilitário seja usado num fluxo.

Veja tambem  tsqlcrdb , Base OpenBASE  (Anexo1).

9-30


TSQLDBA

Sintaxe

tsqldba [nomeDB] [-A dba] [-M mantenedor]

Regras

Altera  os  identificadores do usuário  administrador(DBA)  e  do usuário  mantenedor  da  base  de dados,  ou  mostra  um  conjunto  de informações   sobre  a  base.   O  mantenedor  possui  junto   com   o administrador e o super-usuário a permissão de executar os utilitários tsqlup, tsqldown e tsqlstat sobre toda a base.  Na criação de uma base o  mantenedor  é  o  administrador.   Somente  o  administrador  e   o super-usuário  tem  permissão  para  alterar  os  identificadores  dos     usuários administrador e mantenedor.

Se  as opções -A e -M não são especificadas,  o utilitário mostra  informações sobre a base.

As opções são:

nomeDB

O  parâmetro  nomeDB especifica o diretório da Base   de                   dados    (ver utilitário tsqlcrdb).  O diretório   pode ser especificado  na  forma de um caminho  completo  ou  um                    caminho  em relação ao diretório corrente.   Se  a    opção  não    é  fornecida,  é  considerada    a     Base   “default” (subdiretório db do diretório corrente).

-A dba

Substitui   o   nome  do  usuário  administrador   pelo  identificador especificado.

-M mantenedor

Substitui   o   nome   do   usuário   mantenedor   pelo identificador especificado.

9-31


A seguir são listadas para os tipos de base TSQL,OpenBASE e cliente as  informações mostradas pelo utilitário quando as opções A e  M  não  são especificadas.

tipo da informação	      TSQL 	OpenBASE	cliente

data da criação	X	X	X

data do último fechamento	X 	X

nome do dba 	X 	X	X

nome do mantenedor	X	X	X

tipo de recuperação 	X

código de segurança

       OpenBASE(*)	X 	X

palavra de nível OpenBASE(*)	X

nome do banco OpenBASE	X

nome da máquina remota	X	X

nome da base remota                             	X

número de seções abertas	X 	X

As  informações  marcadas  com (*),  só podem ser  obtidas  se  o usuário  que executa o utilitário é o administrador da base ou o super  usuário.

O  tipo  de recuperação informa se a base foi criada com  ou  sem   diário.

9-32


BDCNFG

Sintaxe

bdcnfg

Regras

O  bdcnfg é um programa conversacional que configura o tamanho da memória  compartilhada  entre  as diversas  aplicações.  Esta  memória contém  a tabela de bloqueios e em determinados ambientes de  execução  pode ser necessário aumentá-la.

Este  utilitário também é utilizado para configurar  determinados parâmetros do sistema OpenBASE que não são relevantes para o TSQL.

9-33


BDLICE

Sintaxe

   bdlice [-t]

Regras

O utilitário bdlice lista a tabela de bloqueios dos usuários TSQL e OpenBASE.

Cada entrada na tabela contém o nome da base,  a identificação do processo,  a  identificação  do arquivo,  a  identificação  da  página bloqueada   no  arquivo  e  o  tipo  do  bloqueio  (compartilhado   ou  exclusivo). Este utilitário informa as páginas bloqueadas das diversas bases de dados em um determinado instante.

Na  tabela  de  bloqueios,  o  nome de uma base  TSQL  é  o  nome  fornecido  pelo  item  “nome do banco TSGBD” listado  pelo  utilitário tsqldba.

As opções são:

-t

Mostra também o número da última transação.

9-34


BDSGBD

Sintaxe

bdsgbd [-d] [-e] [-a arquivo]

Regras

O  bdsgbd  é  um programa que deve ser executado  em  “background” antes de ser efetuado qualquer acesso a uma base TSQL ou OpenBASE  (nohup bdsgbd  <opções> & ).  Ele é fundamental para o  gerenciamento  destas bases.

As opções são:

-d   	Indica gravação em diário.

-e   	Indica que o arquivo diário deve ser esvaziado.

-a   	Indica a designação do arquivo diário para outro arquivo que não o arquivo /usr/tsgbd/tsdic/diario. O arquivo diário deve ser um arquivo em disco.

9-35


ANEXO 1

BASE OPENBASE

Uma  base OpenBASE pode ser adaptada para ser utilizada também  como uma  base  TSQL.  Esta  base é chamada base TSQL híbrida  e  pode  ser acessada tanto via TSQL quanto via OpenBASE.

Sobre esta base,  é possível executar,  agora,  comandos SQL.  As modificações  feitas  na base via TSQL ou via OpenBASE  são  visíveis  de ambos os lados.

a) Como criar uma base híbrida

A  adaptação de uma base OpenBASE é realizada através da execução dos utilitários tsqlcrdb e tsqlbd. O primeiro utilitário, de forma análoga a criação de uma base TSQL, cria um subdiretório que identifica a base  e  seu  dicionário  de dados (esquema  SYSSQL).  A  seguir,  deve  ser  executado o utilitário tsqlbd que cataloga os objetos da base OpenBASE no dicionário de dados TSQL.

Apenas  uma  base  TSQL  híbrida pode ser  criada  sob  um  mesmo diretório.

Quando  pelo  menos  um dos arquivos de uma base  OpenBASE não  for definido em relação ao diretório raiz, a base TSQL híbrida só pode ser  criada  sob o diretório em relação ao qual está definido este arquivo.

Uma  base  TSQL  híbrida  tem como administrador  o  usuário  que  executou o utilitário tsqlcrdb.  Os esquemas desta base são o  esquema  SYSSQL,  já mencionado,  que contém as tabelas do dicionário de dados,  os  esquemas  criados  pelo utilitário  tsqlbd  e  eventuais  esquemas  criados através a execução de comandos SQL de definição de dados.

Os  objetos da base OpenBASE são catalogados no dicionário de  dados  SQL  através  do utilitário tsqlbd no esquema  cujo  identificador  de autorização é especificado pela opção -s. Se o esquema não é fornecido é  considerado  o  identicador do usuário que  executa  o  utilitário.

ANEXO 1-3

Somente  o  administrador da base ou o super-usuário podem executar  o utilitário tsqlbd para a definição de dados.

b) Opções ARQRECUP e BLOQPAG

Se  uma  base  OpenBASE não for definida com  a  opção  ARQRECUP,  o processamento de um comando SQL de atualização sobre uma base  híbrida associada,  poderá  provocar a não integridade da base caso  haja  uma interrupção  do  sistema  TSQL(ex:  queda de força),  ou  um  erro  na execução  do comando.  A ausência desta opção tambem  inviabilizará  o processamento do comando ROLLBACK.

O  mecanismo de concorrência exigido pelo TSQL é o do bloqueio de páginas,  portanto  a  base OpenBASE deve ter sido definida com  a  opção BLOQPAG.

Veja o utilitário tsqlbd.

c) Definição de dados em uma base híbrida

Sobre uma base hibrida, é possível executar qualquer comando SQL. No  entanto os comandos DROP TABLE, CREATE INDEX e DROP INDEX podem ser executados  somente sobre objetos da base que tenham sido criados  por comandos SQL,  e não sobre tabelas provenientes de uma base OpenBASE.  As alterações sobre as estruturas de uma base híbrida provenientes de uma base OpenBASE devem ser realizadas através o programa define do OpenBASE.  O fonte  que  contém a definição do banco OpenBASE sobre o qual  devem  ser     efetuadas  as  alterações,  deve ser o fonte  gerado  pelo  utilitário     bdvesq para que este inclua os objetos SQL.

ANEXO 1-4


Numa  base híbrida os esquemas que contém tabelas criadas através comandos SQL de definição de dados provocam a criação de um  diretório cujo nome é formado pelos dez primeiros caracteres do nome do esquema. Este diretório é criado no mesmo nível do diretório da base.

No  diagrama  seguinte  é mostrada  a  estrutura  dos  diretórios criados no caso de uma base híbrida de nome “base1”,  sobre a qual foi   executado  o  comando CREATE TABLE para criar uma  tabela  no  esquema   “esquema1”.

          base1           SYSSQL             esquema1

d) Restrição ao uso de índices com campos numéricos pela 	otimização

O  TSQL otimiza o plano de acesso de uma aplicação através do uso dos índices das tabelas referenciadas.

Para um índice de uma tabela proveniente de uma base OpenBASE,  cujo primeiro campo da  chave é do tipo  SMALLINT, INTEGER ou DECIMAL, o otimizador não  considera a ordem destes campos,  se for atribuído o valor 'I'  a variável  de ambiente BDORDEMI.  Esta atribuição deve ser efetuada  de     acordo  com a seguinte condição:  os campos da chave do índice  contém valores  negativos ou no caso em que estes campos são do tipo SMALLINT ou INTEGER a arquitetura do processador é do tipo INTEL.

ANEXO 1-5


É  importante observar que se a condição anterior for  verdadeira  para  algum  índice de uma tabela e não for atribuído ao  conteúdo  da variável BDORDEMI o valor 'I', a execução de determinados comandos SQL sobre a tabela poderá não ser corretamente efetuada.

e) Utilitários e cópia de segurança para uma base híbrida

Todos  os  utilitários  TSQL podem ser usados numa  base  híbrida normalmente,  de  forma transparente ao usuário.  A exceção  fica  por  conta  dos  utilitários que tratam cópias de segurança e o  utilitário tsqlrjdb.

Para salvar uma base híbrida deve-se:

- 	Executar  o  utilitário  bdvesq,  que salva  a  definição  da estrutura  da  base de dados,  para a  eventual  reconstrução  desta mesma base.

- 	Executar o utilitário bddesc,  que salva arquivos da base  de dados.

- 	E  finalmente,  se existirem aplicações com módulo SQL,  seus fontes devem ser salvos. Uma cópia destes fontes se encontram no  diretório da base híbrida e são identificados pelo sufixo “.s”.

Mais tarde, para recuperar a base salva, deve-se:

- 	Executar o utilitário define, que recria a base de dados,  se esta deve ser reconstruída.

- 	Executar o utilitário bdreca,  que recarrega a base de dados,  anteriormente descarregado pelo bddesc.

- 	Recuperar os fontes dos módulos.

- 	Recompilar os módulos e as aplicações com SQL embutida.

ANEXO 1-6


Veja maiores detalhes sobre o uso dos utilitários bdvesq,bddesc, define e bdreca no manual

 de utilitários do OpenBASE.

O  diário de uma base TSQL híbrida é administrado pelo  OpenBASE,  e   portanto seus utilitários (define e bdredi) devem ser utilizados  para   recuperar bases a partir do diário.

f)  Desfazendo uma base híbrida

A  adaptação  de uma base OpenBASE pode ser  desfeita,  desta  forma voltará  a  ser vista apenas como uma base OpenBASE.  Para isso deve  ser  executado  o utilitário tsqlrmdb que elimina o diretório  referente  a  base TSQL.

Antes  de  executar  o  utilitário tsqlrmdb,  se  o  usuário  não  pretende  continuar  usando  objetos (tabelas)  criados  pela  SQL,  é  aconselhável  que  esses  sejam eliminados  da  base  híbrida  através comandos SQL(DROP TABLE),  para que os arquivos correspondentes  sejam removidos.

A  eliminação do sub-diretório SYSSQL e de outros  sub-diretórios  provenientes  da criação de tabelas(esquemas) através de comandos  SQL fica a cargo do usuário.

Após a execução do utilitário tsqlrmdb, se o usuário não for usar tabelas criadas pela SQL, o utilitário define deve ser executado, para eliminar  do  dicionário  OpenBASE estes objetos.  Por outro  lado  se  o usuário for usar estas tabelas o utilitário bdvesq deve ser  executado  para  incorporar  no  fonte que contem a definição do banco  OpenBASE  os  objetos criados pela SQL. O fonte da definição do banco pode então ser  editado  para  que sejam eliminadas dentre as definições  dos  objetos  SQL, as que não são mais necessárias.

ANEXO 1-7


ANEXO 2

INTRODUÇÃO - O SISTEMA TSQL EM REDE

É  cada  vez mais frequente a arquitetura em  rede  interligando várias  máquinas  de  médio  ou  pequeno  porte  em  substituição   às tradicionais   máquinas  de  grande  porte.   Nesta   arquitetura,   é  fundamental procurar soluções que façam diminuir o tráfego de dados na  linha de comunicação.

Na   área   de  sistemas  de  banco  de  dados   a   arquitetura     cliente/servidor  SQL  é  uma destas soluções tendo em  vista  que  os  comandos  SQL atuam sobre conjunto de dados.  Nesta  arquitetura,  uma aplicação  pode acessar através de comandos SQL uma base de dados  que  não  reside na mesma máquina.  Neste caso,  a máquina da aplicação é a  máquina cliente,  a máquina da base de dados é a máquina servidora e a base é uma base remota para a aplicação.  Os comandos SQL provenientes de  uma  máquina  cliente são processados na  máquina  servidora  pelo  “servidor TSQL”. Apenas comandos e dados resultantes do comando SELECT  trafegam  entre a máquina servidora e a máquina cliente.  Por exemplo, para o processamento de um comando UPDATE que atualiza um conjunto  de linhas  de uma tabela,  não é necessário que qualquer dado da base  de dados trafegue pela linha de comunicação.

A arquitetura em rede introduz dois problemas. O primeiro é o de como representar, na máquina cliente,  dados localizados remotamente .   O  segundo  é o de como autenticar para a máquina servidora o  usuário  que está em uma máquina cliente.

ANEXO 2-3


Para resolver o primeiro problema, no sistema TSQL,  uma base de dados  localizada remotamente (em uma máquina servidora) é referida na máquina cliente da mesma forma que seria uma base de dados  localizada localmente (na própria máquina).  Para isto deve-se criar,  na máquina cliente, uma base cliente associada à base remota, através da execução do utilitário tsqlcrdb (opção -h).  Do ponto de vista da implementação física,  a  diferença de uma base cliente está somente no fato de  ela  não  conter arquivos que implementam as tabelas e índices porque estes estarão  na base remota associada.  A partir daí,  todo acesso à  base cliente  estará sendo efetivado por um acesso à base remota  associada sem que seja necessário ao usuário sequer conhecer esta associação.

Para resolver o segundo problema,  no sistema TSQL,  os usuários   deverão  ser cadastrados na máquina servidora em dois níveis:  para  o sistema  operacional  e  para o próprio  sistema  TSQL.  O  utilitário  tsqlpasswd  cadastra  um  usuário em uma  máquina  servidora, para o sistema  TSQL,  atualizando  o  arquivo  /usr/lib/tsql/passwd.   Neste arquivo,   cada   linha  corresponde  a  um  usuário  cadastrado.   As  informações  de  cada  usuário são o seu identificador,  a  sua  senha criptografada (que não precisa ser necessariamente a mesma senha com a qual  está  cadastrado  para  o sistema  operacional)  e  as  máquinas clientes  a  partir das quais fará acessos à qualquer  base  de  dados localizada na máquina servidora.  Na aplicação, que da máquina cliente acessa uma máquina servidora, será requisitada ao usuário a sua senha.

    	O  arquivo /usr/lib/tsql/passwd pode ser lido por qualquer usuário,  e desta forma consultado através do comando “cat” ou qualquer editor  de texto.

Uma  mesma aplicação pode acessar várias bases que podem residir em um mesmo servidor ou em servidores distintos.

ANEXO 2-4


Uma  máquina  servidora deve ser uma máquina UNIX.  	Uma  máquina cliente pode ser uma máquina DOS ou uma máquina UNIX.

O protocolo utilizado para comunicação entre cliente e  servidor no sistema TSQL é o protocolo TCP/IP.

Veja tambem tsqlcrdb e tsqlpasswd.

DESENVOLVIMENTO DE APLICAÇÕES PARA UMA BASE CLIENTE

Módulo SQL

A  compilação  de  um módulo SQL para uma base cliente  gera  no  diretório desta base o objeto SQL e cadastra na base remota  associada o módulo.

A  aplicação que referencia os comandos de algum módulo SQL para uma  base cliente deve ser ligada com a biblioteca “rsql” que  permite tanto o acesso a bases locais como o acesso a bases remotas.

Exemplo :

nome da base cliente  	- db (base padrão)

nome do módulo                 	- modulo1

nome do fonte do módulo 	- exemplo.s

 	nome do fonte C da aplicação - exemplo.c

. Compilação do módulo SQL

tsqlbind -i exemplo.s(gera db/modulo1.o)

. Compilação do fonte C

cc -c exemplo.c   (gera exemplo.o)

. Geração da aplicação

cc -o exemplo exemplo.o db/modulo1.o -lrsql -lm

ANEXO 2-5


Para  um cliente DOS,  o nome do arquivo objeto do módulo SQL  é  (se  o nome do módulo é composto por até sete caracteres e não  contém letras minúsculas) :

                 <nomeDB>/!<nome do módulo>.obj

SQL embutida na OPUS

Se  uma base remota é acessada com comandos SQL embutidos em  um programa  OPUS,  é  necessário que no módulo  OPUS  principal(PROGRAM) seja referido na opção $LIBRARY a biblioteca “rsql”.

Rotinas de autenticação

A  biblioteca  “rsql”  oferece além das  rotinas  existentes  na biblioteca  “tsql”  como  tsqlERROR etc,  as  seguintes  rotinas  para identificação  do  usuário que acessa uma base remota  através  de  um programa de aplicação.

Rotina tsqlUSERID

Sintaxe

             int tsqlUSERID(p)

             char *p;

Descrição

Através  desta  rotina  um programa de  aplicação  comunica  a identificação do usuário. Se não for chamada antes da execução do  primeiro comando SQL,  o sistema considera o  conteúdo  da  variável de ambiente TSQLUSERID.  Se esta variável não existir  é considerado o usuário corrente no caso de um cliente UNIX, e no caso de um cliente DOS,o sistema envia uma mensagem na tela  requisitando a identificação.

Retorno

0: sucesso

-1: erro na execução

ANEXO 2-6


Rotina tsqlPASSWD

Sintaxe

             int tsqlPASSWD(p)

             char *p;

Descrição

Através desta rotina um programa de aplicação comunica a senha do usuário.  Se não for chamada antes da execução do  primeiro comando  SQL,  o sistema considera o conteúdo da  variável  de ambiente  TSQLPASSWD.  Se  a variável não existir  a  senha  é requisitada automáticamente através de uma mensagem na tela.

Retorno

0: sucesso

-1: erro na execução

UTILITÁRIOS

Os  utilitários  tsqlbind,  tsqlschema,  tsqlgrant,  tsqlrevoke,     tsqlstat  e  tsqldba podem ser executados sobre bases locais  e  bases  clientes.

Os  utilitários tsqlup,  tsqldown,  tsqlbd,  tsqlrjdb,  bdlice e     bdcnfg e bdsgbd só podem ser executados sobre bases locais e não sobre bases clientes.

Os  utilitários tsqlcrdb e tsqlrmdb podem criar e eliminar bases locais ou clientes na máquina em que eles são executados mas não podem  efetuar estas operações em máquinas remotas.

Só  faz sentido executar o utilitário tsqlpasswd em uma  máquina servidora.

ANEXO 2-7


INSTALAÇÃO DO SERVIÇO TSQL

O  protocolo  TCP/IP  deve ser instalado em  todas  as  máquinas clientes e servidoras do serviço TSQL.

O   nome  e  o  endereço  das  máquinas  servidoras  devem   ser cadastradas no arquivo /etc/hosts das máquinas clientes.

Para  cada máquina cliente ou servidora o serviço TSQL deve  ser cadastrado no arquivo /etc/services da seguinte forma:

tsqlserv   numero do serviço/tcp   comentário

O  número  do serviço é fornecido pelo administrador da  rede  e  deve  ser o mesmo para todas as máquinas que utilizam e/ou oferecem  o   serviço na rede. O comentário é opcional.

Para  que  as  máquinas  servidoras prestem  o  serviço  TSQL  é   necessário   executar   em   cada   uma   delas   o   comando   “nohup/usr/lib/tsql/xsqlserv  &” que carrega o servidor TSQL.  Este  comando pode   ser   colocado   no  arquivo   /etc/rc   para ser executado automaticamente  ao se ligar o equipamento.  O acesso a uma base local  não requer a ativação de um servidor.

ANEXO 2-8


ANEXO 3

A CÓPIA RUN-TIME

DEFINIÇÃO

A  cópia  run-time  do TSQL é uma versão deste  sistema  voltada exclusivamente para a execução de aplicações que foram desenvolvidas a partir de uma cópia plena.

Um  sistema  deste  tipo  se  caracteriza  por  não  oferecer  a facilidade  de  compilação  de módulos SQL  (opção  -i  do  utilitário tsqlbind).  Consequentemente  a  compilação de um  programa  OPUS  com  comandos  SQL embutidos também não é realizável (veja o item Aplicação do capítulo Conceitos).

CADASTRAMENTO E EXECUÇÃO DE APLICAÇÕES

Tendo  em  vista  que  no  ambiente  run-time  a  facilidade  de compilação de módulos não é oferecida, o cadastramento e a execução de uma  aplicação em uma base X de uma instalação A deve ser efetuada  da seguinte forma:

§ Desenvolver  a  aplicação sobre uma base Y em uma instalação  B  que possua uma cópia plena.  A base Y deve ter o mesmo nome (caminho  do diretório) que a base X,  e possuir todas as definições dos  objetos SQL referenciados pela aplicação.

§ 	Transportar da base Y para a base X,  através dos utilitários tsqlup e tsqldown, o(s) módulo(s) SQL  compilado(s)  associado(s)   à  aplicação.

§ 	Transportar  o  programa executável (da aplicação) da  instalação  A  para a instalação B.

Na primeira execução após o transporte, o(s) módulo(s) SQL serão automaticamente recompilados para a verificação da existência de todos  os objetos SQL referenciados pela aplicação e para que seja atualizada  a otimização do plano de acesso.  A recompilação é automática tendo em   vista  que  o  utilitário  tsqldown  cadastra  os  módulos  no  estado inválido.

ANEXO 3-3

ANEXO 5

MENSAGENS DE ERRO

Os  códigos de erro são retornados no  parâmetro  SQLCODE após a execução de cada comando SQL. Na lista abaixo, a colunamais  à esquerda fornece o código numérico do erro,  a  coluna mais  à  direita a descrição do erro e a coluna  do  centro a constante  simbólica  para  aplicações  em  C.  As  constantes simbólicas estão definidas no arquivo /usr/include/sqlcode.h.

Erros graves de processamento

-512  xFTCANCSIG     	Processador TSQL cancelado

-513  xFTALLOC       	Erro em alocação dinâmica de

memória

-514  xFTOVERPSPR    	Estouro da pilha sintática em um 	percurso

-515  xFTGCMEMNS     	Memória alocada pela geração de 	código

-516  xFTOVERPS 	Estouro da pilha sintática

-517  xFTNPRECUAR    	O analisador sintático não pode

recuar

-518  xFTSAIARQ  	Erro na geração de arquivo

-519  xFTERROCC      	Erro de sistema na compilação

C do objeto

ANEXO 5-3


Erros de uso (parâmetros de ativação)

-520  xKKFONTE       	Não conseguiu abrir

arquivo fonte

-521  xKKNOMEDB      	Não se posicionou na base de

dados

-522  xKKTSQLDB      	Não é uma base de dados

TSQL válida

-523  xKKABREDB      	Não conseguiu abrir o banco

OpenBASE

-524  xKKCRIADB      	Não conseguiu criar o banco

OpenBASE

-525  xKKNIVEL3      	Nível 3 de isolamento só para

DBA 	ou root

-526  xKKCODSEG      	Código de seguranca TSGBD

 	inválido

-527  xKKPALNIV      	Palavra de nível TSGBD

inválida

-692  xKKPASSREM     	Usuário nao cadastrado ou

senha inválida

-693  xKKACCESS      	Acesso não  permitido  a

arquivos  oudiretório

Erros léxicos em comando SQL

-528  xLXIDTERMU     	Caracter '_' termina

identificador

-529  xLXIDDOISU     	Caracter '_' duplicado no

identificador

-530  xLXIDGRANDE    	Identificador muito grande

-531  xLXCARINV      	Caracter inválido

-532  xLXEOFEMCAD    	Fim de arquivo em cadeia de

caracteres

ANEXO 5-4


Erros sintáticos em comandos SQL

-533  xSTERRO        	Erro Sintático.

Erros semânticos em comandos SQL

-534  xSMCURSORDUP   Cursor já declarado

-535  xSMFARITCHAR   	Tipo CHAR em funcao SUM

ou AVG

-536  xSMFFUNCAO     	Função como argumento de

função

-537  xSMNDIGBINV    	Precisão de tipo FLOAT

inválida

-538  xSMLINGNAO     	Linguagem não disponível

-539  xSMPROCDUP     	Procedimento já declarado

-540  xSMCURSORND    	Cursor não declarado

-541  xSM2OPENCUR    	Já existe procedimento OPEN

para o cursor

-542  xSMARITCHAR    	Operação aritmética

envolvendo tipo CHAR

-543  xSMNTABINV     	Especificação de nome de

tabela inválido

-544  xSMNPARMDUP    	Nome de parâmetro duplicado

-545  xSMSEMCODE     	Parâmetro SQLCODE não

declarado

-546  xSMTCHARINV    	Tamanho inválido para o tipo

CHARACTER

-547  xSMTDECINV     	Tamanho inválido para o tipo

NUMERIC

-548  xSMESCINV      	Escala inválida

-549  xSMTPINVLNG    	Tipo de dado inválido para a

linguagem

ANEXO 5-5


-550  xSMCODEDUP     	Parâmetro SQLCODE

duplicado

-551  xSMTABNCUR     	Tabela não identificada na

declaração do cursor

-552  xSMCOLQNRES    	Coluna qualificada não

resolvida

-553  xSMCOLNQNRES   Coluna não qualificada não

resolvida

-554  xSMCOLNQAMBG	Coluna não qualificada

ambígua

-555 xSMCOLOBAMBG	Coluna na cláusula ORDER

BY ambígua

-556  xSMCOLOBNSEL   	Coluna na cláusula ORDER

BY não na  SELECT

-557  xSMPARNRES     	Parâmetro não declarado

-558  xSMCOLGEMF     	Coluna de grupamento

argumento de função

-559  xSM2ESCOPF     	Colunas  de escopo diferente

referidas na mesma função

-560  xSMCOLSNG      	Coluna  nas cláusulas SELECT

ou 	HAVING e não na

cláusula GROUP BY

-561  xSMCOL2SET     	Coluna repetida na cláusula

SET

-562  xSMFWOUSET     	Função na cláusula WHERE ou

SET

-563  xSMPARSGOB     	Parâmetro em cláusula GROUP

BY, ORDER  BY ou SET

-564  xSMPAR2INTO    	Parâmetro duplicado na

cláusula INTO

-565  xSMXTABINS     	Referência inválida à tabela em

INSERT

ANEXO 5-6


-566  xSMIDAUTINV    	Não é o identificador de

autorização  do  esquema ou

módulo

-567  xSMPKEY2       	PRIMARY KEY repetida

-568  xSMCOLNDECL   	Coluna não definida em

CREATE TABLE

-569  xSMVARCINV     	Coluna de tipo VARCHAR em

restrição

-570  xSMID2LISTA    	Identificador repetido em uma

lista

-571  xSMNCOL2TAB    	Coluna duplicada em CREATE 	TABLE

-572  xSMNULONPERM  	Coluna restrita a valores não

nulos

-573  xSMTPATCOLNC   	Atribuição a coluna, tipo

compatível

-574  xSMOVERFLOW    	Transbordo na conversão de

constante

-575  xSMXTABUPDD    	Referência  inválida à tabela em

comando DELETE ou

UPDATE

-576  xSMCURSOPEN    	Cursor sem comando OPEN

-577 xSMTCURNATUA 	Tabela do cursor é não

 atualizável

-578  xSMNORDERINV   	Número  de  ordem na  cláusula  	ORDERBY inválido

-579  xSMNMAXTAB     	Excedido o número máximo de

tabelas

-580  xSMGS2SNEX     	Grau da lista SELECT diferente

de 1 em subconsulta  que não é

EXISTS

-581  xSMPARINDIN   	Tipo ou escala de parâmetro

INDICATOR

ANEXO 5-7


-582  xSMFECSSEMG    	Coluna  simples  e  função  sem  	cláusula  GROUP BY

-583  xSMFDIST2      	Mais de uma função

DISTINCT no escopo

-584  xSMAUTHINV     	Identificador de autorização

inválido

-585  xSMGDIFUNION   	Tabelas de graus diferentes em

UNION

-586  xSMTPNCHAR     	Valor  não é do tipo cadeia de

caracteres  em	predicado

LIKE

-587  xSMPATNCHAR    	Padrão não é de tipo cadeia de

caracteres

-588  xSMESCNCHAR    	ESCAPE não é do tipo cadeia

de caracteres

-589  xSMTPPRNCOMP  Tipos incompatíveis em

predicado

-590  xSMFUNCWHERE  	Função sobre coluna na

cláusula WHERE

-591  xSMSEL2OBINV   	Elemento  da cláusula ORDER

BY repetido com outro sentido

de ordenação

-592  xSMASTSGBYH    	SELECT  *  sem cláusula

GROUP BY e com cláusula

HAVING

-593  xSMGINTOINV    	Grau da cláusula INTO inválido

-594  xSMGINSNCOMP   	Graus diferentes no comando

INSERT

-595 xSMGCVWNCOMP  Graus diferentes no comando

CREATE VIEW

-596  xSMXPARSPEC    	Especificação de parâmetro não 	permitida

ANEXO 5-8


-597  xSMGEEINV      	Grantee igual a Grantor

-598  xSMDDINCUR     	Cursor   dinâmico  referido  em   	comando  posicionado

-599  xSMDNDINCUR    	Cursor referido em FETCH

dinâmico

-600  xSMDALGINV     	Variavel SQLDA com

linguagem	do módulo

incompatível

-601  xSMDANSMALL    	Variável SQLDA de tipo não

SMALLINT

-602  xSMSTATNCHAR   Variável comando de tipo não

caracter

-603  xSMLCOLCRV     	Lista  de colunas obrigatória em  	comando CREATE VIEW

-604  xSMCOL2INS     	Coluna  referida  mais  de  uma

vez em  cláusula INSERT

-605  xSMXREVOKE     	Não pode especificar colunas

em REVOKE

-606  xSMTPUNNCOMP   Tipos incompatíveis em

operação UNION

-607  xSMLOCKVIEW    	Comando LOCK TABLE sobre

visão

-608  xSMLOCKMODE    	Usuário  não tem privilégio

necessário ao modo de bloqueio 	sobre a tabela

-609  xSMDTQUAINV 	Qualificador ao tipo

DATETIME inválido

-610  xSMXCOLSPEC    	Especificação de coluna não

permitida

-611  xSMXFUNSPEC    	Especificação de função não

permitida

ANEXO 5-9


-612  xSMARITDATE    	Aritmética inválida com tipo

DATETIME

-613  xSMNAODATA     	Data (DD/MM/AAAA)

inválida

-614  xSMIDERANV     	Identificador de era inválido

-615  xSMYEANV       	Valor de ano inválido

-616  xSMMONNV       	Valor de mês inválido

-617  xSMDAYNV       	Valor de dia inválido

-618  xSMHOUNV       	Valor de hora inválido

-619  xSMMINNV   	    	Valor de minuto inválido

-620  xSMSECNV      	Valor de segundo inválido

-621  xSMQCDTNV      	Qualificador   inválido  para

constante   DATETIME

-622  xSMFEXTEND     	Tipo  do argumento da função

EXTEND  não  é  DATETIME

-623  xSMTPATPARNC   	Tipos incompatíveis em

atribuiçao à  variável

-624  xSMCCNCHAR     	Tipo do operando de

concatenação inválido

-625  xSMLENCHAR     	Tipo  do argumento  da  função   	LENGTH inválido

-626  xSMSBNCHAR     	Tipo do argumento da função

 	SUBSTRING não é cadeia de

caracteres

-627  xSMSBPINNUM    	Posição  inicial  em função

SUBSTRING  de    tipo não

numérico ou escala não zero

-628  xSMSBTRNNUM    	Tamanho  em função

SUBSTRING

 	de tipo não  numérico ou escala

não zero

ANEXO 5-10


-629  xSMNOMECOM     	Não existe o comando

associado ao cursor

-630  xSMCDINSFU     	Não especificada a cláusula

FOR 	UPDATE

-631  xSMCNFUCDIN    	Coluna não está na cláusula

FOR 	UPDATE

-632  xSMSETNULL     	SET NULL em chave restrita a

não nulos

-633  xSMFORKT2REF   	Erro  na  dupla referência  à

tabela	em comando CREATE

TABLE

ANEXO 5-11


Erros na execução de comandos SQL

-634  xINALMEMINT    	Erro na alocação do código

interpretável

-635  xINOBJINVAL    	Objeto do módulo não

compatível

-636  xINMODINVAL    	Módulo nao está válido para

execução

-637  xINCODINT      	Código interpretável não

compatível

-638  xINTUPLASS     	Cardinalidade de comando

SELECT INTO	ou

subconsulta maior que 1

-639  xINCURFEC1     	Cursor fechado em DELETE

ou UPDATE

-640  xINCURFEC2     	Cursor fechado em CLOSE ou

FETCH

-641  xINNAOPOS      	Cursor não posicionado em

comando DELETE ou

UPDATE

-642  xINOPEN        	Cursor já aberto em comando

OPEN

-643  xINVNULLINV    	Atribuição de valor nulo

inválida

-644  xINUNDO        	Erro no cancelamento das

alterações

-645  xINOVERFLOW    	Transbordo em operação ou

atribuição

-646  xINDIVZERO     	Divisão por zero

-647  xINCHAVDUP     	Chave duplicada

-648  xINESCFIMPAD   	ESCAPE último caracter do

padrão

-649  xINCPRENSEL    	Comando preparado não é

SELECT

ANEXO 5-12


-650  xINCPRESEL     	Comando preparado é SELECT

-651  xINDAFETCHNV   	SQLDA de FETCH dinâmico

inválido

-652  xINNTEMCPRE    	Comando não existe ou não

preparado

-653  xINCOLNDECL    	Coluna  de  tabela  não

identificada 	em CREATE

INDEX ou GRANT

-654  xINVARCINV     	VARCHAR em CREATE

INDEX

-655  xINNMAXMOD   	Ultrapassado  o  limite  de

módulos em  execução

-656  xINNPODEEXM    	Usuário não pode executar o

módulo

-657  xINMODEMEX     	Não pode invalidar módulo em

execução

-658  xINLEITINT     	Erro na leitura do código do

módulo

-659  xINMAXOPEN     	Limite máximo de arquivos

abertos

-660  xINERRSORT     	Erro não esperado no módulo

 	SORT-MERGE

-661  xINMAXSORT     	Limite máximo de ordenações

 	ativas

-662  xINTPDANCOMP   	Tipos incompatíveis em

FETCH dinâmico

-663  xINCVINPARAM  	Erro na conversão de entrada

de parâmetro

-664  xINMEMNOK      	Endereço de parâmetro inválido

-665  xINOBJNOK      	Objeto do módulo foi

corrompido

-666  xINSBPINVAL    	Posição inicial de SUBSTRING 	inválida

ANEXO 5-13


-667  xINSBTRNVAL    	Tamanho  do resultado da

função SUBSTRING inválido

-668  xINCOMOPEN     	Comando preparado está

associado a cursor  aberto

-669  xINFORKDEF     	Chave estrangeira  incompatível  	com  a  chave primária da tabela 	referida

-670  xINDEADLOCK    	Esgotado  o  tempo de espera

por objeto   reservado a outro usuário

-671  xINFORKREF     	Violação de restrição referencial

-672  xINUSOEXC      	Banco  OpenBASE não está

disponível para (ou por) uso

exclusivo

-673  xINBDSGBD      	Erro na execução do programa

BDSGBD

-674  xINMAXUSU      	Número máximo de usuários

-675  xINPALNIV      	Palavra  de nível nao permite

leitura Ou gravação de coluna

da tabela

-676  xINARQEXT      	Erro  em  gravação  de arquivo

de  outro banco OpenBASE

-691  xINCOMTSQL     	Erro de comunicação com

servidor TSQL

-694  xINTAMCHAVE    	Limite do tamanho de chave de

 	índice

-695  xINWCONOK      	Violação de cláusula WITH

CHECK OPTION

ANEXO 5-14


Erros encontrados em consultas ao Dicionário de Dados

-677  xDDNAOTEMTAB  Não existe a tabela ou visão

-678  xDDJATEMTAB    	Nome de tabela já existe

-679  xDDVISDEPTAB   	Visão depende de tabela em

DROTABLE

-680  xDDJATEMMOD    	Já existe o módulo

-681  xDDJATEMIND    	Nome de índice já existe

-682  xDDNAOTEMMOD Módulo não existe

-683  xDDNAOPRCMOD Usuário não tem permissão para 	recompilar módulo

-684 xDDMODNAOPRC  	O módulo não pode ser

recompilado

-685  xDDNAOTEMIND   Índice não existe

-686  xDDJATEMVIS    	Nome de visão já existe

-687  xDDNAOTEMPRV  	Usuário  não  tem  o privilégio

sobre  a  tabela referida

-688  xDDNEXPRVUPC   	Usuário não tem o privilégio

UPDATE sobre a coluna

referida

-689  xDDNEXPRVREF   	Usuário  não tem o privilégio

REFERENCES sobre a tabela

referida

-690  xDDTABDEPTAB   	Tabela depende de tabela em

DROP TABLE

ANEXO 5-15