Você está na página 1de 223

Manual de Referncia do Derby

Version 10
Derby Document build:
December 11, 2006, 7:17:42 AM (PST)
Direitos autorais reservados

Contents
Direitos autorais reservados............................................................................................... 7
Sobre este documento......................................................................................................... 8
Finalidade deste documento.................................................................................... 8
Audincia................................................................................................................... 8
Organizao deste documento................................................................................ 8
Referncia da linguagem SQL...........................................................................................10
Letras maisculas e caracteres especiais............................................................ 10
Identificadores SQL................................................................................................ 10
Regras para identificadores SQL92....................................................................11
IdentificadorSQL92............................................................................................. 11
nome-da-coluna.................................................................................................. 12
nome-da-correlao............................................................................................12
novo-nome-da-tabela..........................................................................................13
nome-do-esquema..............................................................................................13
nome-de-coluna-simples.....................................................................................14
nome-do-sinnimo.............................................................................................. 14
nome-da-tabela...................................................................................................14
nome-da-viso.................................................................................................... 14
nome-do-ndice................................................................................................... 15
nome-da-restrio...............................................................................................15
nome-do-cursor...................................................................................................15
nome-do-gatilho.................................................................................................. 16
identificador-de-autorizao................................................................................16
Instrues................................................................................................................ 16
Interao com o sistema de dependncias........................................................ 17
Instruo ALTER TABLE.................................................................................... 17
Instrues CREATE............................................................................................20
Instrues DROP................................................................................................ 34
Instrues RENAME........................................................................................... 36
Instrues SET................................................................................................... 37
CALL (PROCEDIMENTO).................................................................................. 39
Clusula CONSTRAINT......................................................................................39
Instruo DECLARE GLOBAL TEMPORARY TABLE........................................45
Instruo DELETE.............................................................................................. 48
Clusula FOR UPDATE......................................................................................49
Clusula FROM.................................................................................................. 49
Clusula GROUP BY.......................................................................................... 50
Clusula HAVING............................................................................................... 50
INNER JOIN........................................................................................................51
Instruo INSERT............................................................................................... 52
Operao JOIN................................................................................................... 53
LEFT OUTER JOIN............................................................................................ 54
Instruo LOCK TABLE...................................................................................... 54
Clusula ORDER BY.......................................................................................... 55
Consulta..............................................................................................................56
RIGHT OUTER JOIN.......................................................................................... 58
SubconsultaEscalar............................................................................................ 58
ExpressoSeleo.............................................................................................. 59
Instruo SELECT.............................................................................................. 61
ExpressoTabela................................................................................................ 63
SubconsultaTabela............................................................................................. 63
Instruo UPDATE..............................................................................................64
VALUES Expresso............................................................................................65
Clusula WHERE................................................................................................66
Clusula WHERE CURRENT OF....................................................................... 67
Funes nativas...................................................................................................... 67

i
Direitos autorais reservados
Funes nativas padro......................................................................................68
Agregaes (funes de conjunto)..................................................................... 68
ABS ou ABSVAL.................................................................................................70
AVG.................................................................................................................... 70
BIGINT................................................................................................................ 70
CAST.................................................................................................................. 71
CHAR..................................................................................................................73
LENGTH............................................................................................................. 75
Concatenao.....................................................................................................75
Expresses NULLIF e CASE.............................................................................. 76
COUNT............................................................................................................... 77
COUNT(*)........................................................................................................... 77
CURRENT DATE................................................................................................77
CURRENT_DATE...............................................................................................77
CURRENT ISOLATION...................................................................................... 78
CURRENT SCHEMA.......................................................................................... 78
CURRENT TIME.................................................................................................78
CURRENT_TIME................................................................................................78
CURRENT TIMESTAMP.................................................................................... 79
CURRENT_TIMESTAMP................................................................................... 79
CURRENT_USER.............................................................................................. 79
DATE.................................................................................................................. 79
DAY.....................................................................................................................80
DOUBLE............................................................................................................. 80
HOUR................................................................................................................. 81
IDENTITY_VAL_LOCAL..................................................................................... 81
INTEGER............................................................................................................ 83
LOCATE..............................................................................................................83
LCASE ou LOWER............................................................................................. 84
LTRIM................................................................................................................. 84
MAX.................................................................................................................... 85
MIN..................................................................................................................... 85
MINUTE.............................................................................................................. 86
MOD....................................................................................................................86
MONTH...............................................................................................................87
RTRIM.................................................................................................................87
SECOND.............................................................................................................87
SESSION_USER................................................................................................ 88
SMALLINT.......................................................................................................... 88
SQRT.................................................................................................................. 89
SUBSTR............................................................................................................. 89
SUM.................................................................................................................... 90
TIME................................................................................................................... 90
TIMESTAMP....................................................................................................... 91
UCASE ou UPPER............................................................................................. 91
USER.................................................................................................................. 92
VARCHAR.......................................................................................................... 92
YEAR.................................................................................................................. 92
Funes do sistema nativas.................................................................................. 93
SYSCS_UTIL.SYSCS_CHECK_TABLE.............................................................93
SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS........................................ 93
SYSCS_UTIL.SYSCS_GET_DATABASE_PROPERTY.................................... 93
Procedimentos do sistema nativos....................................................................... 94
SYSCS_UTIL.SYSCS_COMPRESS_TABLE.....................................................94
SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE................................... 95
SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS.........................................97
SYSCS_UTIL.SYSCS_SET_STATISTICS_TIMING.......................................... 97
SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY.....................................98
SYSCS_UTIL.SYSCS_FREEZE_DATABASE................................................... 98

ii
Direitos autorais reservados
SYSCS_UTIL.SYSCS_UNFREEZE_DATABASE.............................................. 99
SYSCS_UTIL.SYSCS_CHECKPOINT_DATABASE.......................................... 99
SYSCS_UTIL.SYSCS_BACKUP_DATABASE.................................................100
SYSCS_UTIL.SYSCS_EXPORT_TABLE.........................................................100
SYSCS_UTIL.SYSCS_EXPORT_QUERY....................................................... 101
SYSCS_UTIL.SYSCS_IMPORT_TABLE......................................................... 102
SYSCS_UTIL.SYSCS_IMPORT_DATA........................................................... 103
Tipos de dado........................................................................................................ 105
Viso geral dos tipos de dado nativos.............................................................. 105
Tipos numricos................................................................................................105
Tipo de dado - atribuies e comparao, classificao e ordenao............. 107
BIGINT.............................................................................................................. 109
BLOB................................................................................................................ 110
CHAR................................................................................................................111
CHAR FOR BIT DATA...................................................................................... 111
CLOB................................................................................................................ 112
DATE................................................................................................................ 113
DECIMAL.......................................................................................................... 114
DOUBLE .......................................................................................................... 115
DOUBLE PRECISION...................................................................................... 115
FLOAT.............................................................................................................. 116
INTEGER.......................................................................................................... 116
LONG VARCHAR............................................................................................. 117
LONG VARCHAR FOR BIT DATA................................................................... 117
NUMERIC......................................................................................................... 118
REAL.................................................................................................................118
SMALLINT........................................................................................................ 119
TIME................................................................................................................. 119
TIMESTAMP..................................................................................................... 120
VARCHAR........................................................................................................ 121
VARCHAR FOR BIT DATA...............................................................................121
Expresses SQL.................................................................................................... 122
Precedncia das expresses............................................................................124
Expresso booleana......................................................................................... 125
Parmetros dinmicos...................................................................................... 127
Palavras reservadas do SQL........................................................................................... 130
Suporte do Derby s funcionalidades do SQL-92......................................................... 134
Tabelas do sistema Derby............................................................................................... 141
SYSALIASES..........................................................................................................141
SYSCHECKS.......................................................................................................... 141
SYSCOLUMNS....................................................................................................... 142
SYSCONGLOMERATES........................................................................................ 143
SYSCONSTRAINTS............................................................................................... 143
SYSDEPENDS........................................................................................................ 144
SYSFILES............................................................................................................... 144
SYSFOREIGNKEYS............................................................................................... 145
SYSKEYS............................................................................................................... 145
SYSSCHEMAS....................................................................................................... 146
SYSSTATISTICS.................................................................................................... 146
SYSSTATEMENTS................................................................................................. 146
SYSTABLES........................................................................................................... 147
SYSTRIGGERS...................................................................................................... 147
SYSVIEWS..............................................................................................................149
Mensagens de exceo e estados SQL do Derby......................................................... 150
Referncia de SQLState e mensagem de erro....................................................150
Referncia do JDBC......................................................................................................... 177
Classes, interfaces e mtodos java.sql do ncleo do JDBC.............................177
java.sql.Driver........................................................................................................ 177
java.sql.DriverManager.getConnection............................................................... 178

iii
Direitos autorais reservados
Sintaxe da URL de conexo com banco de dados Derby................................ 178
Sintaxe da URL de conexo com banco de dados para aplicativos com bancos
de dados incorporados..................................................................................... 179
Sintaxe SQL adicional.......................................................................................179
Atributos da URL de conexo com o banco de dados Derby........................... 180
java.sql.Driver.getPropertyInfo............................................................................ 180
java.sql.Connection ............................................................................................. 181
java.sql.Connection.setTransactionIsolation ....................................................181
java.sql.Connection.setReadOnly ....................................................................181
java.sql.Connection.isReadOnly ...................................................................... 181
Funcionalidades de conexo no suportadas.................................................. 181
java.sql.DatabaseMetaData.................................................................................. 182
Conjuntos de resultados DatabaseMetaData................................................... 182
getProcedureColumnsgetProcedureColumns.................................................. 182
Parmetros para getProcedureColumns.......................................................... 182
Colunas do ResultSet retornado por getProcedureColumns............................182
Funcionalidades de DatabaseMetaData no suportadas................................. 183
java.sql.Statement ................................................................................................ 183
Objetos ResultSet............................................................................................. 184
java.sql.PreparedStatement................................................................................. 184
Instrues preparadas e colunas de fluxo........................................................ 184
java.sql.CallableStatement .................................................................................. 186
CallableStatement e parmetros OUT..............................................................186
CallableStatement e parmetros INOUT.......................................................... 186
java.sql.ResultSet .................................................................................................187
ResultSets e colunas de fluxo...........................................................................187
java.sql.ResultSetMetaData..................................................................................188
java.sql.SQLException..........................................................................................188
java.sql.SQLWarning............................................................................................ 188
Mapeamento de java.sql.Types em tipos SQL....................................................189
java.sql.Blob e java.sql.Clob................................................................................ 189
Notas.................................................................................................................191
java.sql.Connection.............................................................................................. 192
java.sql.ResultSet..................................................................................................192
java.sql.Statement................................................................................................. 193
java.sql.PreparedStatement................................................................................. 194
java.sql.CallableStatement .................................................................................. 194
java.sql.DatabaseMetaData.................................................................................. 194
java.sql.ResultSetMetaData..................................................................................194
java.sql.BatchUpdateException........................................................................... 194
Pacote JDBC para Connected Device Configuration/Foundation Profile
(JSR169)................................................................................................................. 195
Funcionalidades apenas do JDBC 3.0.................................................................195
java.sql.Connection ............................................................................................. 196
java.sql.DatabaseMetaData ................................................................................. 196
java.sql.ParameterMetaData.................................................................................196
java.sql.PreparedStatement................................................................................. 197
java.sql.Savepoint................................................................................................. 197
Definir e desfazer at um ponto de salvamento............................................... 197
Liberao de ponto de salvamento...................................................................198
Regras para pontos de salvamento.................................................................. 198
Restries dos pontos de salvamento.............................................................. 198
java.sql.Statement................................................................................................. 198
Chaves autogeradas.........................................................................................198
Sintaxe de escape do JDBC................................................................................. 199
Palavra chave de escape do JDBC para instrues call.................................. 200
Sintaxe de escape do JDBC............................................................................. 200
Sintaxe de escape do JDBC para clusulas LIKE............................................ 200
Sintaxe de escape do JDBC para a palavra chave fn...................................... 201

iv
Direitos autorais reservados
Sintaxe de escape do JDBC para junes externas.........................................203
Sintaxe de escape do JDBC para formatos de hora.........................................203
Sintaxe de escape do JDBC para formatos de carimbo do tempo................... 204
Definio de atributos para a URL de conexo com o banco de dados..................... 205
bootPassword=chave........................................................................................... 205
create=true............................................................................................................. 205
databaseName=nomeBancoDados..................................................................... 206
dataEncryption=true............................................................................................. 206
encryptionProvider=nomeProvedor.................................................................... 206
encryptionAlgorithm=algoritmo...........................................................................207
territory=ll_CC....................................................................................................... 207
logDevice=caminhoDiretorioLog......................................................................... 208
password=senhaUsuario......................................................................................209
rollForwardRecoveryFrom=Caminho.................................................................. 209
createFrom=Caminho........................................................................................... 209
restoreFrom=Caminho..........................................................................................210
shutdown=true.......................................................................................................210
user=nomeUsurio................................................................................................211
(nenhum atributo)..................................................................................................211
Conformidade com o J2EE: API de transao Java e extenses javax.sql................212
JVM e bibliotecas para as funcionalidades do J2EE......................................... 213
A API do JTA..........................................................................................................213
Notas sobre o comportamento do produto....................................................... 213
javax.sql: Extenses JDBC.................................................................................. 213
API do Derby..................................................................................................................... 215
Ferramentas e utilitrios autnomos.................................................................. 215
Classes de implementao do JDBC.................................................................. 215
Driver de JDBC................................................................................................. 215
Classes de fonte de dados............................................................................... 215
Utilitrios e interfaces diversas........................................................................... 216
Territrios suportados..................................................................................................... 217
Limitaes do Derby........................................................................................................ 218
Limitaes do comprimento de identificador.....................................................218
Limitaes numricas...........................................................................................218
Limitaes das cadeias........................................................................................ 219
Limitaes de DATE, TIME e TIMESTAMP.......................................................... 219
Limitaes dos valores do gerenciador de banco de dados............................ 219
Marcas registradas........................................................................................................... 221

v
Direitos autorais reservados
Apache Software FoundationManual de Referncia do DerbyApache Derby

6
Direitos autorais reservados

Direitos autorais reservados


Segunda Edio (Julho de 2005)

Copyright 1997, 2005 Apache Software Foundation, ou seus concessores de licena,


conforme se aplique.
Licenciado sob a Licena Apache, Verso 2.0 (doravante chamada apenas de
"Licena"); este arquivo no pode ser utilizado a no ser em conformidade com a
Licena. Pode ser obtida uma cpia da Licena em
http://www.apache.org/licenses/LICENSE-2.0

A menos que seja requerido por lei aplicvel, ou concordado por escrito, o programa
distribudo sob esta Licena distribudo na BASE DE "COMO ", SEM GARANTIAS
OU CONDIES DE QUALQUER ESPCIE, sejam expressas ou implcitas. Veja na
Licena as condies especficas que governam as permisses e limitaes sob a
Licena.

7
Direitos autorais reservados

Sobre este documento


Para obter informaes gerais sobre a documentao do Derby, como a relao
completa de documentos, convenes e leitura adicional, deve ser consultada a
Introduo ao Derby.

Finalidade deste documento


Este documento, o Manual de Referncia do Derby, fornece informaes de referncia
sobre o Derby. Cobre a linguagem SQL do Derby, a implementao do JDBC do Derby,
os catlogos do sistema do Derby, as mensagens de erro do Derby, as propriedades do
Derby, e as palavras chave do SQL.

Audincia
Este documento a referncia para os usurios do Derby, que so tipicamente
desenvolvedores de aplicativos. Os usurios do Derby no familiarizados com o padro
SQL, ou com a linguagem de programao Java, sero beneficiados pela consulta a
livros sobre estes tpicos.

Os usurios do Derby que desejarem uma abordagem para trabalhar com o Derby do
tipo como fazer, ou uma introduo aos conceitos do Derby, devem consultar o Guia do
Desenvolvedor do Derby.

Organizao deste documento


Este documento inclui as seguintes sees:
Referncia da linguagem SQL
Informaes de referncia sobre a linguagem SQL do Derby, incluindo pginas de
manual para instrues, funes e outros elementos da sintaxe.
Palavras reservadas do SQL
Palavras chave do SQL alm das palavras chave do padro SQL-92.
Suporte do Derby s funcionalidades do SQL-92
Uma lista de funcionalidades do SQL-92 que o Derby d suporte e no d suporte.
Tabelas do sistema Derby
Informaes de referncia sobre os catlogos do sistema do Derby.
Mensagens de exceo e estados SQL do Derby
Informaes sobre as mensagens de exceo do Derby.
Referncia do JDBC
Informaes sobre a implementao da interface de JDBC do Derby, incluindo
suporte a funcionalidades do JDBC 2.0.
Definio de atributos para a URL de conexo com o banco de dados
Informaes sobre os atributos suportados pela URL de conexo com o banco de
dados do JDBC do Derby.
Conformidade com o J2EE: API de transao Java e extenses javax.sql
Informaes sobre os atributos suportados pelo suporte do Derby API de
Transao Java.
API do Derby

8
Direitos autorais reservados

Notas sobre as APIs proprietrias para o Derby.

9
Direitos autorais reservados

Referncia da linguagem SQL


O Derby implementa um subconjunto do ncleo do SQL-92, assim como algumas
funcionalidades do SQL-99.

Esta seo fornece uma viso geral da linguagem SQL corrente, atravs da descrio
das instrues, funes nativas, tipos de dado, expresses e caracteres especiais
presentes na linguagem.

Letras maisculas e caracteres especiais


Ao utilizar classes e mtodos do JDBC, so submetidas instrues SQL ao Derby na
forma de cadeias. O conjunto de caracteres permitido nas cadeias contendo instrues
SQL o Unicode. Nestas cadeias se aplicam as seguintes regras:
Aspas delimitam os identificadores especiais, referidos no SQL-92 como
identificadores delimitados.
Apstrofos delimitam cadeias de caracteres.
Na cadeia de caracteres, para representar um apstrofo (tambm chamado de
aspas simples) so usados dois apstrofos (Em outras palavras, o apstrofo o
caractere de escape do apstrofo).
As aspas no necessitam de caractere de escape. Para representar aspas
deve-se, simplesmente, utilizar aspas. Entretanto, deve ser observado que no
programa Java as aspas necessitam do caractere de escape contrabarra (\).
Exemplo:

-- o apstrofo o caractere de escape do apstrofo


VALUES 'Maria D''Almeida'
-- no ij no h necessidade de caractere de escape para aspas
VALUES 'Ele disse, "Bom dia!"'
-- no programa Java aspas necessitam de escape
n = stmt.executeUpdate(
"UPDATE minhaTabela SET stringCol = 'Ele disse, \"Bom dia!\"'");

As palavras chave do SQL no so sensveis a letras maisculas e minsculas. Por


exemplo, a palavra chave SELECT pode ser escrita como SELECT, Select, select,
ou sELECT.
Os identificadores no estilo SQL-92 no so sensveis a letras maisculas e
minsculas (consulte IdentificadorSQL92), a menos que estejam delimitados.
Os identificadores no estilo Java so sensveis a letras maisculas e minsculas.
O * um caractere curinga na ExpressoSeleo. Consulte O curinga *. Tambm
pode ser o operador de multiplicao. Em todos os outros casos um
meta-smbolo da sintaxe, sinalizando itens que podem ser repetidos zero ou mais
vezes.
% e _ so caracteres curinga quando utilizados nas cadeias de caracteres aps o
operador LIKE (exceto quando precedidos pelo caractere de escape). Consulte
Expresso booleana.
De acordo com o padro SQL-92, dois hfens (--) e o caractere de nova-linha
delimitam um comentrio. Os dois hfens iniciam o comentrio, e o caractere de
nova-linha termina o comentrio.

Identificadores SQL
O identificador a representao dentro da linguagem de itens criados pelos usurios,
em oposio s palavras chave e comandos da linguagem. Alguns identificadores

10
Direitos autorais reservados
representam objetos do dicionrio, que so objetos criados pelo usurio (como tabelas,
vises, ndices, colunas e restries), que so armazenados no banco de dados. So
chamados de objetos do dicionrio porque o Derby armazena as informaes sobre
estes objetos nas tabelas do sistema, algumas vezes chamado de dicionrio de dados.
O padro SQL tambm define maneiras de criar aliases para estes objetos em certas
instrues.

Cada tipo de identificador deve estar em conformidade com um conjunto diferente de


regras. Os identificadores que representam objetos do dicionrio devem estar em
conformidade com as regras de identificador do SQL-92, sendo portanto chamados de
IdentificadorSQL92.

Regras para identificadores SQL92


Identificadores comuns so identificadores no envoltos por aspas. Os identificadores
delimitados so identificadores envoltos por aspas.

Um identificador comum deve comear por uma letra, e conter apenas letras, caracteres
de sublinhado (_) e dgitos. As letras e dgitos permitidos incluem todas as letras e
dgitos do Unicode, mas o Derby no tenta garantir que os caracteres do identificador
sejam vlidos no idioma do banco de dados.

Um identificador delimitado pode conter qualquer caractere entre as aspas. As aspas


envoltrias no fazem parte do identificador; servem apenas para marcar seu comeo e
seu fim. Os espaos no final do identificador delimitado no so significativos (so
truncados). O Derby traduz duas aspas consecutivas no interior do identificador
delimitado como uma aspas, ou seja, as duas aspas "traduzidas" se tornam um
caractere do identificador delimitado.

Os pontos dentro do identificador delimitado no so separadores, so parte do


identificador (o nome do objeto do dicionrio sendo representado).
Portanto, no exemplo a seguir:
"A.B"

um objeto do dicionrio, enquanto


"A"."B"

um objeto do dicionrio qualificado por outro objeto do dicionrio (como uma coluna
chamada "B" pertencente tabela "A").

IdentificadorSQL92
Um IdentificadorSQL92 um identificador de objeto do dicionrio em conformidade com
as regras do SQL-92. O padro SQL-92 declara que os identificadores dos objetos do
dicionrio esto limitados a 128 caracteres, e no so sensveis a letras maisculas e
minsculas (a menos que estejam delimitados por aspas), porque so traduzidos
automaticamente para letras maisculas pelo sistema. No permitido utilizar palavras
reservadas como identificadores para os objetos do dicionrio, a menos que estejam
delimitadas. Se for tentado utilizar um nome com mais de 128 caracteres, ser lanada a
SQLException X0X11.

O Derby define palavras chave alm das especificadas pelo padro SQL-92 (consulte
Palavras reservadas do SQL).

Exemplo

11
Direitos autorais reservados

-- o nome da viso armazenado nos


-- catlogos do sistema como UMIDENTIFICADOR
CREATE VIEW UmIdentificador (RECEBIDO) AS VALUES 1
-- o nome da viso armazenado nos
-- catlogos do sistema intacto
CREATE VIEW "UmIdentificadorComMaisculasEMinsculas" (RECEBIDO) AS
VALUES 1

Esta seo descreve as regras para utilizar IdentificadorSQL92 para representar os


objetos do dicionrio que se seguem.
Qualificao dos objetos do dicionrio
Uma vez que alguns objetos do dicionrio podem estar contidos em outros objetos, os
nomes destes objetos do dicionrio podem ser qualificados. Cada componente
separado do componente seguinte por um ponto. O IdentificadorSQL92
"separado-por-ponto". O nome do objeto do dicionrio qualificado para evitar
ambiguidade.

nome-da-coluna
Na sintaxe do SQL, em muitos lugares o nome da coluna pode ser representado
qualificado pelo nome-da-tabela ou pelo nome-da-correlao.

Em algumas situaes, no se pode qualificar o nome-da-coluna com o nome-da-tabela


ou com o nome-da-correlao. Em vez disso, utilizado um nome-de-coluna-simples.
Estas situaes so:

criao da tabela (Instruo CREATE TABLE)


especificao das colunas atualizveis no cursor
no nome de correlao da coluna em uma expresso SELECT (consulte
ExpressoSeleo)
no nome de correlao da coluna em uma ExpressoTabela (consulte
ExpressoTabela)
No pode ser utilizado o nome-da-correlao em colunas atualizveis; a utilizao do
nome-da-correlao desta maneira causa exceo SQL. Por exemplo:

SELECT C11 AS COL1, C12 AS COL2, C13 FROM T1 FOR UPDATE OF C11, C13
Neste exemplo, o nome-da-correlao COL1 para C11 no permitido, porque C11
aparece na lista de colunas FOR UPDATE. Pode ser utilizado o nome-da-correlao
COL2 para C12, porque C12 no aparece na lista de colunas de FOR UPDATE.

Sintaxe
[ { nome-da-tabela | nome-da-correlao } . ] IdentificadorSQL92

Exemplo
-- P.PAS o nome da coluna qualificado pelo nome-da-correlao.
SELECT P.PAS
FROM APP.PASES P

nome-da-correlao
O nome-da-correlao atribudo expresso de tabela na clusula FROM como sendo

12
Direitos autorais reservados
o novo nome, ou alis, para a tabela. O nome-da-correlao no qualificado pelo
nome-do-esquema.
No permitido utilizar o nome-da-correlao em colunas atualizveis; a utilizao do
nome-da-correlao desta maneira causa uma exceo SQL. Por exemplo:

SELECT C11 AS COL1, C12 AS COL2, C13 FROM T1 FOR UPDATE OF C11, C13
Neste exemplo, o nome-da-correlao COL1 para C11 no permitido, porque C11
aparece na lista de colunas de FOR UPDATE. Pode ser utilizado o nome-da-correlao
COL2 para C12, porque C12 no aparece na lista de colunas de FOR UPDATE.

Sintaxe
IdentificadorSQL92

Exemplo
-- F o nome-da-correlao
SELECT F.NOME
FROM SAMP.FUNCIONRIOS F

novo-nome-da-tabela
O novo-nome-da-tabela representa uma tabela renomeada. No permitido qualificar o
novo-nome-da-tabela com o nome-do-esquema.

Sintaxe
IdentificadorSQL92

Exemplo
-- VOS_DISPONVEIS o novo-nome-da-tabela que no inclui o
nome-do-esquema
RENAME TABLE VOS_DISPONIBILIDADE TO VOS_DISPONVEIS

nome-do-esquema
O nome-do-esquema representa o esquema. Os esquemas contm outros objetos do
dicionrio, como tabelas e ndices. Os esquemas fornecem uma maneira de dar nomes a
um subconjunto de tabelas e outros objetos do dicionrio no banco de dados.

Os esquemas podem ser criados e removidos explicitamente. O esquema de usurio


padro o esquema APP (se no for especificado nenhum nome de usurio no
momento da conexo). No permitido criar objetos nos esquemas que comeam por
SYS.

Portanto, as referncias a tabelas podem ser qualificadas pelo nome do esquema.


Quando o nome-do-esquema no especificado, o nome de esquema padro inserido
implicitamente. As tabelas do sistema so colocadas no esquema SYS. Todas as
referncias a tabelas do sistema devem ser qualificadas pelo identificador de esquema
SYS. Para obter mais informaes sobre as tabelas do sistema deve ser consultado
Tabelas do sistema Derby.

O esquema o objeto de dicionrio no nvel mais alto da hierarquia, portanto o

13
Direitos autorais reservados

nome-do-esquema no pode ser qualificado.

Sintaxe
IdentificadorSQL92

Exemplo

-- RH.FUNCIONRIOS o nome-da-tabela qualificado pelo nome-do-esquema


SELECT COUNT(*) FROM RH.FUNCIONRIOS
-- Os nomes dos catlogos do sistema devem ser qualificados pelo seu
esquema, SYS
SELECT COUNT(*) FROM SYS.SYSCOLUMNS

nome-de-coluna-simples
O nome-de-coluna-simples utilizado para representar a coluna quando seu nome no
pode ser qualificado pelo nome-da-tabela ou pelo nome-da-correlao. Este o caso
quando a qualificao fixa, como na definio da coluna na instruo CREATE TABLE.

Sintaxe
IdentificadorSQL92

Exemplo
-- NOME_PAS um nome-de-coluna-simples
CREATE TABLE CONTINENTE (
NOME_PAS VARCHAR(26) NOT NULL PRIMARY KEY,
COD_ISO_PAS CHAR(2),
REGIO_PAS VARCHAR(26))

nome-do-sinnimo
O nome-do-sinnimo representa um sinnimo para a tabela ou a viso. O
nome-do-sinnimo pode ser qualificado pelo nome-do-esquema.

Sintaxe
[ nome-do-esquema. ] IdentificadorSQL92

nome-da-tabela
O nome-da-tabela representa a tabela. O nome-da-tabela pode ser qualificado pelo
nome-do-esquema.

Sintaxe
[ nome-do-esquema. ] IdentificadorSQL92

Exemplo
-- ENG.PROJETO um nome de tabela que inclui o nome-do-esquema
SELECT COUNT(*) FROM ENG.PROJETO

nome-da-viso
14
Direitos autorais reservados

O nome-da-viso representa uma tabela ou uma viso. O nome-da-viso pode ser


qualificado pelo nome-do-esquema.

Sintaxe
[ nome-do-esquema. ] IdentificadorSQL92

Exemplo
-- Esta uma viso qualificada pelo nome-do-esquema
SELECT COUNT(*) FROM RH.EMP_CURRICULUM

nome-do-ndice
O nome-do-ndice representa um ndice. Os ndices residem em esquemas, portanto
seus nomes podem ser qualificados pelo nome-do-esquema. Os ndices das tabelas do
sistema residem no esquema SYS.

Sintaxe
[ nome-do-esquema . ] IdentificadorSQL92

Exemplo
DROP INDEX APP.NDICE_ORIGEM;
-- NDICE_ORIGEM o nome-do-ndice sem o nome-do-esquema
CREATE INDEX NDICE_ORIGEM ON VOS (AEROPORTO_ORIGEM)

nome-da-restrio
Os nomes das restries no podem ser qualificados.

Sintaxe
IdentificadorSQL92

Exemplo
-- FK2_PAS o nome da restrio
CREATE TABLE MAPAS_DETALHADOS (
COD_ISO_PAS CHAR(2)
CONSTRAINT FK2_PAS REFERENCES PASES
)

nome-do-cursor
O nome-do-cursor faz referncia a um cursor. No existe nenhum comando na
linguagem SQL para atribuir nome a um cursor. Em vez disso, deve ser utilizada a API
do JDBC para atribuir nomes a cursores ou obter os nomes gerados pelo sistema. Para
obter mais informaes deve ser consultado o Guia do Desenvolvedor do Derby. Se for
atribudo nome a um cursor, poder ser feita referncia a este nome nas instrues SQL.

O nome-do-cursor no pode ser qualificado.

Sintaxe

15
Direitos autorais reservados

IdentificadorSQL92

Exemplo
stmt.executeUpdate("UPDATE SAMP.EQUIPES SET COMISS = " +
"COMISS + 20 " + "WHERE CURRENT OF " + ResultSet.getCursorName());

nome-do-gatilho
O nome-do-gatilho faz referncia a um gatilho criado pelo usurio.

Sintaxe
[ nome-do-esquema . ] IdentificadorSQL92

Exemplo
DROP TRIGGER GATILHO1

identificador-de-autorizao
Os nomes de usurio no sistema Derby so conhecidos por identificadores de
autorizao. O identificador de autorizao representa o nome do usurio, caso tenha
sido fornecido o nome do usurio na requisio de conexo. O esquema padro para o
usurio idntico ao identificador de autorizao. No sistema de autenticao pode
haver diferena entre letras maisculas e minsculas nos nomes dos usurios, mas no
h diferena entre letras maisculas e minsculas no sistema de autorizao do Derby, a
no ser que o nome esteja delimitado. Para obter mais informaes deve ser consultado
o Guia do Desenvolvedor do Derby.

Sintaxe
IdentificadorSQL92

Exemplo
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(
'derby.database.fullAccessUsers', 'Amber,FRED')

Instrues
Esta seo fornece pginas de manual tanto para as construes de alto nvel da
linguagem, como para partes desta. Por exemplo, a instruo CREATE INDEX uma
instruo de alto nvel que pode ser executada diretamente atravs da interface de
JDBC. Esta seo tambm inclui as clusulas, que no so instrues de alto nvel, e
no podem ser executadas diretamente, mas apenas como parte das instrues de alto
nvel. As clusulas ORDER BY e WHERE so exemplos deste tipo de clusula. Por fim,
esta seo tambm inclui algumas partes de instrues sintaticamente complexas
chamada de expresses como, por exemplo, ExpressoSeleo e SubconsultaTabela.
As clusulas e expresses possuem suas prprias pginas de manual para facilitar a
referncia.

A menos que esteja explicitamente declarado o contrrio, as instrues de alto nvel,


todas assinaladas com a palavra instruo, podem ser executadas, ou preparadas e
executadas, atravs das interfaces fornecidas pelo JDBC. Este manual indica se a
expresso pode ser executada como uma instruo de alto nvel.

As sees fornecem informaes gerais sobre a utilizao de instrues, e descries

16
Direitos autorais reservados

de instrues especficas.

Interao com o sistema de dependncias


O Derby acompanha internamente as dependncias das instrues preparadas, que so
instrues SQL pr-compiladas antes de serem executadas. So tipicamente preparadas
(pr-compiladas) uma vez, e executadas vrias vezes.

As instrues preparadas dependem de objetos do dicionrio, e de instrues


referenciadas pelas mesmas (Os objetos do dicionrio incluem tabelas, colunas,
restries, ndices, vises e gatilhos). A remoo ou modificao de objetos do dicionrio
ou de instrues que a instruo preparada depende a invalida internamente,
significando que o Derby vai tentar recompilar automaticamente a instruo quando esta
for executada. Se a recompilao da instruo no for bem-sucedida, o pedido de
execuo falhar. Entretanto, se for tomada alguma ao para restaurar a dependncia
quebrada (como a restaurao da tabela que falta), a instruo preparada poder ser
executada, porque o Derby ir recompil-la automaticamente no prximo pedido de
execuo.

As instrues dependem umas das outras; uma instruo UPDATE WHERE CURRENT
depende da instruo referenciada. Remover a instruo da qual esta depende, invalida
a instruo UPDATE WHERE CURRENT.

Alm disso, as instrues preparadas no permitem a execuo de certas instrues de


DDL quando existem conjuntos de resultados abertos para as mesmas.

As pginas do manual de cada instruo detalham quais aes invalidam a instruo,


caso esteja preparada.
Abaixo segue um exemplo utilizando a ferramenta ij do Derby:
ij> CREATE TABLE MINHA_TABELA (MINHA_COLUNA INT);
0 rows inserted/updated/deleted
ij> INSERT INTO MINHA_TABELA VALUES (1), (2), (3);
3 rows inserted/updated/deleted
-- este exemplo utiliza o comando prepare do ij,
-- que prepara a instruo
ij> prepare p1 AS 'INSERT INTO MINHA_TABELA VALUES (4)';
-- p1 depende de MINHA_TABELA;
ij> execute p1;
1 row inserted/updated/deleted
-- O Derby executa sem recompilar
ij> CREATE INDEX I1 ON MINHA_TABELA(MINHA_COLUNA);
0 rows inserted/updated/deleted
-- p1 est temporariamente invlido por causa do novo ndice
ij> execute p1;
1 row inserted/updated/deleted
-- O Derby recompila automaticamente e executa p1
ij> DROP TABLE MINHA_TABELA;
0 rows inserted/updated/deleted
-- O Derby permite remover a tabela
-- porque o conjunto de resultados de p1 est fechado,
-- entretanto a instruo p1 est temporariamente invlida
ij> CREATE TABLE MINHA_TABELA (MINHA_COLUNA INT);
0 rows inserted/updated/deleted
ij> INSERT INTO MINHA_TABELA VALUES (1), (2), (3);
3 rows inserted/updated/deleted
ij> execute p1;
1 row inserted/updated/deleted
-- Como p1 est invlida, o Derby tenta recompilar
-- antes de executar.
-- bem-sucedido e executa.
ij> DROP TABLE MINHA_TABELA;
0 rows inserted/updated/deleted
-- a instruo p1 agora est invlida,
-- e desta vez a tentativa de recompilar
-- na hora de executar vai falhar
ij> execute p1;
ERROR 42X05: Table/View 'MINHA_TABELA' does not exist.

17
Direitos autorais reservados

Instruo ALTER TABLE


A instruo ALTER TABLE permite:
adicionar coluna tabela
adicionar restrio tabela
remover da tabela uma restrio existente
aumentar o comprimento de coluna VARCHAR, CHAR VARYING e CHARACTER
VARYING
sobrepor o bloqueio no nvel de linha para a tabela (ou remover a sobreposio)

Sintaxe
ALTER TABLE nome-da-tabela
{
ADD COLUMN definio-da-coluna |
ADD CONSTRAINT clusula |
DROP { PRIMARY KEY | FOREIGN KEY nome-da-restrio | UNIQUE
nome-da-restrio |
CHECK nome-da-restrio | CONSTRAINT nome-da-restrio }
ALTER alterao-da-coluna |
LOCKSIZE { ROW | TABLE }
}

definio-da-coluna
nome-de-coluna-simplestipo-de-dado
[ restrio no nvel-de-coluna ]*
[ [ WITH ] DEFAULT {ExpressoConstante | NULL } ]

alterao-da-coluna
nome-da-coluna SET DATA TYPE VARCHAR(inteiro) |
nome-da-coluna SET INCREMENT BY constante-inteira

Na alterao-da-coluna, SET INCREMENT BY constante-inteira especifica o intervalo


entre valores consecutivos da coluna de identidade. O prximo valor a ser gerado para a
coluna de identidade ser determinado a partir do ltimo valor atribudo e o incremento a
ser aplicado. A coluna deve ter sido definida com o atributo IDENTITY.

ALTER TABLE no afeta nenhuma viso que faz referncia tabela sendo alterada. Isto
inclui as vises que possuem "*" na lista do SELECT. Estas vises devem ser removidas
e recriadas para que retornem a nova coluna.

Adio de colunas
A sintaxe para a definio-da-coluna de uma nova coluna a mesma que para a coluna
na instruo CREATE TABLE. Isto significa que pode ser colocada uma restrio de
coluna para a nova coluna na instruo ALTER TABLE ADD COLUMN. Entretanto,
somente pode ser adicionada uma coluna com a restrio NOT NULL a uma tabela
existente se for fornecido um valor padro; caso contrrio, lanada uma exceo ao
ser executada a instruo ALTER TABLE.

Assim como em CREATE TABLE, se a definio da coluna incluir uma restrio de


unicidade ou de chave primria, a coluna no poder conter valores nulos e, portanto,
tambm deve ser especificado o atributo NOT NULL (SQLState 42831).
Note: Se a tabela possuir um gatilho de UPDATE sem uma lista de colunas explcita,
adicionar uma coluna tabela adicionar esta coluna lista de colunas de atualizao
implcita sobre a qual o gatilho est definido, e todas as referncias a variveis de
transio sero invalidadas para que incluam a nova coluna.
Adio de restries
ALTER TABLE ADD CONSTRAINT adiciona restrio no nvel-de-tabela a uma tabela

18
Direitos autorais reservados
existente. Pode ser adicionado atravs de ALTER TABLE qualquer tipo de restrio no
nvel-de-tabela suportado. Existem as seguintes limitaes para adicionar restrio a
uma tabela existente:
Ao adicionar uma restrio de chave estrangeira ou de verificao a uma tabela
existente, o Derby verifica a tabela para ter certeza que as linhas existentes
satisfazem a restrio. Se alguma linha for invlida, o Derby lanar uma exceo
de instruo, e a restrio no ser adicionada.
Todas as colunas includas na chave primria devem conter dados no nulos e
serem nicas.
ALTER TABLE ADD UNIQUE e PRIMARY KEY dispem de um mtodo resumido
para definir uma chave primria formada por uma nica coluna. Se for especificado
PRIMARY KEY na definio da coluna C, o efeito ser o mesmo de especificar a
clusula PRIMARY KEY(C) como uma clusula em separado. A coluna no pode
conter valores nulos, portanto o atributo NOT NULL tambm deve ser especificado.

Para obter informaes sobre a sintaxe das restries deve ser consultada a Clusula
CONSTRAINT. Ao se adicionar restries com a sintaxe ALTER TABLE ADD
CONSTRAINT, deve ser utilizada a sintaxe para restrio no nvel-de-tabela.

Remoo de restries
ALTER TABLE DROP CONSTRAINT remove uma restrio de uma tabela existente.
Para remover uma restrio sem nome, deve ser especificado o nome gerado para a
restrio armazenado em SYS.SYSCONSTRAINTS na forma de um identificador
delimitado.

A remoo da restrio de chave primria, de unicidade ou de chave estrangeira remove


o ndice fsico que impe a restrio (tambm conhecido por ndice de apoio).

Modificao de colunas
A alterao-da-coluna permite alterar a coluna especificada das seguintes maneiras:
Aumentar o comprimento de uma coluna VARCHAR existente. Pode ser utilizado
CHARACTER VARYING ou CHAR VARYING como sinnimo para a palavra chave
VARCHAR.
Para aumentar o comprimento de uma coluna deste tipo, deve ser especificado o
tipo de dado e o novo tamanho aps o nome da coluna.

No permitido diminuir o tamanho ou mudar o tipo de dado. No permitido


aumentar o comprimento de uma coluna que faz parte de uma chave primria ou
chave de unicidade referenciada por uma restrio de chave estrangeira, ou que
seja parte de uma restrio de chave estrangeira.
Especificao do intervalo entre valores consecutivos da coluna de identidade.
Para definir o intervalo entre valores consecutivos da coluna de identidade deve ser
especificada uma constante-inteira. A coluna deve ter sido definida anteriormente
com o atributo IDENTITY (SQLState 42837). Caso existam linhas na tabela, os
valores na coluna para a qual o padro para SET INCREMENT foi adicionado no
mudam.

Definio de padro
Pode ser especificado um valor padro para a nova coluna. O valor padro o valor
inserido na coluna se no for especificado nenhum outro valor. Quando no
especificado explicitamente, o valor padro da coluna NULL. Se for especificado valor
padro para uma nova coluna, as linhas existentes na tabela recebero o valor padro
na nova coluna.

19
Direitos autorais reservados

Para obter mais informaes sobre valor padro deve ser consultada a Instruo
CREATE TABLE.

Alterao da granularidade do bloqueio da tabela


A clusula LOCKSIZE permite sobrepor o bloqueio no nvel-de-linha para uma
determinada tabela, se o sistema utilizar a definio padro de bloqueio no nvel-de-linha
(Se o sistema estiver definido com bloqueio no nvel-de-tabela, no ser possvel alterar
a granularidade do bloqueio, embora o Derby permita utilizar a clusula LOCKSIZE
nesta situao sem lanar uma exceo). Para sobrepor o bloqueio no nvel-de-linha de
uma determinada tabela, deve ser definido o bloqueio da tabela como TABLE. Se a
tabela tiver sido criada com a granularidade de bloqueio no nvel-de-tabela, o bloqueio
poder passar a ser no nvel-de-linha especificando ROW na clusula LOCKSIZE da
instruo ALTER TABLE. Para obter informaes sobre porque algumas vezes esta
alterao til, deve ser consultado o Ajuste do Derby.

Exemplos
-- Adicionar uma nova coluna com restrio no
-- nvel-de-coluna a uma tabela existente.
-- Se a tabela tiver alguma linha ser lanada uma exceo,
-- uma vez que a nova coluna ser inicializada com NULL
-- em todas as linhas da tabela.
ALTER TABLE CIDADES ADD COLUMN REGIO VARCHAR(26)
CONSTRAINT NOVA_RESTRIO CHECK (REGIO IS NOT NULL);
-- Adicionar uma restrio de unicidade a uma tabela existente.
-- Ser lanada uma exceo se forem encontradas chaves duplicadas.
ALTER TABLE SAMP.DEPARTAMENTOS
ADD CONSTRAINT NOVA_UNICIDADE UNIQUE (NUM_DEP);
-- Adicionar uma restrio de chave estrangeira
-- tabela cidades. Cada linha de cidades verificada
-- para ter certeza que satisfaz a restrio.
-- Se alguma linha no satisfizer a restrio, a
-- restrio no ser adicionada
ALTER TABLE CIDADES ADD CONSTRAINT FK_PASES
FOREIGN KEY (PAS) REFERENCES PASES (PAS);
-- Adicionar uma restrio de chave primria tabela.
-- Primeiro, criar a tabela.
CREATE TABLE ATIVIDADES (ID_CIDADE INT NOT NULL,
ESTAO CHAR(2), ATIVIDADE VARCHAR(32) NOT NULL);
-- No ser possvel adicionar esta restrio se as
-- colunas que compem a chave primria possurem
-- dados nulos ou valores duplicados.
ALTER TABLE ATIVIDADES ADD PRIMARY KEY (ID_CIDADE, ATIVIDADE);
-- Remover a restrio de chave primria da tabela cidades.
ALTER TABLE CIDADES DROP CONSTRAINT PK_CIDADES;
-- Remover a restrio de chave estrangeira da tabela cidades.
ALTER TABLE CIDADES DROP CONSTRAINT FK_PASES;
-- Adicionar a coluna NUM_DEP com valor padro igual a 1.
ALTER TABLE SAMP.ATIV_EMP ADD COLUMN NUM_DEP INT DEFAULT 1;
-- Aumentar o comprimento da coluna VARCHAR.
ALTER TABLE SAMP.EMP_FOTO ALTER FORMATO_FOTO SET DATA TYPE VARCHAR(30);
-- Alterar a granularidade do bloqueio da tabela.
ALTER TABLE SAMP.VENDAS LOCKSIZE TABLE;

Resultados
A instruo ALTER TABLE faz com que todas as instrues que dependem da tabela
sendo alterada sejam recompiladas antes de sua prxima execuo. A instruo ALTER
TABLE no permitida caso existam cursores abertos fazendo referncia tabela sendo
alterada.

Instrues CREATE
20
Direitos autorais reservados

As instrues CREATE so utilizadas com funes, ndices, procedimentos, esquemas,


sinnimos, tabelas, gatilhos e vises.
Instruo CREATE FUNCTION
A instruo CREATE FUNCTION permite criar funes Java que podem ser utilizadas
em expresses.

Sintaxe
CREATE FUNCTION nome-da-funo ( [ parmetro-da-funo
[, parmetro-da-funo] ] * ) RETURNS tipo-de-dado [
elemento-da-funo ] *

nome-da-funo
[ nome-do-esquema. ] IdentificadorSQL92

Se o nome-do-esquema no for fornecido, o esquema corrente se tornar o esquema


padro. Se for especificado um nome de procedimento qualificado, o nome do esquema
no poder comear por SYS.

parmetro-da-funo
[ nome_do_parmetro ] tipo-de-dado

O nome_do_parmetro deve ser nico na funo.

A sintaxe do tipo-de-dado est descrita em Tipos de dado.


Note: Os tipos-de-dado longos, como LONG VARCHAR, LONG VARCHAR FOR BIT
DATA, CLOB e BLOB, no so permitidos como parmetros da instruo CREATE
FUNCTION.
elemento-da-funo
{
| LANGUAGE { JAVA }
| EXTERNAL NAME cadeia-de-caracteres
| PARAMETER STYLE JAVA
| { NO SQL | CONTAINS SQL | READS SQL DATA }
| { RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT }
}

LANGUAGE
JAVA- o gerenciador de banco de dados chama a funo como um mtodo esttico
pblico de uma classe Java.

EXTERNAL NAME cadeia-de-caracteres


A cadeia-de-caracteres descreve o mtodo Java a ser chamado quando a funo for
executada, e possui a seguinte forma:
nome-da-classe.nome-do-mtodo
O EXTERNAL NAME (nome externo) no pode conter espaos indevidos.

PARAMETER STYLE
JAVA - A funo utiliza uma conveno de passagem de parmetros em conformidade
com a linguagem Java e com a especificao de rotinas SQL. Os parmetros INOUT e
OUT so passados como matrizes de uma nica entrada para facilitar o retorno de
valores. Os conjuntos de resultados so retornados atravs de parmetros adicionais
para um mtodo Java do tipo java.sql.ResultSet[] passados como matrizes de uma nica
entrada.

21
Direitos autorais reservados

O Derby no suporta tipos de coluna longos (por exemplo, LONG VARCHAR, BLOB,
etc.). Ocasiona erro tentar utilizar um destes tipos de coluna longos.

NO SQL, CONTAINS SQL, READS SQL DATA


Indica se a funo emite instrues SQL e, se o fizer, de que tipo.
CONTAINS SQL
Indica que podem ser executadas pela funo instrues SQL que no lem nem
modificam dados SQL. As instrues no suportadas por qualquer funo retornam
um erro diferente.
NO SQL
Indica que a funo no pode executar nenhuma instruo SQL.
READS SQL DATA
Indica que podem ser includas na funo instrues SQL que no modificam dados
SQL. As instrues no suportadas por qualquer funo retornam um erro diferente.
Este o valor padro.
RETURNS NULL ON NULL INPUT ou CALLED ON NULL INPUT
Especifica se a funo ser chamada quando algum de seus argumentos de entrada for
nulo.
RETURNS NULL ON NULL INPUT
Especifica que a funo no ser chamada quando o valor de algum de seus
argumentos de entrada for nulo. O resultado ser o valor nulo.
CALLED ON NULL INPUT
Especifica que a funo ser chamada quando o valor de algum de seus argumentos
de entrada for nulo. Esta especificao significa que a funo deve ser codificada
para testar nulos nos valores dos argumentos. A funo poder retornar um valor
nulo, ou no nulo. Esta a definio padro.

Os elementos da funo podem estar em qualquer ordem, mas cada tipo de elemento s
pode aparecer uma vez. A definio da funo deve conter estes elementos:
LANGUAGE
PARAMETER STYLE
EXTERNAL NAME

Exemplo
CREATE FUNCTION rad_graus(radianos DOUBLE) RETURNS DOUBLE
PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA
EXTERNAL NAME 'java.lang.Math.toDegrees'
Instruo CREATE INDEX

A instruo CREATE INDEX cria um ndice em uma tabela. Os ndices podem incluir
uma ou mais colunas da tabela.

Sintaxe
CREATE [UNIQUE] INDEX nome-do-ndice
ON nome-da-tabela ( nome-de-coluna-simples [ ASC | DESC ]
[ , nome-de-coluna-simples [ ASC | DESC ]] * )

No Derby, o nmero mximo de colunas para chave do ndice 16.

O nome do ndice no pode ter mais que 128 caracteres.

O nome da coluna no pode aparecer mais de uma vez na mesma instruo CREATE
INDEX. Entretanto, ndices diferentes podem incluir a mesma coluna.

O Derby pode utilizar os ndices para melhorar o desempenho das instrues de


manipulao de dados (consulte o Ajuste do Derby). Alm disso, os ndices UNIQUE

22
Direitos autorais reservados
fornecem uma maneira de verificar a integridade dos dados.

Os nomes dos ndices so nicos no esquema (Alguns sistemas de banco de dados


permitem que tabelas diferentes no mesmo esquema possuam ndices com o mesmo
nome, mas o Derby no permite). assumido que a tabela e o ndice esto no mesmo
esquema, se o nome do esquema for especificado para um dos nomes, mas no para o
outro. Se o nome do esquema for especificado tanto para o ndice quanto para a tabela,
ser lanada uma exceo se os nomes dos esquemas no forem o mesmo. Se no for
especificado o nome do esquema nem para a tabela e nem para o ndice, ser utilizado
o esquema corrente.

O Derby utiliza, por padro, a ordem ascendente de cada coluna para criar o ndice.
Especificar ASC aps o nome da coluna no modifica o comportamento padro. A
palavra chave DESC aps o nome da coluna faz com que o Derby utilize a ordem
descendente da coluna para criar o ndice. Utilizar a ordem descendente para uma
coluna pode ajudar a melhorar o desempenho dos comandos que requerem resultados
em uma ordem de classificao mista ou na ordem descendente, e para os comandos
que selecionam o valor mnimo ou mximo de uma coluna indexada.

Se for especificado um nome de ndice qualificado, o nome do esquema no poder


comear por SYS.

ndices e restries
As restries de unicidade, de chave primria, e de chave estrangeira, geram ndices
que impem, ou "apoiam", a restrio (por isso, algumas vezes so chamados de
ndices de apoio). Se uma coluna, ou conjunto de colunas, tiver uma restrio UNIQUE
ou PRIMARY KEY aplicada, no ser permitido criar ndice com estas colunas. O Derby
j ter criado um ndice com nome gerado pelo sistema. Os nomes gerados pelo sistema
para os ndices que apoiam as restries so facilmente encontrados consultando as
tabelas do sistema, se for especificado o nome da restrio. Por exemplo, para descobrir
o nome do ndice que apoia a restrio PK_VOS:

SELECT CONGLOMERATENAME FROM SYS.SYSCONGLOMERATES,


SYS.SYSCONSTRAINTS WHERE
SYS.SYSCONGLOMERATES.TABLEID = SYSCONSTRAINTS.TABLEID
AND CONSTRAINTNAME = 'PK_VOS'

CREATE INDEX NDICE_ORIGEM ON VOS(AEROPORTO_ORIGEM);


-- valores monetrios so geralmente ordenados do maior para o menor,
-- portanto o ndice criado na ordem descendente
CREATE INDEX PAG_DESC ON SAMP.EMPREGADOS (SALRIO);
-- utilizar um tamanho de pgina maior para o ndice
CALL
SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.storage.pageSize','8192');
CREATE INDEX IDX_VENDAS ON SAMP.VENDAS (VENDAS);
CALL
SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.storage.pageSize',NULL);

Tamanho da pgina e comprimento da chave


Note: Em um ndice, o tamanho das colunas chave deve ser igual ou menor que a
metade do tamanho da pgina. Se o comprimento das colunas chave, de uma linha
existente na tabela, for maior que a metade do tamanho da pgina do ndice, a criao
do ndice para a tabela com estas colunas chave falhar. Este erro somente ocorre ao
criar o ndice, quando uma linha existente na tabela no respeita este critrio. Aps o
ndice ser criado, as inseres falham se o tamanho da chave associada no respeitar
este critrio.

23
Direitos autorais reservados
Sistema de dependncia de instrues
As instrues preparadas envolvendo SELECT, INSERT, UPDATE, UPDATE WHERE
CURRENT, DELETE e DELETE WHERE CURRENT na tabela referenciada pela
instruo CREATE INDEX so invalidadas quando o ndice criado. Os cursores
abertos nas tabelas no so afetados.
Instruo CREATE PROCEDURE

A instruo CREATE PROCEDURE permite criar procedimentos armazenados em Java,


que podem ser chamados utilizando a instruo CALL PROCEDURE.

Sintaxe
CREATE PROCEDURE nome-do-procedimento ( [ parmetro-do-procedimento
[, parmetro-do-procedimento] ] * )
[ elemento-do-procedimento ] *

nome-do-procedimento
[ nome-do-esquema. ] IdentificadorSQL92

Se o nome-do-esquema no for fornecido, o esquema corrente ser o esquema padro.


Se for especificado um nome de procedimento qualificado, o nome do esquema no
poder comear por SYS.

parmetro-do-procedimento
[ { IN | OUT | INOUT } ] [ nome-do-parmetro ] tipo-de-dado

O valor padro para o parmetro IN. O nome-do-parmetro deve ser nico no


procedimento.

A sintaxe do tipo-de-dado est descrita em Tipos de dado.


Note: Os tipos-de-dado longos, como LONG VARCHAR, LONG VARCHAR FOR BIT
DATA, CLOB e BLOB, no podem ser usados como parmetros nas instrues CREATE
PROCEDURE.
elemento-do-procedimento
{
| [ DYNAMIC ] RESULT SETS INTEGER
| LANGUAGE { JAVA }
| EXTERNAL NAME cadeia-de-caracteres
| PARAMETER STYLE JAVA
| { NO SQL | MODIFIES SQL DATA | CONTAINS SQL | READS SQL DATA }
}

DYNAMIC RESULT SETS integer


Indica o limite superior estimado de conjuntos de resultados retornados pelo
procedimento. O padro sem (zero) conjuntos de resultados dinmicos.

LANGUAGE
JAVA - o gerenciador de banco de dados chama o procedimento como um mtodo
esttico pblico de uma classe Java.

EXTERNAL NAME cadeia-de-caracteres


A cadeia-de-caracteres descreve o mtodo Java a ser chamado quando o procedimento
for executado, e possui a seguinte forma:
nome_da_classe.nome_do_mtodo

24
Direitos autorais reservados
O nome externo no pode conter espaos.

PARAMETER STYLE
JAVA - O procedimento utiliza uma conveno de passagem de parmetros em
conformidade com a linguagem Java e com a especificao de rotinas SQL. Os
parmetros INOUT e OUT so passados como matrizes de uma nica entrada para
facilitar o retorno de valores. Os conjuntos de resultados so retornados atravs de
parmetros adicionais para um mtodo Java do tipo java.sql.ResultSet [] que so
passados como matrizes de uma nica entrada.

O Derby no suporta tipos de coluna longos (por exemplo, LONG VARCHAR, BLOB,
etc.). Ocasiona erro tentar utilizar um destes tipos de coluna longos.

NO SQL, CONTAINS SQL, READS SQL DATA, MODIFIES SQL DATA


Indica se o procedimento armazenado emite instrues SQL e, se o fizer, de que tipo.
CONTAINS SQL
Indica que podem ser executadas pelo procedimento armazenado instrues SQL
que no lem nem modificam dados SQL. As instrues no suportadas por
qualquer procedimento armazenado retornam um erro diferente. O valor padro
MODIFIES SQL DATA.
NO SQL
Indica que o procedimento armazenado no pode executar nenhuma instruo SQL.
READS SQL DATA
Indica que podem ser includas no procedimento armazenado algumas instrues
SQL que no modificam dados SQL. As instrues no suportadas por qualquer
procedimento armazenado retornam um erro diferente.
MODIFIES SQL DATA
Indica que o procedimento armazenado pode executar qualquer instruo SQL,
exceto as instrues no suportadas por procedimentos armazenados.
Os elementos do procedimento podem estar em qualquer ordem, mas cada tipo de
elemento pode aparecer somente uma nica vez. A definio do procedimento deve
conter os seguintes elementos:
LANGUAGE
PARAMETER STYLE
EXTERNAL NAME

Exemplo
CREATE PROCEDURE VENDAS.RENDIMENTO_TOTAL(IN V_MS INTEGER,
IN V_ANO INTEGER, OUT TOTAL DECIMAL(10,2))
PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME
'com.acme.vendas.calculaRendimentoPorMes'
Instruo CREATE SCHEMA

O esquema uma forma de agrupar logicamente objetos em uma nica coleo, e


fornecer um espao de nomes nico para os objetos.

Sintaxe
CREATE SCHEMA nome-do-esquema

A instruo CREATE SCHEMA utilizada para criar esquemas. O nome do esquema


no pode possuir mais de 128 caracteres. Os nomes dos esquemas devem ser nicos
no banco de dados.

-- Criar um esquema para as tabelas relacionadas com os empregados

25
Direitos autorais reservados

CREATE SCHEMA EMP;


-- Criar um esquema para as tabelas relacionadas com as linhas areas
CREATE SCHEMA VOS
-- Criar uma tabela chamada "disponibilidade" em cada esquema
CREATE TABLE VOS.DISPONIBILIDADE (
ID_VO CHAR(6) NOT NULL,
NUM_SEGMENTO INT NOT NULL,
DATA_VO DATE NOT NULL,
ASSENTOS_ECONMICOS_OCUPADOS INT,
ASSENTOS_EXECUTIVOS_OCUPADOS INT,
ASSENTOS_PRIMEIRA_CLASSE_OCUPADOS INT,
CONSTRAINT PK_VOS_DISPONIBILIDADE
PRIMARY KEY (ID_VO, NUM_SEGMENTO, DATA_VO));
CREATE TABLE EMP.DISPONIBILIDADE (
ID_HOTEL INT NOT NULL,
DATA_RESERVA DATE NOT NULL,
QUARTOS_OCUPADOS INT,
CONSTRAINT PK_HOTEL_DISPONIBILIDADE PRIMARY KEY (ID_HOTEL,
DATA_RESERVA));
Instruo CREATE SYNONYM

A instruo CREATE SYNONYM utilizada para fornecer um nome alternativo para uma
tabela ou viso presente no mesmo esquema ou em outro esquema. Tambm podem
ser criados sinnimos para outros sinnimos, resultando em sinnimos aninhados. O
sinnimo pode ser utilizado no lugar do nome qualificado original da tabela ou da viso,
nas instrues SELECT, INSERT, UPDATE, DELETE e LOCK TABLE. Pode ser criado
um sinnimo para uma tabela ou uma viso que no existe, mas a tabela ou viso de
destino dever existir antes do sinnimo poder ser utilizado.

Os sinnimos compartilham o mesmo espao de nomes das tabelas e vises. No pode


ser criado um sinnimo com o mesmo nome de uma tabela que j existe no mesmo
esquema. De maneira semelhante, no pode ser criada uma tabela ou viso com nome
correspondente a um sinnimo j existente.

O sinnimo pode ser definido para uma tabela ou viso que no existe quando o
sinnimo criado. Se a tabela ou viso no existir, ser recebida uma mensagem de
advertncia (SQLState 01522). O objeto referenciado dever existir quando o sinnimo
for utilizado em uma instruo da DML.

Pode ser criado sinnimo aninhado (um sinnimo para outro sinnimo), mas qualquer
tentativa de criar um sinnimo que resulte em uma referncia circular retorna uma
mensagem de erro (SQLState 42916).

No podem ser definidos sinnimos nos esquemas do sistema. Todos os esquemas


comeando por 'SYS' so considerados esquemas do sistema, e so reservados pelo
Derby.

No pode ser definido um sinnimo para uma tabela temporria. A tentativa de definir
um sinnimo para uma tabela temporria retorna uma mensagem de erro (SQLState
XCL51).

Sintaxe
CREATE SYNONYM nome-do-sinnimo FOR { nome-da-viso | nome-da-tabela }
Na instruo, nome-do-sinnimo representa o nome do sinnimo sendo atribudo
tabela ou viso de destino, enquanto nome-da-viso e nome-da-tabela representam o
nome original da tabela ou viso de destino.
Exemplo
CREATE SYNONYM SAMP.T1 FOR SAMP.TABELA_COM_NOME_COMPRIDO

26
Direitos autorais reservados
Instruo CREATE TABLE

A instruo CREATE TABLE cria uma tabela. As tabelas contm colunas e restries,
que so regras que os dados devem estar em conformidade. A restrio no
nvel-de-tabela especifica uma coluna ou vrias colunas. As colunas possuem um tipo de
dado e podem especificar restries de coluna (restries no nvel-de-coluna).

Para obter informaes sobre as restries deve ser consultada a Clusula


CONSTRAINT.

Pode ser especificado um valor padro para a coluna. O valor padro o valor a ser
inserido na coluna quando no especificado nenhum outro valor. Quando no
especificado explicitamente, o valor padro para a coluna NULL. Consulte Valor
padro da coluna.

Podem ser especificadas propriedades de armazenamento, como o tamanho da pgina


para a tabela, chamando o procedimento do sistema
SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY.

Se for especificado um nome de tabela qualificado, o nome do esquema no poder


comear por SYS.

Sintaxe
CREATE TABLE nome-da-tabela
( {definio-da-coluna | restrio no nvel-de-tabela}
[ , {definio-da-coluna | restrio no nvel-de-tabela} ] * )

Exemplos
CREATE TABLE DISPONIBILIDADE_HOTEL (
ID_HOTEL INT NOT NULL,
DATA_RESERVA DATE NOT NULL,
QUARTOS_RESERVADOS INT DEFAULT 0,
PRIMARY KEY (ID_HOTEL, DATA_RESERVA));
-- A definio de chave primria no nvel-de-tabela permite
-- incluir duas colunas na definio da chave primria
PRIMARY KEY (ID_HOTEL, DATA_RESERVA))
-- Atribuir um atributo de coluna de identidade a uma coluna INTEGER,
-- e tambm definir uma restrio de chave primria na coluna
CREATE TABLE PESSOAS (
ID_PESSOA INT NOT NULL GENERATED ALWAYS AS IDENTITY
CONSTRAINT PK_PESSOAS PRIMARY KEY,
PESSOA VARCHAR(26));
-- Atribuir um atributo de coluna de identidade a uma coluna SMALLINT
-- com valor inicial igual a 5 e valor do incremento igual a 5.
CREATE TABLE GRUPOS (
ID_GRUPO SMALLINT NOT NULL
GENERATED ALWAYS AS IDENTITY (START WITH 5, INCREMENT BY 5),
ENDEREO VARCHAR(100),
TEL VARCHAR(15));
Note: Para obter mais exemplos de instrues CREATE TABLE utilizando vrias
restries deve ser consultada a Clusula CONSTRAINT.
definio-da-coluna:

nome-de-coluna-simplestipo-de-dado
[ restrio no nvel-de-coluna ]*
[ [ WITH ] DEFAULT { expresso-constante | NULL }
|especificao-de-coluna-gerada ]
[ restrio no nvel-de-coluna ]*

27
Direitos autorais reservados

A sintaxe do tipo-de-dado est descrita em Tipos de dado.

As sintaxes de restrio no nvel-de-coluna e restrio no nvel-de-tabela esto descritas


na Clusula CONSTRAINT.

Valor padro da coluna


Na definio do valor padro, a expresso-constante uma expresso que no faz
referncia a nenhuma tabela. Pode incluir constantes, registros especiais de data e hora,
esquemas correntes, usurios e nulo.
especificao-de-coluna-gerada:

[ GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY


[ ( START WITH ConstanteInteira
[ ,INCREMENT BY ConstanteInteira] ) ] ] ]

Atributos da coluna de identidade


Nas colunas SMALLINT, INT e BIGINT com atributo de identidade, o Derby atribui
automaticamente valores inteiros incrementados para a coluna. Os atributos da coluna
de identidade se comportam como os outros valores padro, ou seja, quando a instruo
de insero no especifica o valor para a coluna, o Derby fornece automaticamente o
valor. Entretanto, o valor no uma constante; o Derby incrementa automaticamente o
valor padro na hora da insero.
A palavra chave IDENTITY somente pode ser especificada quando o tipo de dado
associado coluna for um dos seguintes tipos inteiros exatos.
SMALLINT
INT
BIGINT
Existem dois tipos de coluna de identidade no Derby: aquelas que so sempre geradas
(GENERATED ALWAYS), e aquelas que so geradas por padro (GENERATED BY
DEFAULT).
GENERATED ALWAYS
Uma coluna de identidade que sempre gerada, incrementa o valor padro em todas
as inseres e armazena o valor incrementado na coluna. Ao contrrio dos outros
valores padro, no possvel inserir diretamente um valor ou atualizar uma coluna
de identidade que sempre gerada. Por isso, deve ser especificada a palavra chave
DEFAULT ao fazer insero na coluna de identidade, ou no incluir a coluna de
identidade na lista de colunas na insero. Por exemplo:
CREATE TABLE SAUDAES (
I INT GENERATED ALWAYS AS IDENTITY,
CH CHAR(50));
INSERT INTO SAUDAES VALUES (DEFAULT, 'al');
INSERT INTO SAUDAES(CH) VALUES ('bom dia');
Os valores gerados automaticamente na coluna de identidade GENERATED
ALWAYS so nicos. A criao de uma coluna de identidade no cria um ndice para
a coluna.
GENERATED BY DEFAULT
Uma coluna de identidade gerada por padro, somente incrementa e utiliza o valor
padro nas inseres quando no fornecido nenhum valor explcito. Ao contrrio da
colunas sempre geradas, pode ser especificado um valor na instruo de insero a
ser utilizado no lugar do valor padro gerado.
Para utilizar o valor gerado, deve ser especificada a palavra chave DEFAULT ao
inserir na coluna de identidade, ou no incluir a coluna de identidade na lista de
colunas da insero. Para especificar um valor, este deve ser includo na instruo
de insero. Por exemplo:

28
Direitos autorais reservados

CREATE TABLE SAUDAES (


I INT GENERATED BY DEFAULT AS IDENTITY,
CH CHAR(50));
-- especificar o valor "1":
INSERT INTO SAUDAES VALUES (1, 'ol');
-- usar o padro gerado
INSERT INTO SAUDAES VALUES (DEFAULT, 'salut');
-- usar o padro gerado
INSERT INTO SAUDAES(CH) VALUES ('bonjour');
Deve ser observado que ao contrrio das colunas GENERATED ALWAYS, as
colunas GENERATED BY DEFAULT no garantem unicidade. Portanto, no exemplo
acima as linhas ol e salut possuem o valor de identidade igual a "1", porque a
coluna gerada comea por "1" e o valor especificado pelo usurio tambm "1". Para
no permitir duplicidade, especialmente ao carregar ou importar dados, a tabela deve
ser criada utilizando um valor para START WITH correspondente ao primeiro valor
de identidade que o sistema deve atribuir. Para verificar esta condio e no
permiti-la, pode ser utilizada uma chave primria ou restrio de unicidade na coluna
de identidade GENERATED BY DEFAULT.

Por padro, o valor inicial da coluna de identidade 1, e o valor do incremento 1.


Podem ser especificados valores diferentes do padro para o valor inicial e para o
incremento ao definir a coluna utilizando as palavras chave STARTS WITH e
INCREMENT BY. Se for especificado um nmero negativo para o valor do incremento, o
Derbydecrementar o valor a cada insero. Se o valor for 0, ou positivo, o Derby
incrementar o valor a cada insero.
Os valores mximos e mnimos permitidos nas colunas de identidade so determinados
pelo tipo de dado da coluna. A tentativa de inserir um valor fora da faixa de valores
suportados pelo tipo de dado lana uma exceo.
Tabela 1. Valores mximos e mnimos para colunas com especificao de coluna
gerada

Tipo de dado Valor mximo Valor mnimo


SMALLINT 32.767 (java.lang.Short.MAX_VALUE) -32.768 (java.lang.Short.MIN_VALUE)
INT 2.147.483.647 -2.147.483.648
(java.lang.Integer.MAX_VALUE) (java.lang.Integer.MIN_VALUE)
BIGINT 9.223.372.036.854.775.807 -9.223.372.036.854.775.808
(java.lang.Long.MAX_VALUE) (java.lang.Long.MIN_VALUE)

Os valores gerados automaticamente na coluna de identidade so nicos. Deve ser


utilizada uma restrio de chave primria ou de unicidade para garantir a unicidade. A
criao da coluna de identidade no cria um ndice para a coluna.

A funo IDENTITY_VAL_LOCAL uma funo no determinstica que retorna o valor


atribudo mais recentemente a uma coluna de identidade. Consulte
IDENTITY_VAL_LOCAL para obter mais informaes.
Note: Deve ser especificado o nome do esquema, da tabela e da coluna utilizando letras
maisculas e minsculas conforme os nomes estejam armazenados nas tabelas do
sistema -- ou seja, todas as letras em maisculo, a menos que tenham sido utilizados
identificadores delimitados para criar estes objetos no banco de dados.
O Derby mantm o ltimo valor incrementado para a coluna no cache. Tambm
armazena o prximo valor incrementado para a coluna no disco na coluna
AUTOINCREMENTVALUE da tabela do sistema SYS.SYSCOLUMNS. Desfazer a
transao no desfaz este valor, portanto transaes desfeitas podem deixar "espaos"
nos valores inseridos automaticamente na coluna de identidade. O Derby se comporta
desta maneira para evitar bloqueio na linha de SYS.SYSCOLUMNS pela durao da

29
Direitos autorais reservados
transao, e para manter a simultaneidade alta.

Quando acontece uma insero em uma instruo-SQL-engatilhada, o valor inserido


pela instruo-SQL-engatilhada na coluna de identidade disponvel a partir de
ConnectionInfo somente dentro do cdigo do gatilho. O cdigo do gatilho tambm pode
ver o valor inserido pela instruo que fez o gatilho disparar. Entretanto, a instruo que
fez o gatilho disparar no pode ver o valor inserido pela instruo-SQL-engatilhada na
coluna de identidade. Da mesma maneira, os gatilhos podem ser aninhados (ou
recursivos). Uma instruo SQL pode fazer o gatilho T1 disparar. T1, por sua vez,
executa uma instruo SQL que faz o gatilho T2 disparar. Se tanto T1 quanto T2
inserem linhas em uma tabela que faz o Derby inserir em uma coluna de identidade, o
gatilho T1 no poder ver o valor produzido pela insero feita por T2, mas T2 poder
ver o valor produzido pela insero feita por T1. Cada nvel de aninhamento pode ver os
valores incrementados gerados por si prprio e pelos nveis de aninhamento anteriores,
por todo o percurso at a instruo SQL de nvel superior que deu incio aos gatilhos
recursivos. Somente podem existir 16 nveis de recursividade de gatilho.

Exemplo
CREATE TABLE SAUDAES (
I INT GENERATED BY DEFAULT AS IDENTITY (START WITH 2, INCREMENT BY
1),
CH CHAR(50));
-- especificar o valor "1":
INSERT INTO SAUDAES VALUES (1, 'ol');
-- usar o valor gerado
INSERT INTO SAUDAES VALUES (DEFAULT, 'salut');
-- usar o valor gerado
INSERT INTO SAUDAES(CH) VALUES ('bonjour');
Instruo CREATE TRIGGER

O gatilho define um conjunto de aes a serem executadas quando ocorre um evento de


banco de dados em uma determinada tabela. O evento de banco de dados uma
operao de excluso, insero ou de atualizao. Por exemplo, se for definido um
gatilho para excluso em uma determinada tabela, a ao do gatilho ocorre sempre que
se remove uma ou mais linhas da tabela.

Junto com as restries, os gatilhos podem ajudar a impor regras de integridade com
aes como excluses ou atualizaes em cascata. Os gatilhos tambm podem realizar
vrias funes como emitir alertas, atualizar outras tabelas, enviar e-mail, e outras aes
teis.

Pode ser definido qualquer nmero de gatilhos para uma nica tabela, inclusive vrios
gatilhos para a mesma tabela para o mesmo evento.

Pode ser criado gatilho em qualquer esquema, exceto os comeados por SYS. O gatilho
no precisa residir no mesmo esquema da tabela para a qual definido.

Se for especificado um nome de gatilho qualificado, o nome do esquema no poder


comear por SYS.

Sintaxe
CREATE TRIGGER nome-do-gatilho
{ AFTER | NO CASCADE BEFORE }
{ INSERT | DELETE | UPDATE } [ OF nome-da-coluna [, nome-da-coluna]* ]
ON nome-da-tabela
[ ClusulaReferncia ]
FOR EACH { ROW | STATEMENT } MODE DB2SQL
Instruo-SQL-engatilhada

Antes ou depois: quando os gatilhos disparam


Os gatilhos so definidos para BEFORE (antes) ou AFTER (depois).

30
Direitos autorais reservados
Os gatilhos BEFORE disparam antes das modificaes da instruo serem
aplicadas, e antes de qualquer restrio ser aplicada. Os gatilhos para antes
podem ser tanto de linha quanto de instruo (consulte Gatilhos de instruo
versus gatilhos de linha).
Os gatilhos AFTER disparam aps todas as restries terem sido satisfeitas, e
aps todas as alteraes terem sido aplicadas tabela de destino. Os gatilhos
AFTER podem ser tanto de linha quanto de instruo (consulte Gatilhos de
instruo versus gatilhos de linha).

Insero, excluso e atualizao: o que faz o gatilho disparar


O gatilho disparado por um dos seguintes eventos do banco de dados, dependendo de
como foi definido (consulte Sintaxe acima):
INSERT
UPDATE
DELETE

Pode ser definido qualquer nmero de gatilhos para um determinado evento em uma
determinada tabela. No caso de gatilho para atualizao podem ser especificadas as
colunas.

Referncia a valores antigos e novos: a clusula de referncia


Muitas instrues-SQL-engatilhadas necessitam fazer referncia aos dados que esto
sendo alterados no momento pelo evento de banco de dados que causou o disparo do
gatilho. A instruo-SQL-engatilhada pode necessitar fazer referncia aos valores novos
(ps-alterao ou "aps").

O Derby fornece vrias maneiras para fazer referncia aos dados que esto sendo
alterados no momento pelo evento do banco de dados que fez o gatilho disparar. Os
dados alterados podem ser referenciados pela instruo-SQL-engatilhada utilizando
variveis de transio ou tabelas de transio. A clusula de referncia permite o
fornecimento do nome da correlao ou alis para estas variveis de transio
especificando OLD/NEW AS nome-da-correlao.
Por exemplo, se for adicionada a seguinte clusula definio do gatilho:
REFERENCING OLD AS LINHA_APAGADA

pode-se ento fazer referncia a este nome de correlao na instruo-SQL-engatilhada:


DELETE FROM DISPONIBILIDADE_HOTEL WHERE ID_HOTEL = LINHA_APAGADA.ID_HOTEL

As variveis de transio OLD e NEW so mapeadas a um java.sql.ResultSet de uma


nica linha.
Note: Somente os gatilhos de linha (consulte Gatilhos de instruo versus gatilhos de
linha) podem utilizar variveis de transio. Os gatilhos de linha para INSERT no
podem fazer referncia linha antiga. Os gatilhos de linha para DELETE no podem
fazer referncia linha nova.

Para os gatilhos de instruo, as tabelas de transio servem como identificador de


tabela para a instruo-SQL-engatilhada ou para a qualificao do gatilho. A clusula de
referncia permite fornecer um nome de correlao ou alis para estas tabelas de
transio especificando OLD_TABLE/NEW_TABLE AS nome-da-correlao
Por exemplo:
REFERENCING OLD_TABLE AS HOTIS_EXCLUDOS

permite utilizar este novo identificador (HOTIS_EXCLUDOS) na


instruo-SQL-engatilhada:

31
Direitos autorais reservados

DELETE FROM DISPONIBILIDADE_HOTEL WHERE ID_HOTEL IN


(SELECT ID_HOTEL FROM HOTIS_EXCLUDOS)

As tabelas de transio antiga e nova so mapeadas a um java.sql.ResultSet com


cardinalidade equivalente ao nmero de linhas afetadas pelo evento do gatilho.
Note: Somente os gatilhos de instruo (consulte Gatilhos de instruo versus gatilhos
de linha) podem utilizar tabelas de transio. Os gatilhos para a instruo INSERT no
podem fazer referncia tabela OLD. Os gatilhos para a instruo DELETE no podem
fazer referncia tabela NEW.

A clusula REFERENCING pode designar apenas uma correlao ou identificador para


novo, e apenas uma correlao ou identificador para antigo. Os gatilhos de linha no
podem designar um identificador para a tabela de transio, e os gatilhos de instruo
no podem designar uma correlao para as variveis de transio.

Gatilhos de instruo versus gatilhos de linha


Deve ser especificado se o gatilho um gatilho de instruo ou um gatilho de linha:
gatilho de instruo
O gatilho de instruo dispara uma vez por evento de gatilho, independentemente
de alguma linha ser modificada pelo evento de insero, atualizao ou excluso.
gatilho de linha
O gatilho de linha dispara uma vez para cada linha afetada pelo evento de gatilho.
Se nenhuma linha for afetada, o gatilho no vai disparar.
Note: Uma atualizao que define o valor da coluna como o valor originalmente contido
(por exemplo, UPDATE T SET C = C) faz com que o gatilho de linha dispare, embora o
valor da coluna seja o mesmo que era antes do evento de gatilho.

Instruo-SQL-engatilhada
A ao definida pelo gatilho chamada de instruo-SQL-engatilhada (na Sintaxe
acima, veja a ltima linha). Possui as seguintes limitaes:
No pode conter parmetros dinmicos (?).
No pode criar, alterar ou remover a tabela para a qual o gatilho est definido.
No pode adicionar ou remover um ndice na tabela para a qual o gatilho est
definido.
No pode adicionar ou remover um gatilho na tabela para a qual o gatilho est
definido.
No pode efetivar ou desfazer a transao corrente, ou mudar o nvel de
isolamento.
No pode executar a instruo CALL.
Os gatilhos para antes no podem possuir instrues INSERT, UPDATE ou
DELETE como sua ao.

A instruo-SQL-engatilhada pode fazer referncia a outros objetos do banco de dados


alm da tabela para a qual o gatilho declarado. Se algum destes objetos for removido,
o gatilho ser invalidado. Se na prxima execuo a recompilao do gatilho no for
bem-sucedida, a chamada lanar uma exceo e a instruo que causou o disparo
ser desfeita.

Para obter mais informaes sobre instruo-SQL-engatilhada deve ser consultado o


Guia do Desenvolvedor do Derby.

Ordem de execuo
Quando ocorre um evento de banco de dados que dispara um gatilho, o Derby realiza
aes nesta ordem:
Dispara os gatilhos NO CASCADE BEFORE.
Realiza a verificao das restries (verifica chave primria, chave nica e chave

32
Direitos autorais reservados
estrangeira).
Realiza a insero, atualizao ou excluso.
Dispara os gatilhos AFTER.

Quando so definidos vrios gatilhos para o mesmo evento de banco de dados, para a
mesma tabela, e para o mesmo instante (antes ou depois), os gatilhos so disparados
na ordem em que foram criados.

-- Instrues e gatilhos:
CREATE TRIGGER T1 NO CASCADE BEFORE UPDATE ON X
FOR EACH ROW MODE DB2SQL
values app.notifyEmail('Jerry', 'A tabela x est para ser atualizada');
CREATE TRIGGER EXCLUI_VOS
AFTER DELETE ON VOS
REFERENCING OLD_TABLE AS VOS_EXCLUDOS
FOR EACH STATEMENT MODE DB2SQL
DELETE FROM VOS_DISPONIBILIDADE WHERE ID_VO IN
(SELECT ID_VO FROM VOS_EXCLUDOS);
CREATE TRIGGER EXCLUI_VOS3
AFTER DELETE ON VOS
REFERENCING OLD AS OLD
FOR EACH ROW MODE DB2SQL
DELETE FROM VOS_DISPONIBILIDADE WHERE ID_VO = OLD.ID_VO;

Note: Podem ser encontrados mais exemplos no Guia do Desenvolvedor do Derby.


Recursividade de gatilho
A profundidade de recursividade mxima de gatilho 16.

Informaes relacionadas
As funes de sistema especiais que retornam informao sobre a hora corrente ou o
usurio corrente so avaliadas quando o gatilho dispara, e no quando o gatilho
criado. Estas funes incluem:
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_USER
SESSION_USER
USER
ClusulaReferncia:

REFERENCING
{
{ OLD | NEW } [ AS ] nome-da-correlao [ { OLD | NEW } [ AS ]
nome-da-correlao ] |
{ OLD_TABLE | NEW_TABLE } [ AS ] Identificador [ { OLD_TABLE | NEW_TABLE
}
[AS] Identificador ]
}
Instruo CREATE VIEW

As vises so tabelas virtuais formadas por uma consulta. A viso um objeto do


dicionrio que pode ser utilizado, at ser removido.

As vises no so atualizveis.

Se for especificado um nome de viso qualificado, o nome do esquema no poder


comear por SYS.

Sintaxe

33
Direitos autorais reservados

CREATE VIEW nome-da-viso


[ ( nome-de-coluna-simples [, nome-de-coluna-simples] * ) ]
AS Consulta

A definio da viso pode conter uma lista de colunas da viso, opcional, para atribuir
nomes explcitos s colunas da viso. Se no houver uma lista de colunas, a viso
herdar os nomes de coluna da consulta subjacente. Todas as colunas da viso devem
possuir nomes nicos.

CREATE VIEW SAMP.V1 (COL_SUM, COL_DIFF)


AS SELECT COMISS + BNUS, COMISS - BNUS
FROM SAMP.EMPREGADOS;
CREATE VIEW SAMP.V_EMP_CURR (CURRICULUM)
AS VALUES 'Delores M. Quintana', 'Heather A. Nicholls', 'Bruce
Adamson';
CREATE VIEW SAMP.PROJ_COMBO
(NUM_PROJ, PROJ_DATA_FIM, PROJ_EQUIPE, PROJ_CHEFE)
AS SELECT NUM_PROJ, PROJ_DATA_FIM, PROJ_EQUIPE, PROJ_CHEFE
FROM SAMP.PROJETO
UNION ALL
SELECT NUM_PROJ, EMSTDATE, EMPTIME, NUM_EMP
FROM SAMP.ATIV_EMP
WHERE NUM_EMP IS NOT NULL;

Sistema de dependncia de instruo


As definies das vises so dependentes das tabelas e vises referenciadas na
definio da viso. As instrues de DML (linguagem de manipulao de dados) que
contm referncia a vises dependem destas vises, assim como dos objetos nas
definies das vises dos quais as vises dependem. As instrues que fazem
referncia viso dependem dos ndices que as vises utilizam; o ndice utilizado pela
viso pode mudar de uma instruo para outra, baseado em como a consulta
otimizada. Por exemplo, dado:
CREATE TABLE T1 (C1 DOUBLE PRECISION);
CREATE FUNCTION SIN (DATA DOUBLE)
RETURNS DOUBLE EXTERNAL NAME 'java.lang.Math.sin'
LANGUAGE JAVA PARAMETER STYLE JAVA;
CREATE VIEW V1 (C1) AS SELECT SIN(C1) FROM T1;

ento a instruo a seguir:


SELECT * FROM V1

dependente da viso V1, da tabela T1, e da funo escalar externa SIN.

Instrues DROP
As instrues DROP (remover) so utilizadas com funes, ndices, procedimentos,
esquemas, sinnimos, tabelas, gatilhos e vises.
Instruo DROP FUNCTION
Sintaxe
DROP FUNCTION nome-da-funo

Identifica uma determinada funo a ser removida, sendo vlida somente se existir
exatamente uma instncia da funo com o nome-da-funo no esquema. A funo
identificada pode ter qualquer nmero de parmetros definidos na mesma. Se no
houver nenhuma funo com o nome indicado no esquema nomeado ou implcito,
ocorrer um erro (SQLState 42704). Tambm ocorrer um erro quando existir mais de
uma instncia da funo especificada no esquema nomeado ou implcito.

34
Direitos autorais reservados
Instruo DROP INDEX

A instruo DROP INDEX remove o ndice especificado.

Sintaxe
DROP INDEX nome-do-ndice

DROP INDEX INDICE_ORIGEM


DROP INDEX INDICE_DESTINO

Sistema de dependncia de instruo


Se houver um cursor aberto na tabela de onde o ndice ser removido, a instruo
DROP INDEX ir gerar um erro e no remover o ndice. Se no houver, as instrues
que dependem da tabela do ndice sero invalidadas.
Instruo DROP PROCEDURE
Sintaxe
DROP PROCEDURE nome-do-procedimento

Identifica um determinado procedimento a ser removido, sendo vlida somente se


houver exatamente uma instncia do procedimento com o nome-do-procedimento no
esquema. O procedimento identificado pode ter qualquer nmero de parmetros
definidos no mesmo. Se no houver nenhum procedimento com o nome indicado no
esquema nomeado ou implcito, ocorrer um erro (SQLState 42704). Tambm ocorrer
um erro quando existir mais de uma instncia do procedimento especificado no esquema
nomeado ou implcito.
Instruo DROP SCHEMA

A instruo DROP SCHEMA remove um esquema. O esquema de destino deve estar


vazio para a remoo ser bem-sucedida.

Nem o esquema APP (o esquema padro do usurio), e nem o esquema SYS, podem
ser removidos.

Sintaxe
DROP SCHEMA nome-do-esquema RESTRICT

A palavra chave RESTRICT impe a regra que, para o esquema poder ser removido do
banco de dados, no pode existir nenhum objeto definido no esquema especificado. A
palavra chave RESTRICT requerida.

-- Remover o esquema SAMP


-- O esquema SAMP somente poder ser removido do banco de dados
-- se no existir nenhum objeto definido no esquema SAMP.
DROP SCHEMA SAMP RESTRICT
Instruo DROP SYNONYM

Remove o sinnimo especificado da tabela ou da viso.

Sintaxe
DROP SYNONYM nome-do-sinnimo
Instruo DROP TABLE

35
Direitos autorais reservados

A instruo DROP TABLE remove a tabela especificada.

Sintaxe
DROP TABLE nome-da-tabela

Sistema de dependncia de instruo


Os gatilhos, as restries (chave primria, unicidade, verificao e referencial da tabela
sendo removida) e os ndices da tabela so removidos em silncio. A existncia de um
cursor aberto fazendo referncia tabela sendo removida faz com que a instruo
DROP TABLE gere um erro, e a tabela no seja removida.

A remoo da tabela invalida as instrues que dependem da tabela (Invalidar uma


instruo faz com que esta seja recompilada na prxima execuo. Consulte a Interao
com o sistema de dependncias.)
Instruo DROP TRIGGER

A instruo DROP TRIGGER remove o gatilho especificado.

Sintaxe
DROP TRIGGER nome-do-gatilho

DROP TRIGGER GAT1

Sistema de dependncia de instruo


Quando uma tabela removida, todos os gatilhos da tabela so removidos
automaticamente (No h necessidade de remover os gatilhos da tabela antes de
remover a tabela).
Instruo DROP VIEW

Remove a viso especificada.

Sintaxe
DROP VIEW nome-da-viso

DROP VIEW um_identificador

Sistema de dependncia de instruo


Todas as instrues que fazem referncia viso so invalidadas pela instruo DROP
VIEW. A instruo DROP VIEW no permitida quando existem vises ou cursores
abertos dependentes da viso. A viso deve ser removida antes que qualquer objeto do
qual seja dependente possa ser removido.

Instrues RENAME
As instrues RENAME so utilizadas com ndices e tabelas.
Instruo RENAME INDEX

Esta instruo permite mudar o nome de um ndice no esquema corrente. Os usurios


no podem mudar os nomes dos ndices do esquema SYS.

Sintaxe

36
Direitos autorais reservados

RENAME INDEX nome-do-ndice TO novo-nome-do-ndice

RENAME INDEX NDICE_DESTINO TO NDICE_CHEGADA

Sistema de dependncia de instruo


A instruo RENAME INDEX no permitida quando h cursores abertos fazendo
referncia ao ndice sendo renomeado.
Instruo RENAME TABLE

A instruo RENAME TABLE permite renomear uma tabela existente em qualquer


esquema (exceto o esquema SYS).

Sintaxe
RENAME TABLE nome-da-tabela TO novo-nome-da-tabela

Se houver uma viso ou uma chave estrangeira fazendo referncia tabela, a tentativa
de renomear a tabela vai gerar um erro. Alm disso, caso exista alguma restrio de
verificao ou gatilho na tabela, a tentativa de renome-la vai gerar um erro.

RENAME TABLE SAMP.ATIV_EMP TO ATIVIDADES_EMPREGADOS

Para obter mais informaes consulte tambm a Instruo ALTER TABLE.

Sistema de dependncia de instruo


Mesmo que exista um ndice definido na tabela, a tabela pode ser renomeada.

A instruo RENAME TABLE no permitida quando h cursores abertos fazendo


referncia tabela sendo alterada.

Instrues SET
As instrues SET so utilizadas com esquemas e para definir o nvel de isolamento
corrente.
Instruo SET SCHEMA

A instruo SET SCHEMA define o esquema padro para a sesso da conexo como
sendo o esquema designado. O esquema padro utilizado como esquema de destino
por todas as instrues emitidas pela conexo que no especificam explicitamente o
nome do esquema.

Para a instruo SET SCHEMA ser bem-sucedida, o esquema de destino deve existir.
Se o esquema no existir, retornar um erro. Consulte a Instruo CREATE SCHEMA.

A instruo SET SCHEMA no transacional: Se a instruo SET SCHEMA for parte de


uma transao desfeita, a mudana de esquema permanecer aplicada.

Sintaxe
SET [CURRENT] SCHEMA [=]
{ nome-do-esquema|
USER | ? | '<constante-cadeia-de-caracteres>' } | SET CURRENT SQLID [=]
{
nome-do-esquema| USER | ? | '<constante-cadeia-de-caracteres>' }

O nome-do-esquema um identificador com comprimento mximo igual a 128. No

37
Direitos autorais reservados
diferencia letras maisculas de minsculas, a menos que esteja entre aspas (Por
exemplo, SYS equivalente a sYs, SYs, sys, etc.).

USER o usurio corrente. Se no houver usurio corrente definido, o esquema


corrente padro ser o esquema APP (Se for especificado um nome de usurio na
conexo, o nome de usurio ser o esquema padro para a conexo, caso exista um
esquema com este nome).

? a especificao de um parmetro dinmico que pode ser utilizado em instrues


preparadas. A instruo SET SCHEMA pode ser preparada uma vez e executada com
valores de esquema diferentes. Os valores do esquema so tratados como constantes
cadeia de caracteres, portanto diferenciando letras maisculas e minsculas. Por
exemplo, para designar o esquema APP deve ser utilizada a cadeia de caracteres
"APP", em vez de "app".

-- os comandos a seguir so todos equivalentes,


-- e funcionam assumindo que exista um esquema chamado HOTEL
SET SCHEMA HOTEL
SET SCHEMA hotel
SET CURRENT SCHEMA hotel
SET CURRENT SQLID hotel
SET SCHEMA = hotel
SET CURRENT SCHEMA = hotel
SET CURRENT SQLID = hotel
SET SCHEMA "HOTEL" -- identificador entre aspas
SET SCHEMA 'HOTEL' -- cadeia de caracteres entre apstrofos-- Este
exemplo produz um erro, porque
-- hotel em minsculas no ser encontrado
SET SCHEMA = 'hotel'
-- Este exemplo produz um erro, porque SQLID
-- no permitido sem CURRENT
SET SQLID hotel
-- Este exemplo define o esquema como o ID do usurio corrente
SET CURRENT SCHEMA USER
// Abaixo est um exemplo da utilizao de SET SCHEMA em um programa Java
PreparedStatement ps = conn.PrepareStatement("set schema ?");
ps.setString(1,"HOTEL");
ps.executeUpdate();
... fazer alguma coisa
ps.setString(1,"APP");
ps.executeUpdate();
ps.setString(1,"app"); //erro - a cadeia de caracteres diferencia
// letras maisculas e minsculas; app no ser encontrado
ps.setNull(1, Types.VARCHAR); //erro - no permitido nulo
Instruo SET CURRENT ISOLATION

A instruo SET CURRENT ISOLATION LEVEL permite que o usurio mude o nvel de
isolamento de sua conexo. Os nveis vlidos so: SERIALIZABLE, REPEATABLE
READ, READ COMMITTED e READ UNCOMMITTED.

A emisso deste comando efetiva a transao corrente, o que consistente com o


mtodo java.sql.Connection.setTransactionLevel.

Para obter informaes sobre os nveis de isolamento deve ser consultado "Bloqueio,
Simultaneidade e Isolamento" no Guia do Desenvolvedor do Derby.

Sintaxe
SET [ CURRENT ] ISOLATION [ = ]
{
UR | DIRTY READ | READ UNCOMMITTED
CS | READ COMMITTED | CURSOR STABILITY
RS |
RR | REPEATABLE READ | SERIALIZABLE
RESET
}

38
Direitos autorais reservados

SET ISOLATION SERIALIZABLE;

CALL (PROCEDIMENTO)
A instruo CALL (PROCEDIMENTO) utilizada para chamar procedimentos. A
chamada de procedimento no retorna nenhum valor.

Sintaxe
CALL nome-do-procedimento ( [ ? [, ?]* ] )

Exemplo
CREATE PROCEDURE VENDAS.RENDIMENTO_TOTAL(IN V_MS INTEGER,
IN V_ANO INTEGER, OUT TOTAL DECIMAL(10,2))
PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME
'com.acme.vendas.calcularRendimentoTotal';
CALL VENDAS.RENDIMENTO_TOTAL(?,?,?);

Clusula CONSTRAINT
A clusula CONSTRAINT uma parte opcional da Instruo CREATE TABLE e da
Instruo ALTER TABLE. A restrio uma regra com a qual os dados devem estar em
conformidade. O nome da restrio opcional.
A restrio pode ser:
restrio no nvel-de-coluna
As restries no nvel-de-coluna fazem referncia a uma nica coluna da tabela, e
no especificam o nome da coluna (exceto as restries de verificao). Se
referem coluna a qual seguem.
restrio no nvel-de-tabela
As restries no nvel-de-tabela fazem referncia a uma ou mais colunas da tabela.
As restries no nvel-de-tabela especificam os nomes das colunas s quais se
aplicam. As restries de verificao (CHECK) no nvel de tabela podem fazer
referncia a zero ou mais colunas da tabela.

As restries de coluna incluem:


NOT NULL
Especifica que a coluna no pode conter valores nulos (no pode ser dado nome a
restries deste tipo).
PRIMARY KEY
Especifica a coluna que identifica unicamente uma linha da tabela. A coluna
identificada deve ser definida como NOT NULL.
Note: Se for tentado adicionar uma chave primria utilizando a instruo ALTER
TABLE, e alguma coluna includa na chave primria contiver valores nulos, ser
gerado um erro e a chave primria no ser adicionada. Para obter mais
informaes deve ser consultada a Instruo ALTER TABLE.
UNIQUE
Especifica que os valores na coluna devem ser nicos. No so permitidos valores
nulos.
FOREIGN KEY

39
Direitos autorais reservados

Especifica que os valores na coluna devem corresponder a valores em uma coluna


de chave primria ou de chave nica referenciada, ou que so nulos.
CHECK
Especifica regras para os valores da coluna.

As restries de tabela incluem:


PRIMARY KEY
Especifica a coluna ou colunas que identificam unicamente uma linha da tabela.
No so permitidos valores nulos.
UNIQUE
Especifica que os valores nas colunas devem ser nicos. As colunas identificadas
devem ser definidas como NOT NULL.
FOREIGN KEY
Especifica que os valores nas colunas devem corresponder a valores em colunas
de uma chave primria ou chave nica referenciada, ou que so nulos.
Note: Se a chave estrangeira for formada por vrias colunas, e se alguma coluna
for nula, toda a chave ser considerada nula. A insero ser permitida no
importando o que esteja presente nas colunas no-nulas.
CHECK
Especifica diversas regras para os valores na tabela.

As restries de coluna e restries de tabela possuem a mesma funo; a diferena


onde so especificadas. As restries de tabela permitem especificar mais de uma
coluna na definio da restrio PRIMARY KEY, UNIQUE, CHECK e FOREIGN KEY. As
restries no nvel-de-coluna (exceto as restries de verificao) fazem referncia a
apenas uma coluna.

Sintaxe
Restries de chave primria e de unicidade
A chave primria define o conjunto de colunas que identificam unicamente as linhas da
tabela.

Quando se cria uma restrio de chave primria, nenhuma das colunas includas na
chave primria pode ter a restrio NULL; ou seja, no podem permitir valores nulos.

A instruo ALTER TABLE ADD PRIMARY KEY permite incluir colunas existentes em
uma chave primria, caso estas tenham sido anteriormente definidas como NOT NULL.
Os valores NULL no so permitidos. Se as colunas contiverem valores nulos, o sistema
no adicionar a restrio de chave primria. Para obter mais informaes deve ser
consultada a Instruo ALTER TABLE.

A tabela pode ter no mximo uma restrio PRIMARY KEY, mas pode ter vrias
restries UNIQUE.

Restries de chave estrangeira


As chaves estrangeiras fornecem um meio de impor a integridade referencial de um
banco de dados. A chave estrangeira uma coluna, ou grupo de colunas, dentro da
tabela que fazem referncia a uma chave de alguma outra tabela (ou algumas vezes,
embora raramente, mesma tabela). A chave estrangeira deve incluir sempre colunas
cujos tipos correspondem exatamente aos tipos das colunas da restrio de chave
primria ou de unicidade referenciada.

40
Direitos autorais reservados

Em uma restrio de chave estrangeira no nvel-de-tabela, para a qual so especificadas


as colunas da tabela que compem a restrio, a mesma coluna no pode ser usada
mais de uma vez.

Se houver uma lista de colunas na EspecificaoReferencias (lista das colunas na tabela


referenciada), esta lista dever corresponder a uma restrio de chave primria ou a
uma restrio de unicidade da tabela referenciada. A EspecificaoReferencias pode
omitir a lista de colunas da tabela referenciada, se esta tabela possuir uma chave
primria declarada.

Se no houver uma lista de colunas na EspecificaoReferencias, e a tabela


referenciada no possuir uma chave primria, ser lanada uma exceo de instruo
(Isto significa que se a tabela referenciada possuir apenas chaves nicas, necessrio
incluir a lista de colunas na EspecificaoReferencias).
A restrio de chave estrangeira est satisfeita quando h um valor correspondente na
coluna de unicidade ou de chave primria correspondente. Se a chave estrangeira for
composta por vrias colunas, o valor da chave estrangeira ser considerado nulo
quando qualquer uma de suas colunas tiver o valor nulo.
Note: possvel que uma chave estrangeira formada por vrias colunas permita que
uma de suas colunas contenha um valor para o qual no exista valor correspondente
nas colunas referenciadas, de acordo com o padro SQL-92. Para evitar esta situao,
devem ser criadas restries NOT NULL em todas as colunas da chave estrangeira.

Restries de chave estrangeira e a DML


Quando feita uma insero ou atualizao em uma tabela que possui uma restrio de
chave estrangeira habilitada, o Derby verifica se a linha no viola a restrio de chave
estrangeira procurando a chave referenciada correspondente na tabela referenciada. Se
a restrio no for satisfeita, o Derby rejeitar a insero ou a atualizao atravs de
uma exceo de instruo.

Quando uma linha de uma tabela com uma chave referenciada (uma restrio de chave
primria ou de unicidade referenciada por uma chave estrangeira) atualizada ou
removida, o Derby verifica todas as restries de chave estrangeira que fazem referncia
chave, para ter certeza que a remoo ou a modificao da linha no causa violao
da restrio. Se a remoo ou a modificao da linha causar uma violao da restrio,
a atualizao ou remoo no ser permitida, e o Derby lanar uma exceo de
instruo.

O Derby realiza as verificaes de restrio no momento em que a instruo


executada, e no quando a transao efetivada.

ndices de apoio
As restries UNIQUE, PRIMARY KEY e FOREIGN KEY geram ndices que impem, ou
"apoiam", restrio (sendo algumas vezes chamados de ndices de apoio). As
restries UNIQUE e PRIMARY KEY geram ndices nicos. As restries FOREIGN
KEY geram ndices que no so nicos. Portanto, se uma coluna, ou conjunto de
colunas, estiverem envolvidas em uma restrio UNIQUE, PRIMARY KEY ou FOREIGN
KEY, no necessrio criar ndices nestas colunas para melhorar o desempenho, o
Derby j ter criado o ndice. Consulte ndices e restries.

Estes ndices ficam disponveis para o otimizador para a otimizao de comandos


(consulte a Instruo CREATE INDEX), e possuem nomes gerados pelo sistema.

No permitido remover um ndice de apoio atravs da instruo DROP INDEX;


necessrio remover a restrio ou a tabela.

41
Direitos autorais reservados
Restries de verificao
As restries de verificao podem ser utilizadas para especificar diversas regras para o
contedo da tabela. especificada uma condio de procura (que uma expresso
booleana), para a restrio de verificao. Esta condio de procura deve ser satisfeita
por todas as linhas da tabela. A condio de procura aplicada a toda linha modificada
por uma instruo INSERT ou UPDATE, na hora em que a linha modificada. A
instruo interrompida por completo quando qualquer restrio de verificao
violada.

Requisitos da condio de procura


Se a restrio de verificao for especificada como parte da definio-da-coluna, a
referncia a coluna somente poder ser feita para a mesma coluna. As restries de
verificao especificadas como parte da definio da tabela, podem possuir referncia a
colunas que identificam colunas definidas anteriormente na instruo CREATE TABLE.
A condio de procura deve retornar sempre o mesmo valor quando for aplicada aos
mesmos valores. Portanto, no pode conter:
Parmetros dinmicos (?)
Funes de Data/Hora (CURRENT_DATE, CURRENT_TIME,
CURRENT_TIMESTAMP)
Subconsultas
Funes de usurio (tal como USER, SESSION_USER, CURRENT_USER)

Aes referenciais
Quando a chave estrangeira definida, pode ser especificada uma clusula ON
DELETE e/ou ON UPDATE seguida pela ao apropriada (CASCADE, RESTRICT, SET
NULL ou NO ACTION). Estas clusulas especificam se o Derby deve modificar os
valores da chave estrangeira correspondente ou no permitir a operao, para manter o
relacionamento de chave estrangeira intacto quando o valor da chave primria for
atualizado ou excludo da tabela.

A regra de atualizao ou de excluso da restrio referencial especificada quando a


restrio referencial definida.

A regra de atualizao aplicada quando uma linha da tabela me ou da tabela


dependente atualizada. As escolhas so NO ACTION e RESTRICT.

Quando se atualiza o valor de uma coluna da chave primria da tabela me, e a regra de
atualizao est especificada como RESTRICT, o Derby verifica as tabelas dependentes
com relao s restries de chave estrangeira. Se alguma linha de tabela dependente
violar a restrio de chave estrangeira, a transao ser desfeita.

Se a regra de atualizao for NO ACTION, o Derby verificar as tabelas dependentes


com relao s restries de chave estrangeira aps todas as excluses terem sido
executadas, mas antes dos gatilhos serem executados. Se alguma linha de tabela
dependente violar a restrio de chave estrangeira, a instruo ser rejeitada.

Quando atualizado o valor de uma coluna em uma tabela dependente, e este valor faz
parte da chave estrangeira, a regra de atualizao implcita NO ACTION. NO ACTION
significa que se a chave estrangeira for atualizada com um valor no-nulo, o valor
atualizado dever corresponder a um valor na chave primria da tabela me quando a
instruo estiver completa. Se a atualizao no corresponder a um valor na chave
primria da tabela me, a instruo ser rejeitada.

A regra de excluso aplicada quando uma linha da tabela me excluda, e esta linha
possui dependentes na tabela dependente da restrio referencial. Quando so
excludas linhas da tabela dependente, a operao de excluso da tabela me dita
como propagada para a tabela dependente. Se a tabela dependente tambm for uma

42
Direitos autorais reservados
tabela me, a ao especificada ser aplicada, por sua vez, s suas tabelas
dependentes.

As escolhas so NO ACTION, RESTRICT, CASCADE e SET NULL. SET NULL somente


poder ser especificada quando alguma coluna da chave estrangeira permitir valores
nulos.

Se a regra de excluso for:

NO ACTION, o Derby verificar as tabelas dependentes com relao s restries


referenciais aps todas as excluses terem sido executadas, mas antes dos gatilhos
serem executados. Se alguma linha da tabela dependente violar a restrio de chave
estrangeira, a instruo ser rejeitada.

RESTRICT, o Derby verificar as tabelas dependentes com relao s chaves


estrangeiras. Se alguma linha da tabela dependente violar a restrio de chave
estrangeira, a transao ser desfeita.

CASCADE, a operao de excluso ser propagada para a tabela dependente (e para


as dependentes desta tabela, caso se aplique).

SET NULL, todas as colunas da chave estrangeira da tabela dependente que aceitam o
valor nulo, recebero o valor nulo (Novamente, se a tabela dependente tambm possuir
tabelas dependentes, as colunas das chaves estrangeiras destas tabelas que aceitam o
valor nulo, recebero o valor nulo)

Cada restrio referencial onde a tabela a tabela me, possui suas prprias regras de
excluso; todas as regras de excluso aplicveis so utilizadas para determinar o
resultado da operao de excluso. Portanto, no poder ser excluda uma linha que
possua dependentes em uma restrio referencial com regra de excluso RESTRICT ou
NO ACTION. De forma semelhante, a linha no poder ser excluda quando a excluso
se propagar em cascata para alguma de suas descendentes que seja dependente em
uma restrio referencial com a regra de excluso RESTRICT ou NO ACTION.
A excluso de uma linha da tabela me envolve outras tabelas. Qualquer tabela
envolvida em uma operao de excluso na tabela me dita como sendo
conectada-para-excluso com a tabela me. A excluso pode afetar as linhas destas
tabelas das seguintes maneiras:
Se a regra de excluso for RESTRICT ou NO ACTION, a tabela dependente estar
envolvida na operao, mas no ser afetada pela operao (ou seja, o Derby
verificar os valores na tabela, mas no excluir qualquer valor).
Se a regra de excluso for SET NULL, as linhas da tabela dependente podero ser
atualizadas quando uma linha da tabela me for objeto de uma excluso ou de uma
operao de excluso propagada.
Se a regra de excluso for CASCADE, as linhas da tabela dependente podero ser
excludas quando a tabela me for objeto de uma excluso.
Se a tabela dependente tambm for uma tabela me, as aes descritas nesta lista
sero aplicadas, por sua vez, s suas tabelas dependentes.

Exemplos
-- restrio de chave primria no nvel-de-coluna chamada PK_SADA:
CREATE TABLE SAMP.CAIXA_SADA
(
ENVIO TIMESTAMP,
DESTINO CHAR(8),
ASSUNTO CHAR(64) NOT NULL CONSTRAINT PK_CAIXA_SADA PRIMARY
KEY,
TEXTO_NOTA VARCHAR(3000)
);
-- a definio de chave primria no nvel-de-tabela permite
-- incluir duas colunas na definio da chave primria:

43
Direitos autorais reservados

CREATE TABLE SAMP.AGENDA


(
COD_CLASSE CHAR(7) NOT NULL,
DIA SMALLINT NOT NULL,
INCIO TIME,
FIM TIME,
PRIMARY KEY (COD_CLASSE, DIA)
);
-- Uso de uma restrio no nvel-de-coluna para verificao aritmtica.
-- Uso de uma restrio no nvel-de-tabela para ter certeza que os
-- impostos do empregado no so maiores que os bnus.
CREATE TABLE SAMP.EMP
(
NUM_EMP CHAR(6) NOT NULL CONSTRAINT PK_EMP PRIMARY KEY,
NOME CHAR(12) NOT NULL,
INICIAL_MEIO VARCHAR(12) NOT NULL,
SOBRENOME VARCHAR(15) NOT NULL,
SALRIO DECIMAL(9,2) CONSTRAINT VERIF_SAL CHECK (SALRIO >=
10000),
BNUS DECIMAL(9,2),
IMPOSTOS DECIMAL(9,2),
CONSTRAINT VERIF_BNUS CHECK (BNUS > IMPOSTOS)
);
-- Uso de uma restrio de verificao para permitir
-- apenas as abreviaturas apropriadas para as refeies
CREATE TABLE VOS
(
ID_VO CHAR(6) NOT NULL ,
NMERO_SEGMENTO INTEGER NOT NULL ,
AEROPORTO_ORIGEM CHAR(3),
HORA_PARTIDA TIME,
AEROPORTO_DESTINO CHAR(3),
HORA_CHEGADA TIME,
REFEIO CHAR(1) CONSTRAINT VERIF_REFEIO
CHECK (REFEIO IN ('B', 'L', 'D',
'S')),
PRIMARY KEY (ID_VO, NMERO_SEGMENTO)
);
CREATE TABLE METROPOLITANO
(
ID_HOTEL INT NOT NULL CONSTRAINT PK_HOTIS PRIMARY KEY,
NOME_HOTEL VARCHAR(40) NOT NULL,
ID_CIDADE INT CONSTRAINT FK_METRO REFERENCES CIDADES
);
-- criao de uma tabela com uma restrio de chave primria
-- e uma restrio de chave estrangeira no nvel-de-tabela
CREATE TABLE VOS_DISP
(
ID_VO CHAR(6) NOT NULL,
NMERO_SEGMENTO INT NOT NULL,
DATA_VO DATE NOT NULL,
ASSENTOS_ECONMICOS_OCUPADOS INT,
ASSENTOS_EXECUTIVOS_OCUPADOS INT,
ASSENTOS_PRIMEIRA_CLASSE_OCUPADOS INT,
CONSTRAINT PK_VOS_DISP PRIMARY KEY (ID_VO, NMERO_SEGMENTO),
CONSTRAINT FK_VOS
FOREIGN KEY (ID_VO, NMERO_SEGMENTO)
REFERENCES VOS (ID_VO, NMERO_SEGMENTO)
);
-- adicionar uma restrio de unicidade a uma coluna
ALTER TABLE SAMP.PROJETO
ADD CONSTRAINT UNQ_PROJ UNIQUE (NOME_PROJ);
-- criar uma tabela cuja coluna ID_CIDADE faa referncia
-- chave primria da tabela CIDADES utilizando uma
-- restrio de chave estrangeira no nvel-de-coluna
CREATE TABLE CONDOMNIOS
(
ID_COND INT NOT NULL CONSTRAINT PK_HOTIS PRIMARY KEY,
NOME_COND VARCHAR(40) NOT NULL,
ID_CIDADE INT CONSTRAINT FK_CIDADE
REFERENCES CIDADES
ON DELETE CASCADE
ON UPDATE RESTRICT
);

Sistema de dependncia de instruo


As instrues INSERT e UPDATE dependem de todas as restries da tabela de

44
Direitos autorais reservados

destino. As instrues DELETE dependem das restries de unicidade, chave primria e


de chave estrangeira. Estas instrues so invalidadas quando adicionada ou
removida uma restrio na tabela de destino.
restrio no nvel-de-coluna

{
NOT NULL |
[ [CONSTRAINT nome-da-restrio]
{
CHECK (CondioProcura) |
{
PRIMARY KEY |
UNIQUE |
REFERENCES clusula
}
}
}
restrio no nvel-de-tabela

[CONSTRAINT nome-da-restrio]
{
CHECK (CondioProcura) |
{
PRIMARY KEY ( nome-de-coluna-simples [ , nome-de-coluna-simples
]* ) |
UNIQUE ( nome-de-coluna-simples [ , nome-de-coluna-simples ]* ) |
FOREIGN KEY ( nome-de-coluna-simples [ , nome-de-coluna-simples
]* )
REFERENCES clusula
}
}
Especificao da referncia

REFERENCES nome-da-tabela [ ( nome-de-coluna-simples [ ,


nome-de-coluna-simples ]* ) ]
[ ON DELETE {NO ACTION | RESTRICT | CASCADE | SET NULL}]
[ ON UPDATE {NO ACTION | RESTRICT }]
|
[ ON UPDATE {NO ACTION | RESTRICT }] [ ON DELETE
{NO ACTION | RESTRICT | CASCADE | SET NULL}]
CondioProcura

A CondioProcura qualquer Expresso booleana que atenda aos requisitos


especificados nos Requisitos da condio de procura.

Quando no especificado o nome-da-restrio, o Derby gera um nome de restrio


nico (tanto para a restrio de coluna quanto para a restrio de tabela).

Instruo DECLARE GLOBAL TEMPORARY TABLE


A instruo DECLARE GLOBAL TEMPORARY TABLE define uma tabela temporria
para a conexo corrente. Estas tabelas no residem nos catlogos do sistema, e no
so persistentes. As tabelas temporrias existem somente durante a conexo em que
foram declaradas, no podendo ser referenciadas de fora da conexo. Ao fechar a
conexo, as linhas da tabela so excludas e a descrio em-memria da tabela
temporria removida.

As tabelas temporrias so teis quando:


a estrutura da tabela no conhecida antes de utilizar o aplicativo.
os outros usurios no necessitam da mesma estrutura de tabela.
os dados da tabela temporria so necessrios durante o uso do aplicativo.
a tabela pode ser declarada e removida sem manter bloqueios no catlogo do
sistema.

45
Direitos autorais reservados
Sintaxe
DECLARE GLOBAL TEMPORARY TABLE nome-da-tabela
{ definio-da-coluna [ , definio-da-coluna ] * }
[ ON COMMIT {DELETE | PRESERVE} ROWS ]
NOT LOGGED [ON ROLLBACK DELETE ROWS]

nome-da-tabela
O nome da tabela temporria. Se for especificado um nome-do-esquema diferente de
SESSION, ocorrer um erro (SQLState 428EK). Se o nome-do-esquema no for
especificado, ser atribudo SESSION. Vrias conexes podem definir tabelas
temporrias globais declaradas com o mesmo nome, porque cada conexo possui seu
prprio descritor de tabela nico.

A utilizao de SESSION como nome do esquema de uma tabela fsica no gera erro,
mas desestimulado. O nome de esquema SESSION deve ser reservado para o
esquema de tabelas temporrias.

definio-da-coluna
Para obter mais informaes sobre a definio-da-coluna deve ser consultada
definio-da-coluna em CREATE TABLE. A instruo DECLARE GLOBAL TEMPORARY
TABLE no permite especificao-de-coluna-gerada na
definio-da-coluna.

Tipo-de-dado
Os tipos-de-dado suportados so:
BIGINT
CHAR
DATE
DECIMAL
DOUBLE PRECISION
FLOAT
INTEGER
NUMERIC
REAL
SMALLINT
TIME
TIMESTAMP
VARCHAR

ON COMMIT
Especifica a ao a ser executada na tabela temporria global quando realizada uma
operao de COMMIT.

DELETE ROWS
Todas as linhas da tabela sero excludas, se no houver nenhum cursor com
possibilidade de HOLD aberto na tabela. Este o valor padro para ON COMMIT. Se for
especificado ON ROLLBACK DELETE ROWS, sero excludas todas as linhas da tabela
somente se a tabela temporria tiver sido utilizada. ON COMMIT DELETE ROWS exclui
as linhas da tabela, mesmo que a tabela no tenha sido utilizada (se a tabela no
possuir nenhum cursor com possibilidade de HOLD aberto na mesma).

PRESERVE ROWS
As linhas da tabela so preservadas.

NOT LOGGED

46
Direitos autorais reservados

Especifica a ao realizada na tabela temporria global quando uma operao de


desfazer realizada. Quando realizada uma operao de ROLLBACK (ou ROLLBACK
TO SAVEPOINT), se a tabela foi criada na unidade de trabalho (ou no ponto de
salvamento), a tabela ser removida. Se a tabela foi removida na unidade de trabalho
(ou no ponto de salvamento), a tabela ser restaurada sem nenhuma linha.

ON ROLLBACK DELETE ROWS


Este o valor padro para NOT LOGGED. NOT LOGGED [ON ROLLBACK DELETE
ROWS ]] especifica a ao a ser realizada na tabela temporria global quando
realizada uma operao de ROLLBACK (ou ROLLBACK TO SAVEPOINT). Se os dados
da tabela foram modificados, todas as linhas sero excludas.

Exemplos
SET SCHEMA MYAPP;
CREATE TABLE T1(C11 INT, C12 DATE);
DECLARE GLOBAL TEMPORARY TABLE SESSION.T1(C11 INT) NOT LOGGED;
-- A qualificao SESSION redundante, porque as tabelas temporrias
-- somente podem existir no esquema SESSION.
DECLARE GLOBAL TEMPORARY TABLE T2(C21 INT) NOT LOGGED;
-- A tabela temporria no qualificada neste caso com SESSION, porque
-- as tabelas temporrias somente podem existir no esquema SESSION.
INSERT INTO SESSION.T1 VALUES (1);
-- Neste caso a qualificao SESSION obrigatria para utilizar a
-- tabela temporria, porque o esquema corrente MYAPP.
SELECT * FROM T1;
-- Esta instruo SELECT est fazendo referncia tabela fsica
-- "MYAPP.T1", uma vez que a tabela no foi qualificada com SESSION.

Deve ser observado que as tabelas temporrias somente podem ser declaradas no
esquema SESSION. Nunca deve ser declarado um esquema fsico com o nome
SESSION.
A seguir est mostrada uma lista de funes da instruo DECLARE GLOBAL
TEMPORARY TABLE do DB2 UDB que no so suportadas pelo Derby:
IDENTITY opes-de-coluna
IDENTITY atributo nas opes-de-cpia
AS (FULLSELECT) DEFINITION ONLY
NOT LOGGED ON ROLLBACK PRESERVE ROWS
IN nome-do-espao-de-tabelas
PARTITIONING KEY
WITH REPLACE

Restries das tabelas temporrias globais declaradas


As tabelas temporrias no podem ser especificadas nas seguintes instrues:
ALTER TABLE
CREATE SYNONYM
CREATE TRIGGER
CREATE VIEW
LOCK
RENAME

As tabelas temporrias no pode ser especificadas nas restries referenciais.

No h suporte para restrio de verificao nas colunas.


No podem ser utilizados os seguintes tipos de dado nas tabelas temporrias globais
declaradas:
BLOB

47
Direitos autorais reservados
CLOB
LONG VARCHAR

As tabelas temporrias no podem ser referenciadas por uma


instruo-SQL-engatilhada.

Se uma instruo realizando uma insero, atualizao ou excluso em uma tabela


temporria encontrar um erro, todas as linhas da tabela sero excludas.

Restries especficas do Derby


O Derby no d suporte em tabelas temporrias a:
ndices
sinnimos, gatilhos e vises em tabelas no esquema SESSION (incluindo as
tabelas fsicas e as tabelas temporrias)
LOCK TABLE
restries e chaves primrias
especificao-de-coluna-gerada
importao em tabelas temporrias
As instrues fazendo referncia a tabelas e vises no esquema SESSION no ficam no
cache.

Instruo DELETE
Sintaxe
{
DELETE FROM nome-da-tabela
[WHERE clusula] |
DELETE FROM nome-da-tabela WHERE CURRENT OF
}

A primeira forma sinttica, chamada de excluso procurada, exclui todas as linhas


identificadas pelo nome da tabela e pela clusula WHERE.

A segunda forma sinttica, chamada de excluso posicionada, exclui a linha corrente de


um cursor atualizvel aberto. Se no houver uma linha corrente, ou se a linha no mais
satisfizer o comando do cursor, ser lanada uma exceo. Para obter mais informaes
sobre cursores atualizveis deve ser consultada a Instruo SELECT.

Exemplos
DELETE FROM SAMP.CAIXA_ENTRADA;
stmt.executeUpdate("DELETE FROM SAMP.CAIXA_ENTRADA WHERE CURRENT OF " +
resultSet.getCursorName())

Uma instruo de excluso procurada depende da tabela sendo atualizada, todos os


seus conglomerados (unidades de armazenamento como heaps e ndices), e todas as
outras tabelas citadas na clusula WHERE. Uma instruo CREATE ou DROP INDEX
na tabela de destino de uma instruo de excluso procurada preparada, invalida a
instruo de excluso procurada preparada.

A instruo de excluso posicionada depende do cursor e de todas as tabelas


referenciadas pelo cursor. A excluso posicionada pode ser compilada mesmo que o
cursor ainda no tenha sido aberto. Entretanto, a remoo do cursor aberto atravs do
mtodo close do JDBC invalida a excluso posicionada.

48
Direitos autorais reservados

Uma instruo CREATE ou DROP INDEX na tabela de destino de uma excluso


posicionada preparada, invalida a instruo de excluso posicionada preparada.

Clusula FOR UPDATE


A clusula FOR UPDATE uma parte opcional da Instruo SELECT. A clusula FOR
UPDATE especifica se o ResultSet de uma Instruo SELECT simples, que atende os
requisitos para um cursor, atualizvel ou no. Para obter mais informaes sobre
poder ser atualizvel, deve ser consultado Requisitos para cursores atualizveis e
ResultSets atualizveis.

Sintaxe
FOR
{
READ ONLY | FETCH ONLY |
UPDATE [ OF nome-de-coluna-simples [ , nome-de-coluna-simples]* ]
}

nome-de-coluna-simples faz referncia aos nomes visveis para a tabela especificada na


clusula FROM da consulta subjacente.

Por padro, os cursores so apenas-de-leitura. Para o cursor ser atualizvel, deve ser
especificado FOR UPDATE.

O otimizador capaz de utilizar um ndice mesmo que a coluna do ndice esteja sendo
atualizada. Para obter mais informaes sobre como os ndices afetam os cursores deve
ser consultado o Ajuste do Derby.

SELECT RECEBIDO, ORIGEM, ASSUNTO, TEXTO_NOTA FROM SAMP.CAIXA_ENTRADA FOR


UPDATE;

Clusula FROM
A clusula FROM uma clusula obrigatria na ExpressoSeleo. Especifica as
tabelas (ExpressoTabela) das quais as outras clusulas da consulta podem acessar as
colunas a serem utilizadas nas expresses.

Sintaxe
FROM ExpressoTabela [ , ExpressoTabela ] *

SELECT CIDADES.ID_CIDADE
FROM CIDADES
WHERE ID_CIDADE < 5
-- outros tipos de ExpressoTabela
SELECT TABLENAME, ISINDEX
FROM SYS.SYSTABLES T, SYS.SYSCONGLOMERATES C
WHERE T.TABLEID = C.TABLEID
ORDER BY TABLENAME, ISINDEX;
-- forar a ordem de juno
SELECT *
FROM VOS, VOS_DISPONIBILIDADE
WHERE VOS_DISPONIBILIDADE.ID_VO = VOS.ID_VO
AND VOS_DISPONIBILIDADE.NMERO_SEGMENTO = VOS.NMERO_SEGMENTO
AND VOS.ID_VO < 'AA1115'
-- a ExpressoTabela pode ser uma OperaoJuno. Portanto,
-- podem haver vrias operaes de juno na clusula FROM
SELECT PASES.PAS, CIDADES.NOME_CIDADE, VOS.AEROPORTO_DESTINO
FROM PASES LEFT OUTER JOIN CIDADES

49
Direitos autorais reservados

ON PASES.COD_ISO_PAS = CIDADES.COD_ISO_PAS
LEFT OUTER JOIN VOS
ON CIDADES.AEROPORTO = VOS.AEROPORTO_DESTINO;

Clusula GROUP BY
A clusula GROUP BY, que faz parte da ExpressoSeleo, agrupa o resultado em
subconjuntos que possuem valores correspondentes em uma ou mais colunas. Em cada
grupo no h duas linhas com o mesmo valor na coluna, ou colunas, de agrupamento.
Para as finalidades de agrupamento os valores nulos so considerados equivalentes.

Normalmente a clusula GROUP BY utilizada junto com expresses de agregao.

Sintaxe
GROUP BY nome-da-coluna [ , nome-da-coluna ] *

O nome-da-coluna deve ser uma coluna do escopo corrente da consulta; no pode haver
nenhuma coluna do bloco de consulta fora do escopo corrente. Por exemplo, se a
clusula GROUP BY estiver na subconsulta, ento no poder fazer referncia a
colunas da consulta externa.

Os ItensSelecionados em uma ExpressoSeleo com clusula GROUP BY devem


conter somente agregaes ou colunas de agrupamento.

-- calcular o TEMPO_VO mdio agrupado por aeroporto


SELECT AVG (TEMPO_VO), AEROPORTO_ORIGEM
FROM VOS
GROUP BY AEROPORTO_ORIGEM
SELECT MAX(CIDADE), REGIO
FROM CIDADES, PASES
WHERE CIDADES.COD_ISO_PAS = PASES.COD_ISO_PAS
GROUP BY REGIO
-- agrupar por um SMALLINT
SELECT ID, AVG(SALRIO)
FROM SAMP.EQUIPES
GROUP BY ID
-- Obter as colunas SALRIO_MDIO, NUM_EMP e NUM_DEP
-- utilizando a clusula AS
-- Agrupar pela coluna DEP_TRAB utilizando o nome de
-- correlao OUTROS
SELECT OUTROS.DEP_TRAB AS NUM_DEP,
AVG(OUTROS.SALRIO) AS SALRIO_MDIO,
COUNT(*) AS NUM_EMP
FROM SAMP.EMPREGADOS OUTROS
GROUP BY OUTROS.DEP_TRAB;

Clusula HAVING
A clusula HAVING restringe os resultados do GROUP BY na ExpressoSeleo. A
clusula HAVING aplicada a cada grupo da tabela agrupada, de forma parecida como
a clusula WHERE aplicada lista de seleo. Se no houver uma clusula GROUP
BY, a clusula HAVING ser aplicada a todo o resultado como um nico grupo. A
clusula SELECT no pode fazer referncia direta a qualquer coluna que no possua
uma clusula GROUP BY. Entretanto, pode fazer referncia a constantes, agregaes, e
registros especiais.

Sintaxe
HAVING CondioProcura

50
Direitos autorais reservados
A CondioProcura, que uma ExpressoBooleana especializada, pode conter apenas
as colunas de agrupamento (consulte a Clusula GROUP BY), colunas que fazem parte
das expresses de agregao, e as colunas que fazem parte da subconsulta. Por
exemplo, a seguinte consulta ilegal, porque a coluna SALRIO no uma coluna de
agrupamento, no aparece em uma agregao, e no est em uma subconsulta:
-- SELECT COUNT(*)
-- FROM SAMP.EQUIPES
-- GROUP BY ID
-- HAVING SALRIO > 15000;

As agregaes na clusula HAVING no precisam aparecer na lista de seleo. Se a


clusula HAVING possuir uma subconsulta, a subconsulta poder fazer referncia ao
bloco de consulta externo se, e somente se, fizer referncia a uma coluna de
agrupamento.

-- Descobrir o nmero total de assentos econmicos


-- ocupados no vo, agrupado por linha area,
-- somente quando o grupo possuir pelo menos 2 linhas.
SELECT SUM(ASSENTOS_ECONMICOS_OCUPADOS), LINHA_AREA_CHEIA
FROM VOS_DISPONIBILIDADE, LINHAS_AREAS
WHERE SUBSTR(VOS_DISPONIBILIDADE.ID_VO, 1, 2) = LINHA_AREA
GROUP BY LINHA_AREA_CHEIA
HAVING COUNT(*) > 1

INNER JOIN
INNER JOIN (juno interna) uma Operao JOIN que permite especificar uma
clusula de juno explcita.

Sintaxe
ExpressoTabela [ INNER ] JOIN ExpressoTabela { ON ExpressoBooleana }

A clusula de juno pode ser especificada utilizando ON com uma expresso booleana.
O escopo das expresses na clusula ON inclui as tabelas correntes, e as tabelas nos
blocos de consulta externos ao SELECT corrente. No exemplo a seguir, a clusula ON
faz referncia s tabelas correntes:
SELECT *
FROM SAMP.EMPREGADOS INNER JOIN SAMP.EQUIPES
ON EMPREGADOS.SALRIO < EQUIPES.SALRIO;

A clusula ON pode fazer referncia a tabelas que no esto sendo juntadas, e no


obrigada a fazer referncia a nenhuma das tabelas sendo juntadas (embora tipicamente
o faa).

-- Juno das tabelas ATIV_EMP e EMPREGADOS


-- selecionar todas as colunas da tabela ATIV_EMP e
-- adicionar o sobrenome do empregado (LTIMO_NOME) da tabela
-- EMPREGADOS a todas as linhas do resultado
SELECT SAMP.ATIV_EMP.*, LTIMO_NOME
FROM SAMP.ATIV_EMP JOIN SAMP.EMPREGADO
ON ATIV_EMP.NUM_EMP = EMPREGADOS.NUM_EMP;
-- Juntar as tabelas EMPREGADOS e DEPARTAMENTOS,
-- selecionar o nmero do empregado (NUM_EMP),
-- o sobrenome do empregado (LTIMO_NOME),
-- o nmero do departamento (DEP_TRAB na tabela EMPREGADOS e
-- NUM_DEP na tabela DEPARTAMENTOS)
-- e o nome do departamento (NOME_DEP)
-- de todos os empregados nascidos (DATA_NASC) antes de 1930.
SELECT NUM_EMP, LTIMO_NOME, DEP_TRAB, NOME_DEP

51
Direitos autorais reservados

FROM SAMP.EMPREGADOS JOIN SAMP.DEPARTAMENTOS


ON DEP_TRAB = NUM_DEP
AND YEAR(DATA_NASC) < 1930;
-- Outro exemplo de "gerar" novos valores de dado,
-- utilizando uma consulta que seleciona da clusula VALUES
-- (que uma forma alternativa de FULLSELECT).
SELECT *
FROM (VALUES (3, 4), (1, 5), (2, 6))
AS TABELA1_VALORES(C1, C2)
JOIN (VALUES (3, 2), (1, 2),(0, 3))
AS TABELA2_VALORES(C1, C2)
ON TABELA1_VALORES.C1 = TABELA2_VALORES.C1;
O que resulta em:
C1 |C2 |C1 |2
-----------------------------------------------
3 |4 |3 |2
1 |5 |1 |2
-- Listar todos os departamentos, juntamente com o
-- nmero do empregado e o ltimo nome do gerente
SELECT NUM_DEP, NOME_DEP, NUM_EMP, LTIMO_NOME
FROM DEPARTAMENTOS
INNER JOIN EMPREGADOS
ON NUM_GER = NUM_EMP;
-- Listar todos os nmeros do empregado e ltimo nome, juntamente
-- com o nmero do empregado e ltimo nome de seus gerentes
SELECT E.NUM_EMP, E.LTIMO_NOME, M.NUM_EMP, M.LTIMO_NOME
FROM EMPREGADOS E INNER JOIN
DEPARTAMENTOS INNER JOIN EMPREGADOS M
ON NUM_GER = M.NUM_EMP
ON E.DEP_TRAB = NUM_DEP;

Instruo INSERT
A instruo INSERT cria uma ou mais linhas, e as armazena na tabela especificada. O
nmero de valores especificados na instruo INSERT deve ser idntico ao nmero de
colunas especificadas ou implcitas.

Sintaxe
INSERT INTO nome-da-tabela
[ (nome-de-coluna-simples [ , nome-de-coluna-simples]* ) ]
Consulta
A Consulta pode ser:
uma ExpressoSeleo
uma lista VALUES
uma expresso VALUES de vrias linhas
As listas de uma nica linha e de vrias linhas podem incluir a palavra chave
DEFAULT. A especificao de DEFAULT para uma coluna insere o valor padro da
coluna na coluna. Outra forma de inserir o valor padro na coluna omitir a coluna
na lista de colunas, e somente inserir valores nas outras colunas da tabela. Para
obter mais informaes deve ser consultado VALUES Expresso.
expresses UNION

Para obter mais informaes sobre a Consulta deve ser consultada Consulta.

INSERT INTO PASES


VALUES ('Taiwan', 'TW', 'sia');
-- Inserir um novo departamento na tabela DEPARTAMENTOS,
-- sem atribuir gerente ao novo departamento
INSERT INTO DEPARTAMENTOS (NUM_DEP, NOME_DEP, ADMRDEPT)
VALUES ('E31', 'ARQUITETURA', 'E01');
-- Inserir dois novos departamentos na tabela DEPARTAMENTOS
-- utilizando uma instruo, como no exemplo anterior,

52
Direitos autorais reservados

-- sem atribuir gerente aos novos departamentos.


INSERT INTO DEPARTAMENTOS (NUM_DEP, NOME_DEP, ADMRDEPT)
VALUES ('B11', 'COMPRAS', 'B01'),
('E41', 'ADMINISTRAO DE BANCO DE DADOS', 'E01');
-- Criar a tabela temporria MA_ATIV_EMP com as mesmas
-- colunas da tabela ATIV_EMP.
-- Carregar a tabela MA_ATIV_EMP com as linhas da tabela ATIV_EMP
-- onde o nmero do projeto (NUM_PROJ)
-- comea pelas letras 'MA'.
CREATE TABLE MA_ATIV_EMP
(
NUM_EMP CHAR(6) NOT NULL,
NUM_PROJ CHAR(6) NOT NULL,
ACTNO SMALLINT NOT NULL,
EMPTIME DEC(5,2),
EMSTDATE DATE,
EMENDATE DATE
);
INSERT INTO MA_ATIV_EMP
SELECT * FROM ATIV_EMP
WHERE SUBSTR(NUM_PROJ, 1, 2) = 'MA';
-- Inserir o valor DEFAULT para a coluna LOCALIZAO
INSERT INTO DEPARTAMENTOS
VALUES ('E31', 'ARQUITETURA', '00390', 'E01', DEFAULT);

Sistema de dependncia de instruo


A instruo INSERT depende da tabela onde est sendo feita a insero, todos os seus
conglomerados (unidades de armazenamento como heaps e ndices), e todas as outras
tabelas citadas na consulta. Qualquer instruo que cria ou remove um ndice ou uma
restrio da tabela de destino de uma instruo INSERT preparada, invalida a instruo
INSERT preparada.

Operao JOIN
As operaes de juno (JOIN), que esto entre as ExpressesTabela possveis na
ClusulaFROM, realizam junes entre duas tabelas (Tambm pode ser realizada a
juno entre duas tabelas utilizando um teste de igualdade explcito na clusula
WHERE, como "WHERE t1.col1 = t2.col2".)

Sintaxe
Operao de juno
As operaes de juno so:
INNER JOIN
Especifica a juno entre duas tabelas com uma clusula de juno explcita.
Consulte INNER JOIN.
LEFT OUTER JOIN
Especifica a juno entre duas tabelas com uma clusula de juno explcita,
preservando as linhas sem correspondncia da primeira tabela. Consulte LEFT
OUTER JOIN.
RIGHT OUTER JOIN
Especifica a juno entre duas tabelas com uma clusula de juno explcita,
preservando as linhas sem correspondncia da segunda tabela. Consulte RIGHT
OUTER JOIN.

Em todos os casos podem ser especificadas restries adicionais para uma ou mais
tabelas sendo juntadas nas clusulas de juno externa, ou na Clusula WHERE.

53
Direitos autorais reservados
Expresses de juno e otimizao de consulta
Para obter informaes sobre quais tipos de juno so otimizadas, consulte Ajuste do
Derby.

LEFT OUTER JOIN


LEFT OUTER JOIN uma Operao JOIN que permite especificar a clusula de juno.
Preserva as linhas sem correspondncia da primeira tabela (esquerda), juntando-as com
uma linha nula na forma da segunda tabela (direita).

Sintaxe
ExpressoTabela LEFT [ OUTER ] JOIN ExpressoTabela
{
ON ExpressoBooleana
}

O escopo das expresses na clusula ON inclui as tabelas correntes, e as tabelas nos


blocos de consulta externos ao SELECT corrente. A clusula ON pode fazer referncia a
tabelas que no esto sendo juntadas, e no obrigada a fazer referncia a nenhuma
das tabelas sendo juntadas (embora tipicamente o faa).

--correspondncia entre cidades e pases


SELECT CIDADES.PAS, REGIO
FROM PASES
LEFT OUTER JOIN CIDADES
ON ID_CIDADE=ID_CIDADE
WHERE REGIO = 'sia';
-- uso da sintaxe sinnimo, LEFT JOIN, para obter exatamente
-- os mesmos resultados da exemplo acima
SELECT CIDADES.PAS, REGIO
FROM PASES
LEFT JOIN CIDADES
ON ID_CIDADE=ID_CIDADE
WHERE REGIO = 'sia';
-- Juno das tabelas EMPREGADOS e DEPARTAMENTOS,
-- selecionar o nmero do empregado (NUM_EMP),
-- o sobrenome do empregado (LTIMO_NOME),
-- o nmero do departamento (DEP_TRAB na tabela EMPREGADOS e
-- NUM_DEP na tabela DEPARTAMENTOS)
-- e o nome do departamento (NOME_DEP)
-- de todos os empregados nascidos (DATA_NASC) antes de 1930
SELECT NUM_EMP, LTIMO_NOME, DEP_TRAB, NOME_DEP
FROM SAMP.EMPREGADOS
LEFT OUTER JOIN SAMP.DEPARTAMENTOS
ON DEP_TRAB = NUM_DEP
AND YEAR(DATA_NASC) < 1930;
-- Listar todos os departamentos, juntamente com o
-- nmero do empregado e o ltimo nome do gerente,
-- incluindo os departamentos sem gerente
SELECT NUM_DEP, NOME_DEP, NUM_EMP, LTIMO_NOME
FROM DEPARTAMENTOS
LEFT OUTER JOIN EMPREGADOS
ON NUM_GER = NUM_EMP;

Instruo LOCK TABLE


Permite ao usurio obter explicitamente um bloqueio de tabela, exclusivo ou
compartilhado, na tabela especificada. O bloqueio da tabela permanece at o trmino da
transao corrente.
O bloqueio explcito da tabela til para:
evitar a sobrecarga devido a vrios bloqueios na tabela (em outras palavras,
escalada de bloqueio iniciada pelo usurio)
evitar impasses (deadlocks)

54
Direitos autorais reservados

No possvel bloquear tabelas do sistema com esta instruo.

Sintaxe
LOCK TABLE nome-da-tabela IN { SHARE | EXCLUSIVE } MODE

Uma vez que alguma tabela esteja bloqueada em um dos modos, a transao no
obter bloqueios subseqentes no nvel-de-linha. Por exemplo, se uma transao
bloquear toda a tabela VOS no modo compartilhado para ler os dados, e uma
determinada instruo desta transao necessitar bloquear uma determinada linha no
modo exclusivo para poder atualizar a linha, o bloqueio anterior no nvel-de-tabela fora
o bloqueio no modo exclusivo ser no nvel-de-tabela tambm.

Se o bloqueio especificado no puder ser obtido porque outra conexo j possui um


bloqueio na tabela, ser lanada uma excesso no nvel-de-instruo (SQLState X0X02)
aps ser esgotado o tempo limite de impasse.

-- bloquear toda a tabela no modo compartilhado


-- para evitar um nmero grande de bloqueios de linha
LOCK TABLE VOS IN SHARE MODE;
SELECT *
FROM VOS
WHERE AEROPORTO_ORIGEM > 'OOO';
-- bloquear toda a tabela no modo exclusivo
-- para uma transao que ir atualizar muitas linhas,
-- mas onde nenhuma instruo atualizar isoladamente um
-- nmero suficiente de linhas para obter um bloqueio
-- da tabela no modo exclusivo.
-- No sistema de bloqueio no nvel-de-linha, a transao
-- iria requerer um nmero grande de bloqueios e poderia
-- causar um impasse.
LOCK TABLE DISPONIBILIDADE_HOTEL IN EXCLUSIVE MODE;
UPDATE DISPONIBILIDADE_HOTEL
SET QUARTOS_RESERVADOS = (QUARTOS_RESERVADOS + 2)
WHERE ID_HOTEL = 194 AND DATA_DE_RESERVA = DATE('1998-04-10');
UPDATE DISPONIBILIDADE_HOTEL
SET QUARTOS_RESERVADOS = (QUARTOS_RESERVADOS + 2)
WHERE ID_HOTEL = 194 AND DATA_DE_RESERVA = DATE('1998-04-11');
UPDATE DISPONIBILIDADE_HOTEL
SET QUARTOS_RESERVADOS = (QUARTOS_RESERVADOS + 2)
WHERE ID_HOTEL = 194 AND DATA_DE_RESERVA = DATE('1998-04-12');
UPDATE DISPONIBILIDADE_HOTEL
SET QUARTOS_RESERVADOS = (QUARTOS_RESERVADOS + 2)
WHERE ID_HOTEL = 194 AND DATA_DE_RESERVA = DATE('1998-04-12');
-- se a transao necessitar bloquear a tabela antes de
-- atualiz-la, dever obter um bloqueio exclusivo antes
-- de selecionar para evitar impasses.
LOCK TABLE PESSOAS IN EXCLUSIVE MODE;
SELECT MAX(ID_PESSOA) + 1 FROM PESSOAS;
-- INSERT INTO PESSOAS . . .

Clusula ORDER BY
A clusula ORDER BY um elemento opcional da Instruo SELECT. A clusula
ORDER BY permite especificar a ordem em que as linhas aparecem no ResultSet.

Sintaxe
ORDER BY { nome-da-coluna | PosioColuna }
[ ASC | DESC ]
[ , nome-da-coluna | PosioColuna
[ ASC | DESC ] ] *

55
Direitos autorais reservados

A PosioColuna um valor inteiro que identifica o nmero da coluna no ItemSeleo na


consulta subjacente da Instruo SELECT. A PosioColuna deve ser maior que zero, e
no pode ser maior que o nmero de colunas na tabela de resultado. Em outras
palavras, se for desejado ordenar pela posio da coluna, a coluna dever estar
presente na lista de seleo.

O nome-da-coluna se refere aos nomes visveis dos ItensSelecionados na consulta


subjacente da Instruo SELECT. O nome da coluna de ordenao no precisa estar na
lista de seleo.

ASC especifica que os resultados devem ser retornados na ordem ascendente; DESC
especifica que os resultados devem ser retornados na ordem descendente; Quando a
ordem no especificada, o padro ASC.

A clusula ORDER BY impede que a instruo SELECT se torne um cursor atualizvel


(Para obter mais informaes deve ser consultado Requisitos para cursores atualizveis
e ResultSets atualizveis.)

Por exemplo, se uma coluna INTEGER contiver nmeros inteiros, NULL considerado
maior que 1 para as finalidades de classificao. Em outras palavras, os valores nulos
so classificados como sendo maiores.

-- ordenar pelo nome de correlao NAO


SELECT NOME_CIDADE, PAS AS NAO
FROM CIDADES
ORDER BY NAO;

Consulta
A consulta cria uma tabela virtual baseada em tabelas existentes ou constantes
transformadas em tabelas.

Sintaxe
{
( Consulta ) |
Consulta INTERSECT [ ALL | DISTINCT ] Consulta |
Consulta EXCEPT [ ALL | DISTINCT ] Consulta |
Consulta UNION [ ALL | DISTINCT ] Consulta |
ExpressoSeleo | VALUES Expresso
}

Pode-se colocar parnteses arbitrariamente em torno das consultas, ou utilizar


parnteses para controlar a ordem de avaliao das operaes INTERSECT, EXCEPT e
UNION. Estas operaes so avaliadas da esquerda para a direita quando no existem
parnteses presentes, com exceo das operaes INTERSECT, que so avaliadas
antes das operaes de UNION e EXCEPT.

Linhas duplicadas nos resultados de UNION, INTERSECT e EXCEPT ALL


As palavras chave ALL e DISTINCT determinam se as linhas duplicadas so eliminadas
do resultado da operao. Se for especificada a palavra chave DISTINCT, ento o
resultado no ter linhas duplicadas. Se for especificada a palavra chave ALL, ento
podero existir linhas duplicadas no resultado, dependendo da existncia de linhas
duplicadas na entrada. DISTINCT o padro, portanto se no for especificado nem ALL
nem DISTINCT as linhas duplicadas sero eliminadas. Por exemplo, UNION constri um
ResultSet intermedirio com todas as linhas das duas consultas, e elimina as linhas
duplicadas antes de retornar as linhas remanescentes. UNION ALL retorna todas as
linhas das duas consultas como resultado.

56
Direitos autorais reservados
Dependendo da operao especificada, se o nmero de cpias de uma determinada
linha na tabela esquerda for L, e o nmero de cpias desta linha na tabela direita for
R, ento o nmero de linhas duplicadas desta determinada linha contidas na tabela de
sada ser (assumindo que a palavra chave ALL foi especificada):
UNION: ( L + R ).
EXCEPT: o maior entre ( L R ) e 0 (zero).
INTERSECT: o menor entre L e R.

Exemplos
-- Uma expresso de seleo
SELECT *
FROM ORG;
-- uma subconsulta
SELECT *
FROM (SELECT COD_CLASSE FROM CLASSE_AGENDA) AS CS;
-- uma subconsulta
SELECT *
FROM (SELECT COD_CLASSE FROM CLASSE_AGENDA) AS CS (COD_CLASSE);
-- uma unio
-- retornar todas as linhas das colunas NUM_DEP e GERENTE
-- da tabela ORG
-- e (1,2) e (3,4)
-- NUM_DEP e GERENTE so colunas do tipo SMALLINT.
SELECT NUM_DEP, GERENTE
FROM ORG
UNION ALL
VALUES (1,2), (3,4);
-- uma expresso de valores
VALUES (1,2,3);
-- Listar os nmeros dos empregados (NUM_EMP)
-- de todos os empregados na tabela EMPREGADOS
-- cujo nmero do departamento (DEP_TRAB) comea por 'E', ou
-- quem est alocado a projetos na tabela ATIV_EMP
-- cujo nmero do projetor (NUM_PROJ) igual a
-- 'MA2100', 'MA2110' ou 'MA2112'.
SELECT NUM_EMP
FROM EMPREGADOS
WHERE DEP_TRAB LIKE 'E%'
UNION
SELECT NUM_EMP
FROM ATIV_EMP
WHERE NUM_PROJ IN('MA2100', 'MA2110', 'MA2112');
-- Realizar a mesma consulta do exemplo anterior
-- e "marcar" as linhas da tabela EMPREGADOS com 'emp' e
-- as linhas da tabela ATIV_EMP com 'ativ_emp'.
-- Diferentemente do resultado do exemplo anterior,
-- esta consulta pode retornar o mesmo NUM_EMP mais de uma vez,
-- identificando de que tabela veio pela "marca" associada.
SELECT NUM_EMP, 'emp'
FROM EMPREGADOS
WHERE DEP_TRAB LIKE 'E%'
UNION
SELECT NUM_EMP, 'ativ_emp'
FROM ATIV_EMP
WHERE NUM_PROJ IN('MA2100', 'MA2110', 'MA2112');
-- Realizar a mesma consulta do exemplo anterior,
-- porm utilizando UNION ALL para que as linhas
-- duplicadas no sejam eliminadas.
SELECT NUM_EMP
FROM EMPREGADOS
WHERE DEP_TRAB LIKE 'E%'
UNION ALL
SELECT NUM_EMP
FROM ATIV_EMP
WHERE NUM_PROJ IN('MA2100', 'MA2110', 'MA2112');
-- Realizar a mesma consulta do exemplo anterior,
-- incluindo dois empregados adicionais que no
-- momento no se encontram em nenhuma tabela,
-- e marcar estas linhas como "nova".
SELECT NUM_EMP, 'emp'
FROM EMPREGADOS
WHERE DEP_TRAB LIKE 'E%'
UNION
SELECT NUM_EMP, 'ativ_emp'

57
Direitos autorais reservados

FROM ATIV_EMP
WHERE NUM_PROJ IN('MA2100', 'MA2110', 'MA2112')
UNION
VALUES ('NEWAAA', 'nova'), ('NEWBBB', 'nova');

RIGHT OUTER JOIN


RIGHT OUTER JOIN uma Operao JOIN que permite especificar a clusula de
juno. Preserva as linhas sem correspondncia da segunda tabela (direita), juntando-as
com uma linha nula na forma da primeira tabela (esquerda). (A LEFT OUTER JOIN B)
equivalente a (B RIGHT OUTER JOIN A), com as colunas em uma ordem diferente.

Sintaxe
ExpressoTabela RIGHT [ OUTER ] JOIN ExpressoTabela
{
ON ExpressoBooleana
}

O escopo das expresses na clusula ON inclui as tabelas correntes, e as tabelas nos


blocos de consulta externos ao SELECT corrente. A clusula ON pode fazer referncia a
tabelas que no esto sendo juntadas, e no obrigada a fazer referncia a nenhuma
das tabelas sendo juntadas (embora tipicamente o faa).

-- obter todos os pases e cidades correspondentes,


-- incluindo os pases sem nenhuma cidade
SELECT NOME_CIDADE, CIDADES.PAS
FROM CIDADES RIGHT OUTER JOIN PASES
ON CIDADES.COD_ISO_PAS = PASES.COD_ISO_PAS;
-- obter todos pases da frica e as cidades correspondentes,
-- incluindo os pases sem cidades
SELECT NOME_CIDADE, CIDADES.PAS
FROM CIDADES RIGHT OUTER JOIN PASES
ON CIDADES.COD_ISO_PAS = PASES.COD_ISO_PAS;
WHERE PASES.REGIO = 'frica';
-- uso da sintaxe sinnimo, RIGHT JOIN, para obter exatamente
-- os mesmos resultados do exemplo acima
SELECT NOME_CIDADE, CIDADES.PAS
FROM CIDADES RIGHT JOIN PASES
ON CIDADES.COD_ISO_PAS = PASES.COD_ISO_PAS
WHERE PASES.REGIO = 'frica';
-- a ExpressoTabela pode ser uma OperaoJuno. Portanto,
-- podem haver vrias operaes de juno na clusula FROM
-- Listar todos os nmeros e ltimo nome dos empregados,
-- juntamente com os nmeros e ltimo nome de seus gerentes
SELECT E.NUM_EMP, E.LTIMO_NOME, M.NUM_EMP, M.LTIMO_NOME
FROM EMPREGADOS E RIGHT OUTER JOIN
DEPARTAMENTOS RIGHT OUTER JOIN EMPREGADOS M
ON NUM_GER = M.NUM_EMP
ON E.DEP_TRAB = NUM_DEP;

SubconsultaEscalar
A SubconsultaEscalar pode ser colocada em qualquer lugar onde uma Expresso
permitida. A SubconsultaEscalar torna o resultado da ExpressoSeleo um valor
escalar, porque retorna apenas o valor de uma nica linha e coluna.

A consulta deve produzir uma nica linha com uma nica coluna.

Algumas vezes tambm chamada de expresso de subconsulta.

Sintaxe
(Consulta)

58
Direitos autorais reservados

-- a mdia sempre retorna um nico valor,


-- portanto a subconsulta uma SubconsultaEscalar
SELECT NOME, COMISS
FROM EQUIPE
WHERE EXISTS
(SELECT AVG(BNUS + 800)
FROM EMPREGADOS
WHERE COMISS < 5000
AND EMPREGADOS.LTIMO_NOME = UPPER(EQUIPES.NOME)
);
-- Introduzir uma maneira de "gerar" novos valores de dados,
-- utilizando uma consulta que seleciona da clusula VALUES
-- (que uma forma alternativa de FULLSELECT).
-- Esta consulta mostra como pode ser criada uma tabela chamada "X",
-- possuindo duas colunas "R1" e "R2" e uma linha de dados.
SELECT R1,R2
FROM (VALUES('GRUPO 1','GRUPO 2')) AS X(R1,R2);

ExpressoSeleo
A ExpressoSeleo a construo bsica SELECT-FROM-WHERE utilizada para
construir um valor tabela baseado na filtragem e projeo de valores de outras tabelas.

Sintaxe
SELECT [ DISTINCT | ALL ] ItemSeleo [ , ItemSeleo ]*
Clusula FROM
[ Clusula WHERE]
[ Clusula GROUP BY ]
[ Clusula HAVING ]

ItemSeleo:

{
* |
{ nome-da-tabela | nome-da-correlao } .* |
Expresso [AS nome-de-coluna-simples]
}

A clusula SELECT contm uma lista de expresses e um quantificador opcional que


aplicado aos resultados da Clusula FROM e da Clusula WHERE. Se for especificado
DISTINCT, somente ser includa no resultado uma cpia de qualquer valor linha. Os
nulos so considerados duplicados entre si para as finalidades do DISTINCT. Se no for
especificado um quantificador, ou se for especificado ALL, nenhuma linha ser removida
do resultado na aplicao da clusula SELECT (ALL o padro).

O ItemSeleo projeta um ou mais valores coluna de resultado na tabela resultado


sendo construda na ExpressoSeleo.

O resultado da Clusula FROM o produto cruzado dos itens do FROM. A Clusula


WHERE pode qualificar ainda mais este resultado.

A clusula WHERE faz com que as linhas do resultado sejam filtradas com base em
expresses booleanas. Somente as linhas para as quais a expresso booleana
avaliada como verdade so retornadas no resultado.

A clusula GROUP BY agrupa as linhas do resultado em subconjuntos que possuem


valores correspondentes em uma ou mais colunas. As clusulas GROUP BY so
utilizadas normalmente com agregaes.
Caso haja uma clusula GROUP BY, a clusula SELECT dever conter apenas
agregaes ou colunas de agrupamento. Se for desejado incluir uma coluna no
agrupada na clusula SELECT, esta coluna dever ser includa em uma expresso de

59
Direitos autorais reservados
agregao. Por exemplo:
-- Listar o chefe de cada departamento,
-- o nmero do departamento (DEP_TRAB),
-- e o salrio mdio do departamento (SALRIO)
-- para todos os departamentos na tabela EMPREGADOS.
-- Organizar a tabela de resultado na ordem ascendente
-- do salrio mdio do departamento
SELECT DEP_TRAB, AVG(SALRIO)
FROM EMPREGADOS
GROUP BY DEP_TRAB
ORDER BY 2;

Se no houver uma clusula GROUP BY, mas ItemSeleo contiver uma agregao que
no esteja em uma subconsulta, a consulta ser agrupada implicitamente. Toda a tabela
se torna um nico grupo.

A clusula HAVING restringe a tabela agrupada, especificando uma condio de procura


(muito semelhante clusula WHERE) que pode fazer referncia apenas s colunas de
agrupamento ou agregaes do escopo corrente. A clusula HAVING aplicada a cada
grupo da tabela agrupada. Se a clusula HAVING for avaliada como TRUE, a linha ser
retida para processamento adicional. Se a clusula HAVING for avaliada como FALSE
ou NULL, a linha ser desprezada. Se houver uma clusula HAVING mas no houver
GROUP BY, a tabela ser agrupada implicitamente em um grupo para toda a tabela.
O Derby processa a ExpressoSeleo na seguinte ordem:
Clusula FROM
Clusula WHERE
GROUP BY (ou GROUP BY implcito)
Clusula HAVING
Clusula SELECT

O resultado da ExpressoSeleo sempre uma tabela.


Quando a consulta no possui uma clusula FROM (quando est sendo construdo um
valor, e no obtendo dados de uma tabela), utilizada a instruo VALUES, e no a
ExpressoSeleo. Por exemplo:
VALUES CURRENT_TIMESTAMP

Consulte Expresso VALUES.

O curinga *
O * expandido como todas as colunas presentes nas tabelas da clusula FROM
associada.

nome-da-tabela.* e nome-da-correlao.* so expandidos como todas as colunas da


tabela identificada. Esta tabela deve estar listada na clusula FROM associada.

Atribuir nomes s colunas


Pode ser atribudo um nome a uma coluna do ItemSeleo utilizando a clusula AS.
Quando a ExpressoSeleo aparece no operador UNION, INTERSECT ou EXCEPT, os
nomes da primeira ExpressoSeleo so usados como os nomes das colunas no
resultado da operao. Se uma coluna do ItemSeleo no for uma expresso simples
de RefernciaColuna, ou no for dado um nome atravs da clusula AS, ser atribudo
para a mesma um nome nico gerado.
Estes nomes de colunas so teis em vrios casos:
So tornados disponveis no ResultSetMetaData do JDBC.
So utilizados como nomes das colunas na tabela resultante, quando a
ExpressoSeleo utilizada como subconsulta de tabela na clusula FROM.

60
Direitos autorais reservados
So utilizados na clusula ORDER BY como nomes de coluna disponveis para
classificao.

-- este exemplo mostra SELECT-FROM-WHERE


-- com uma clusula ORDER BY
-- e nome-da-correlao para as tabelas
SELECT CONSTRAINTNAME, COLUMNNAME
FROM SYS.SYSTABLES t, SYS.SYSCOLUMNS col,
SYS.SYSCONSTRAINTS cons, SYS.SYSCHECKS checks
WHERE t.TABLENAME = 'VOS'
AND t.TABLEID = col.REFERENCEID
AND t.TABLEID = cons.TABLEID
AND cons.CONSTRAINTID = checks.CONSTRAINTID
ORDER BY CONSTRAINTNAME;
-- Este exemplo mostra a utilizao da clusula DISTINCT
SELECT DISTINCT NUM_ATIV
FROM ATIV_EMP;
-- Este exemplo mostra como mudar o nome de uma expresso.
-- Utilizando a tabela EMPREGADOS,
-- listar o nmero do departamento (DEP_TRAB) e
-- o maior salrio do departamento (SALRIO) com nome mudado para BOSS
-- para todos os departamentos cujo salrio mximo seja menor que o
-- salrio mdio de todos os outros departamentos.
SELECT DEP_TRAB AS DPT, MAX(SALRIO) AS BOSS
FROM EMPREGADOS EMP_COR
GROUP BY DEP_TRAB
HAVING MAX(SALRIO) < (SELECT AVG(SALRIO)
FROM EMPREGADOS
WHERE NOT DEP_TRAB = EMP_COR.DEP_TRAB)
ORDER BY BOSS;

Instruo SELECT
A instruo SELECT consiste de uma consulta com uma Clusula ORDER BY opcional,
e uma Clusula FOR UPDATE opcional. A instruo SELECT possui este nome porque
tipicamente a primeira palavra da construo da consulta SELECT (A consulta inclui a
expresso VALUES, as expresses UNION, INTERSECT e EXCEPT, alm de
expresses SELECT).

A Clusula ORDER BY garante a ordem do ResultSet. A Clusula FOR UPDATE torna o


resultado um cursor atualizvel. A instruo SELECT suporta a clusula FOR FETCH
ONLY. A clusula FOR FETCH ONLY sinnimo da clusula FOR READ ONLY.
Lembre-se: Para se obter um ResultSet atualizvel, deve ser includa a clusula FOR
UPDATE com a clusula SELECT.
Sintaxe
Consulta
[Clusula ORDER BY]
[Clusula FOR UPDATE]
WITH {RR|RS|CS|UR}

Pode ser definido o nvel de isolamento da instruo SELECT utilizando a sintaxe WITH
{RR|RS|CS|UR}.

-- listar o nome da expresso SALRIO+BNUS+COMISS


-- como PAGAMENTO_TOTAL,
-- e ordenar pelo novo nome PAGAMENTO_TOTAL
SELECT PRIMEIRO_NOME, SALRIO+BNUS+COMISS AS PAGAMENTO_TOTAL
FROM EMPREGADOS
ORDER BY PAGAMENTO_TOTAL;
-- criar um cursor atualizvel atravs da clusula FOR UPDATE
-- para atualizar as colunas data de incio (PROJ_DATA_INCIO) e
-- data de trmino (PROJ_DATA_FIM) da tabela PROJETO
SELECT NUM_PROJ, PROJ_DATA_INCIO, PROJ_DATA_FIM
FROM PROJETO
FOR UPDATE OF PROJ_DATA_INCIO, PROJ_DATA_FIM;

61
Direitos autorais reservados

-- definir o nvel de isolamento como RR apenas para esta instruo


SELECT *
FROM VOS
WHERE ID_VO BETWEEN 'AA1111' AND 'AA1112'
WITH RR;
A instruo SELECT retorna um ResultSet. O cursor um ponteiro para uma linha
especfica do ResultSet. Nos aplicativos Java, todos os ResultSets so cursores. O
cursor atualizvel, ou seja, podem ser atualizadas e excludas linhas ao se caminhar
atravs do ResultSet, se a instruo SELECT que gerou o cursor e sua consulta
subjacente atenderem aos requisitos de poder ser atualizvel, conforme detalhado
abaixo. Deve ser utilizada a clusula FOR UPDATE quando se deseja gerar um cursor
atualizvel.
Note: A clusula ORDER BY permite ordenar os resultados do SELECT. Sem a clusula
ORDER BY, os resultados so retornados em ordem aleatria.

Se a instruo SELECT atender aos requisitos listados abaixo, os cursores sero


atualizveis apenas se for especificado FOR UPDATE na clusula FOR (consulte a
Clusula FOR UPDATE).

Requisitos para cursores atualizveis e ResultSets atualizveis


Somente os cursores simples, com SELECT em uma nica tabela, e os ResultSets
FORWARD_ONLY, podem ser atualizveis. A instruo SELECT para ResultSet
atualizvel possui a mesma sintaxe que a instruo SELECT para cursor atualizvel.
Para gerar cursores atualizveis:
A instruo SELECT no pode incluir a clusula ORDER BY.
A Consulta subjacente deve ser uma ExpressoSeleo.
A ExpressoSeleo da Consulta subjacente no pode incluir:
DISTINCT
Agregaes
Clusula GROUP BY
Clusula HAVING
A clusula FROM na Consulta subjacente no pode ter:
mais de uma tabela
qualquer outra coisa alm de um nome de tabela
ExpressoSeleo
subconsultas

No existe instruo na linguagem SQL para atribuir nome a um cursor. Em vez disso,
deve ser utilizada a API do JDBC para atribuir nomes a cursores ou obter os nomes
gerados pelo sistema. Para obter mais informaes, deve ser consultado "Atribuir nome
ou acessar o nome do cursor" no captulo 5 do Guia do Desenvolvedor do Derby.

Os cursores so apenas-de-leitura por padro. Para um cursor ser atualizvel, deve ser
especificado FOR UPDATE na clusula FOR (consulte a Clusula FOR UPDATE).

Sistema de dependncia de instruo


A instruo SELECT depende de todas as tabelas e vises especificadas na consulta, e
dos conglomerados (unidades de armazenamento, como heaps e ndices) escolhidos
como caminho de acesso para estas tabelas. A instruo CREATE INDEX no invalida a
instruo SELECT preparada. A instruo DROP INDEX invalida a instruo SELECT
preparada, se o ndice for um caminho de acesso na instruo. Quando o SELECT inclui
vises, tambm depende dos objetos do dicionrio dos quais as vises dependem
(consulte a Instruo CREATE VIEW).

Toda instruo UPDATE WHERE CURRENT ou DELETE WHERE CURRENT


preparada sobre cursor de SELECT depende do SELECT. A remoo do SELECT
atravs de uma instruo java.sql.Statement.close invalida UPDATE WHERE CURRENT
e DELETE WHERE CURRENT.

62
Direitos autorais reservados

O SELECT depende de todos os aliases utilizados na consulta. Remover um alis


invalida a instruo SELECT preparada, se a instruo utilizar o alis.

ExpressoTabela
A ExpressoTabela especifica uma tabela ou viso na Clusula FROM. a fonte de
onde a ExpressoSeleo seleciona o resultado.

Pode ser aplicado um nome de correlao para a tabela na ExpressoTabela, para que
suas colunas sejam qualificadas por este nome. Se no for especificado um nome de
correlao, o nome da tabela qualificar o nome da coluna. Quando especificado um
nome de correlao para a tabela, no pode ser utilizado o nome da tabela para
qualificar as colunas. Deve ser utilizado o nome da correlao quando se qualifica o
nome da coluna.

No podem haver dois itens na clusula FROM com o mesmo nome de correlao, e
nenhum nome de correlao pode ser idntico a um nome de tabela no qualificado
especificado na clusula FROM.
Alm disso, podem ser dados novos nomes s colunas da tabela atravs da clusula
AS. Algumas situaes onde til:
Quando utilizado VALUES Expresso na SubconsultaTabela, uma vez que no
h outra maneira de atribuir nomes s colunas de VALUES Expresso.
Quando os nomes das colunas de outra forma seriam idnticos aos das colunas de
outra tabela; mudar os nomes significa que no necessrio qualific-los.

A Consulta na SubconsultaTabela que aparece no ItemFrom pode conter vrias colunas


e retornar vrias linhas. Consulte SubconsultaTabela.

Para obter informaes sobre as redefinies do otimizador que podem ser


especificadas, consulte Ajuste do Derby.

Sintaxe
{
ExpressoTabelaOuViso | Operao JOIN
}

-- selecionar de uma expresso de juno


SELECT E.NUM_EMP, E.LTIMO_NOME, M.NUM_EMP, M.LTIMO_NOME
FROM EMPREGADOS E LEFT OUTER JOIN
DEPARTAMENTOS INNER JOIN EMPREGADOS M
ON NUM_GER = M.NUM_EMP
ON E.DEP_TRAB = NUM_DEP

ExpressoTabelaOuViso

{nome-da-tabela |nome-da-viso}
[ [ AS ] nome-da-correlao
[ (nome-de-coluna-simples [ , nome-de-coluna-simples]* ) ] ] ]

SubconsultaTabela
A SubconsultaTabela uma subconsulta que retorna vrias linhas.
Diferentemente da SubconsultaEscalar, a SubconsultaTabela permitida apenas:
como uma ExpressoTabela em uma Clusula FROM
com EXISTS, IN, ou comparaes quantificadas.

63
Direitos autorais reservados

Quando utilizada como uma ExpressoTabela em uma Clusula FROM, pode retornar
vrias colunas. Quando utilizada com EXISTS, pode retornar vrias colunas somente se
for utilizado o * para retornar vrias colunas.

Quando utilizada com IN ou comparaes quantificadas, deve retornar uma nica


coluna.

Sintaxe
(Consulta)

-- subconsulta utilizada como ExpressoTabela na clusula FROM


SELECT TABELA_VOS_VIRTUAL.ID_VO
FROM
(SELECT ID_VO, AEROPORTO_ORIGEM, AEROPORTO_DESTINO
FROM VOS
WHERE (AEROPORTO_ORIGEM = 'SFO' OR AEROPORTO_DESTINO = 'SCL') )
AS TABELA_VOS_VIRTUAL
-- subconsulta (VALUES expresso) utilizada como uma ExpressoTabela
-- na clusula FROM
SELECT MINHA_COLUNA1
FROM
(VALUES (1, 2), (3, 4))
AS MINHA_TABELA (MINHA_COLUNA1, MINHA_COLUNA2)
-- subconsulta com EXISTS
SELECT *
FROM VOS
WHERE EXISTS
(SELECT * FROM VOS WHERE AEROPORTO_DESTINO = 'SFO'
AND AEROPORTO_ORIGEM = 'GRU')
-- subconsulta usada com IN
SELECT ID_VO, NMERO_SEGMENTO
FROM VOS
WHERE ID_VO IN
(SELECT ID_VO
FROM VOS WHERE AEROPORTO_ORIGEM = 'SFO'
OR AEROPORTO_DESTINO = 'SCL')
-- subconsulta utilizada com uma comparao quantificada
SELECT NOME, COMISS
FROM EQUIPES
WHERE COMISS >
(SELECT AVG(BNUS + 800)
FROM EMPREGADOS
WHERE COMISS < 5000);

Instruo UPDATE
A instruo UPDATE define o valor na coluna.

Pode ser atualizada a linha corrente de um cursor atualizvel aberto. Se no houver


linha corrente, ou a linha corrente no satisfizer mais a consulta do cursor, ser lanada
um exceo.

Sintaxe
{
UPDATE nome-da-tabela
SET nome-da-coluna = Valor
[ , nome-da-coluna = Valor} ]*
[Clusula WHERE] |
UPDATE nome-da-tabela
SET nome-da-coluna = Valor
[ , nome-da-coluna = Valor ]*
WHERE CURRENT OF
}

A primeira forma sinttica chamada de atualizao procurada. A segunda forma


sinttica chamada de atualizao posicionada.

64
Direitos autorais reservados

Nas atualizaes procuradas, so atualizadas todas as linhas da tabela para as quais a


clusula WHERE avaliada como TRUE.

Nas atualizaes posicionadas, somente podem ser atualizadas as colunas includas na


Clusula FOR UPDATE da instruo SELECT que criou o cursor. Se a instruo
SELECT no incluir a clusula FOR UPDATE, o cursor ser apenas-de-leitura, no
podendo ser utilizado para atualizaes.

A especificao de DEFAULT para o valor atualizado, define o valor da coluna como o


valor padro definido nesta tabela.

-- Todos os empregados, exceto o gerente,


-- do departamento (DEP_TRAB) 'E21' foram temporariamente
-- reatribudos. Indique isto alterando seus cargos (CARGO)
-- para NULL, e os valores de seus pagamentos (SALRIO, BNUS, COMISS)
-- para zero, na tabela EMPREGADOS.
UPDATE EMPREGADOS
SET CARGO=NULL, SALRIO=0, BNUS=0, COMISS=0
WHERE DEP_TRAB = 'E21' AND CARGO <> 'GERENTE'
-- Promover o cargo (CARGO) de determinado empregado para GERENTE
UPDATE EMPREGADOS
SET CARGO = 'GERENTE'
WHERE CURRENT OF CURS1;
-- Multiplicar a equipe do projeto (PROJ_EQUIPE) por 1.5
stmt.executeUpdate("UPDATE PROJETO SET PROJ_EQUIPE = "
"PROJ_EQUIPE * 1.5" +
"WHERE CURRENT OF" + ResultSet.getCursorName());
-- Alterar o cargo (CARGO) do empregado nmero (NUM_EMP) '000290'
-- na tabela EMPREGADOS para o seu valor DEFAULT que NULL
UPDATE EMPREGADOS
SET CARGO = DEFAULT
WHERE NUM_EMP = '000290';

Sistema de dependncia de instruo


A instruo de atualizao procurada depende da tabela sendo atualizada, de todos os
seus conglomerados (unidades de armazenamento como heaps e ndices), todas as
suas restries, e de todas as outras tabelas referenciadas na clusula WHERE e nas
expresses SET. A execuo de uma instruo CREATE ou DROP INDEX, ou de uma
instruo ALTER TABLE, na tabela de destino de uma instruo de atualizao
procurada preparada, invalida a instruo de atualizao procurada preparada.

A instruo de atualizao posicionada depende do cursor e de todas as tabelas que o


cursor faz referncia. A atualizao posicionada pode ser compilada mesmo se o cursor
ainda no tiver sido aberto. Entretanto, a remoo do cursor aberto atravs do mtodo
close do JDBC invalida a atualizao posicionada.

A execuo de uma instruo CREATE ou DROP INDEX, ou de uma instruo ALTER


TABLE, na tabela de destino de uma instruo de atualizao posicionada preparada,
invalida a instruo de atualizao posicionada preparada.

A remoo de um alis invalida a instruo de atualizao preparada, se a instruo


utilizar o alis.

Remover ou adicionar gatilhos na tabela de destino da atualizao invalida a instruo


de atualizao.
Valor

Expresso | DEFAULT

VALUES Expresso
65
Direitos autorais reservados

"VALUES Expresso" permite construir uma linha ou uma tabela a partir de valores. A
instruo VALUES utilizada quando no existe uma clusula FROM. Esta construo
pode ser utilizada em todos os locais onde uma consulta pode ser utilizada e, portanto,
pode ser utilizada como uma instruo que retorna um ResultSet, dentro de expresses
e instrues sempre que uma subconsulta for permitida, e como fonte de valores para a
instruo INSERT.

Sintaxe
{
VALUES ( Valor {, Valor }* )
[ , ( Valor {, Valor }* ) ]* |
VALUES Valor [ , Valor ]* |
}

A primeira forma constri linhas com vrias colunas. A segunda forma constri linhas
com uma nica coluna, com cada expresso sendo o valor da coluna da linha.

A palavra chave DEFAULT permitida somente quando a expresso VALUES est em


uma instruo INSERT. A especificao de DEFAULT para a coluna insere o valor
padro da coluna na coluna. Outra forma de inserir o valor padro na coluna omitir a
coluna na lista de colunas, e somente inserir valores nas outras colunas da tabela.

-- 3 linhas de 1 coluna
VALUES (1),(2),(3);
-- 3 linhas de 1 coluna
VALUES 1, 2, 3;
-- 1 linha de 3 colunas
VALUES (1, 2, 3);
-- 3 linhas de 2 colunas
VALUES (1,21),(2,22),(3,23);
-- construo de uma tabela derivada
VALUES ('laranja', 'laranja'), ('ma', 'vermelha'),
('banana', 'amarela')
-- Inserir dois novos departamentos na tabela DEPARTAMENTOS
-- utilizando uma instruo, mas no atribuir gerente
-- aos novos departamentos.
INSERT INTO DEPARTAMENTOS (NUM_DEP, NOME_DEP, ADMRDEPT)
VALUES ('B11', 'COMPRAS', 'B01'),
('E41', 'ADMINISTRAO DE BANCO DE DADOS', 'E01')
-- inserir uma linha com valor DEFAULT para a coluna PROJ_PRINC
INSERT INTO PROJETO (NUM_PROJ, NOME_PROJ, NUM_DEP, EMP_RESP,
PROJ_DATA_INCIO, PROJ_PRINC)
VALUES ('PL2101', 'ENSURE COMPAT PLAN', 'B01', '000020',
CURRENT_DATE, DEFAULT);
-- utilizao de funo nativa
VALUES CURRENT_DATE
-- obter o valor a partir de uma expresso arbitrria
VALUES (3*29, 26.0E0/3)
-- obter o valor retornado por uma funo nativa
VALUES CHAR(1)

Valor

Expresso | DEFAULT

Clusula WHERE
A clusula WHERE uma parte opcional da ExpressoSeleo,Instruo DELETE e da
Instruo UPDATE. A clusula WHERE permite selecionar linhas baseado em uma
expresso booleana. Somente as linhas para as quais a expresso avaliada como

66
Direitos autorais reservados
TRUE so retornadas no resultado, ou no caso da instruo DELETE, excludas, ou no
caso da instruo UPDATE, atualizadas.

Sintaxe
WHERE Expresso booleana

So permitidas expresses booleanas na clusula WHERE. A maioria das expresses


gerais listadas na Tabela de Expresses podem resultar em um valor booleano.

Alm disso, l esto as expresses booleanas mais comuns. Os operadores booleanos


especficos listados na Tabela 10 recebem um ou mais operandos; as expresses
retornam um valor booleano.

-- descobrir os vos onde nenhum assento da


-- classe executiva foi reservado
SELECT *
FROM DISPONIBILIDADE_VO
WHERE ASSENTOS_EXECUTIVOS_OCUPADOS IS NULL
OR ASSENTOS_EXECUTIVOS_OCUPADOS = 0
-- Juno das tabelas ATIV_EMP e EMPREGADOS
-- selecionar todas as colunas da tabela ATIV_EMP, e adicionar o
-- sobrenome do empregado (LTIMO_NOME) da tabela EMPREGADOS
-- a todas as linhas do resultado.
SELECT SAMP.ATIV_EMP.*, LTIMO_NOME
FROM SAMP.ATIV_EMP, SAMP.EMPREGADOS
WHERE ATIV_EMP.NUM_EMP = EMPREGADOS.NUM_EMP;
-- Determinar o nmero do empregado e o salrio dos representantes de
venda
-- junto com o salrio mdio e a conta principal de seus departamentos.
-- Esta consulta dever criar primeiro um novo-nome-de-coluna
especificado
-- na clusula AS, que est fora do FULLSELECT (DINFO),
-- para obter as colunas SALRIO_MDIO e CONTA_EMP,
-- assim como a coluna NUM_DEP utilizada na clusula WHERE
SELECT THIS_EMP.NUM_EMP, THIS_EMP.SALRIO, DINFO.SALRIO_MDIO,
DINFO.CONTA_EMP
FROM EMPREGADOS THIS_EMP,
(SELECT OUTROS.DEP_TRAB AS NUM_DEP,
AVG(OUTROS.SALRIO) AS SALRIO_MDIO,
COUNT(*) AS CONTA_EMP
FROM EMPREGADOS OUTROS
GROUP BY OUTROS.DEP_TRAB
) AS DINFO
WHERE THIS_EMP.CARGO = 'REP_VENDAS'
AND THIS_EMP.DEP_TRAB = DINFO.NUM_DEP;

Clusula WHERE CURRENT OF


A clusula WHERE CURRENT OF uma clusula de algumas instrues UPDATE e
DELETE. Permite realizar atualizaes e excluses posicionadas em cursores
atualizveis. Para obter mais informaes sobre cursores atualizveis deve ser
consultada a Instruo SELECT.

Sintaxe
WHERE CURRENT OF nome-do-cursor

Statement s = conn.createStatement();
s.setCursorName("ResultadosLinhasAereas");
ResultSet rs = conn.executeQuery(
"SELECT LINHAS_AREA, TARIFA_BSICA " +
"FROM LINHAS_AREAS FOR UPDATE OF TARIFA_BSICA");
Statement s2 = conn.createStatement();
s2.executeUpdate("UPDATE LINHAS_AREAS SET TARIFA_BSICA = TARIFA_BSICA
" +
"+ .25 WHERE CURRENT OF ResultadosLinhasAereas");

67
Direitos autorais reservados

Funes nativas
A funo nativa uma expresso na qual a palavra chave do SQL ou o operador
especial executa alguma operao. As funes nativas utilizam palavras chave ou
operadores nativos especiais. As funes nativas so IdentificadoresSQL92 e no
diferenciam letras maisculas e minsculas. Deve ser observado que as funes em
escape, como TIMESTAMPADD e TIMESTAMPDIFF, so acessveis apenas utilizando
a sintaxe de escape do JDBC para funes, podendo ser encontradas em Sintaxe de
escape do JDBC.

Funes nativas padro


ABS ou ABSVAL
BIGINT
CAST
CHAR
Concatenao
Expresses NULLIF e CASE
CURRENT_DATE
CURRENT ISOLATION
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_USER
DATE
DAY
DOUBLE
HOUR
IDENTITY_VAL_LOCAL
INTEGER
LENGTH
LOCATE
LCASE ou LOWER
LTRIM
MINUTE
MOD
MONTH
RTRIM
SECOND
SESSION_USER
SMALLINT
SQRT
SUBSTR
TIME
TIMESTAMP
UCASE ou UPPER
USER
VARCHAR
YEAR

Agregaes (funes de conjunto)


Esta seo descreve as agregaes (tambm descritas como funes de conjunto no
ANSI SQL-92 e como funes de coluna em algumas literaturas sobre banco de dados).
As agregaes fornecem meios de avaliar uma expresso para um conjunto de linhas.
Enquanto as outras funes nativas operam sobre uma nica expresso, as funes de
agregao operam sobre conjuntos de valores reduzindo-os a um nico valor escalar. As
agregaes nativas podem calcular o valor mnimo, o valor mximo, a soma e a mdia

68
Direitos autorais reservados
de uma expresso com relao a um conjunto de valores, assim como contar linhas.
Tambm podem ser criadas agregaes do usurio para executar outras funes de
conjunto, como calcular o desvio padro.

As agregaes nativas podem operar nos tipos de dado mostrados em Tipos de dado
permitidos pelas agregaes nativas.
Tabela 2. Tipos de dado permitidos pelas agregaes nativas

' Tipos de dado numricos


Todos os tipos nativos
COUNT X X
MIN ' X
MAX ' X
AVG ' X
SUM ' X

As agregaes so permitidas apenas:


No ItemSeleo da ExpressoSeleo.
Na Clusula HAVING.
Na Clusula ORDER BY (utilizando um nome alis) se a agregao aparecer no
resultado do bloco de consulta relevante. Ou seja, permitido um alis para uma
agregao na Clusula ORDER BY se, e somente se, a agregao aparecer no
ItemSeleo da ExpressoSeleo.

Todas as expresses nos ItensSelecionados da ExpressoSeleo devem ser


agregaes ou colunas agrupadas (consulte a Clusula GROUP BY) (O mesmo
verdade se houver uma clusula HAVING sem uma clusula GROUP BY). Isto se deve
ao fato do ResultSet da ExpressoSeleo dever ser um escalar (valor nico) ou um
vetor (vrios valores), mas no a uma mistura dos dois (as agregaes tm como
resultado um valor escalar, e a referncia a uma coluna pode ter como resultado um
vetor). Por exemplo, a consulta a seguir mistura valor escalar e vetor e, portanto, no
vlida:
-- invlido
SELECT MIN(TEMPO_VO), ID_VO
FROM VOS

No so permitidas agregaes em referncias externas (correlaes). Isto significa que


se a subconsulta contiver uma agregao, esta agregao no poder avaliar uma
expresso que inclua uma referncia a uma coluna do bloco de consulta externo. Por
exemplo, a seguinte consulta no vlida porque SUM opera sobre uma coluna da
consulta externa:
SELECT c1
FROM t1
GROUP BY c1
HAVING c2 >
(SELECT t2.x
FROM t2
WHERE t2.y = SUM(t1.c3))

O cursor declarado em um ResultSet que inclui uma agregao no bloco de consulta


externo no atualizvel.

Esta seo inclui as seguintes agregaes:


AVG

69
Direitos autorais reservados
COUNT
MAX
MIN
SUM

ABS ou ABSVAL
ABS, ou ABSVAL, retorna o valor absoluto da expresso numrica. O tipo retornado o
tipo do parmetro. So suportados todos os tipos numricos nativos (DECIMAL,
DOUBLE PRECISION, FLOAT, INTEGER, BIGINT, NUMERIC, REAL e SMALLINT).

Sintaxe
ABS(ExpressoNumrica)

-- retorna 3
VALUES ABS(-3)

AVG
AVG uma funo de agregao que calcula a mdia de uma expresso sobre um
conjunto de linhas (consulte Agregaes (funes de conjunto)). AVG somente
permitida nas expresses que tm como resultado tipos de dado numricos.

Sintaxe
AVG ( [ DISTINCT | ALL ] Expresso )

O qualificador DISTINCT elimina as linhas duplicadas. O qualificador ALL mantm as


linhas duplicadas. ALL o valor padro, se nem ALL nem DISTINCT for especificado.
Por exemplo, se uma coluna contiver os valores 1.0, 1.0, 1.0, 1.0 e 2.0, AVG(coluna)
retornar um valor menor que AVG(DISTINCT coluna).
Somente permitida uma expresso de agregao DISTINCT por ExpressoSeleo.
Por exemplo, a seguinte consulta no vlida:
SELECT AVG (DISTINCT TEMPO_VO), SUM (DISTINCT MILHAS)
FROM VOS

A expresso pode conter vrias referncias a colunas ou expresses, mas no pode


conter outra agregao ou subconsulta. Deve ter como resultado um tipo de dado
numrico do SQL-92. Portanto, podem ser chamados mtodos que tm como resultado
tipos de dado SQL-92. Se uma expresso for avaliada como NULL, a agregao saltar
este valor.
O tipo de dado do resultado o mesmo da expresso em que opera (nunca estoura).
Por exemplo, a seguinte consulta retorna o INTEGER 1, que pode no ser o esperado:
SELECT AVG(C1)
FROM (VALUES (1), (1), (1), (1), (2)) AS MINHA_TABELA (C1)

Se for desejada uma preciso maior, a expresso dever ser convertida para outro tipo
de dado:
SELECT AVG(CAST (C1 AS DOUBLE PRECISION))
FROM (VALUES (1), (1), (1), (1), (2)) AS MINHA_TABELA (c1)

BIGINT

70
Direitos autorais reservados
A funo BIGINT retorna a representao inteira de 64 bits do nmero ou da cadeia de
caracteres na forma de uma constante inteira.
Sintaxe
BIGINT (ExpressoCaractere | ExpressoNumrica )
ExpressoCaractere
Uma expresso que retorna um valor cadeia de caracteres, de comprimento no
maior que o comprimento mximo da constante caractere. Os brancos iniciais e finais
so eliminados, e a cadeia resultante deve estar em conformidade com as regras de
formao de uma constante inteira do SQL. A cadeia de caracteres no pode ser
uma cadeia longa. Se o argumento for uma ExpressoCaractere, o resultado ser o
mesmo nmero que seria produzido se a constante inteira correspondente fosse
atribuda a uma coluna ou a uma varivel inteira grande.
ExpressoNumrica
Uma expresso que retorna um valor de qualquer tipo de dado numrico nativo. Se o
argumento for uma ExpressoNumrica, o resultado ser o mesmo nmero que seria
produzido se o argumento fosse atribudo a uma coluna ou a uma varivel inteira
grande. Se a parte inteira do argumento no estiver dentro da faixa dos inteiros
grandes, ocorrer um erro. A parte decimal do argumento ser truncada, se estiver
presente.
O resultado da funo um inteiro grande. Se o argumento puder ser nulo, o resultado
poder ser nulo; Se o argumento for nulo, o resultado ser o valor nulo.

Utilizando a tabela EMPREGADOS selecionar a coluna NUM_EMP na forma de inteiro


grande para processamento posterior no aplicativo:
SELECT BIGINT (NUM_EMP) FROM EMPREGADOS

CAST
CAST converte o valor de um tipo de dado para outro, e fornece tipo de dado para o
parmetro dinmico (?) e para o valor NULL.

As expresses CAST so permitidas em qualquer lugar onde uma expresso


permitida.

Sintaxe
CAST ( [ Expresso | NULL | ? ]
AS TipoDado)

O tipo de dado para o qual a expresso est sendo convertida o tipo de destino. O tipo
de dado da expresso a partir da qual est sendo feita a converso o tipo de origem.

Converses CAST entre tipos de dado SQL-92


A tabela a seguir mostra as converses explcitas vlidas entre tipos de origem e tipos
de destino para os tipos de dado do SQL.
Tabela 3. Converses explcitas entre tipos de origem e tipos de destino para os
tipos de dado do SQL
Esta tabela mostra quais converses explcitas entre tipos de dado so vlidas. A
primeira coluna da tabela lista o tipo de origem, enquanto a primeira linha lista os tipos
de destino. "S" indica que a converso da origem para o destino vlida.

71
Direitos autorais reservados

Tipos
S I B D R D F C V L C V L C B D T T
M N I E E O L H A O H A O L L A I I
A T G C A U O A R N A R N O O T M M
L E I I L B A R C G R C G B B E E E
L G N M L T H H S
I E T A E A V F A V T
N R L R A O R A A
T R R R M
C F C P
H B O H
A I R A
R T R
B
D I F
A T O
T R
A D
A B
T I
A T

D
A
T
A

SMALLINT S S S S S S S S - - - - - - - - - -
INTEGER S S S S S S S S - - - - - - - - - -
BIGINT S S S S S S S S - - - - - - - - - -
DECIMAL S S S S S S S S - - - - - - - - - -
REAL S S S S S S S - - - - - - - - - - -
DOUBLE S S S S S S S - - - - - - - - - - -
FLOAT S S S S S S S - - - - - - - - - - -
CHAR S S S S - - - S S S - - - S - S S S
VARCHAR S S S S - - - S S S - - - S - S S S
LONG - - - - - - - S S S - - - S - - - -
VARCHAR
CHAR FOR BIT - - - - - - - - - - S S S S S - - -
DATA
VARCHAR FOR - - - - - - - - - - S S S S S - - -
BIT DATA
LONG - - - - - - - - - - S S S S S - - -
VARCHAR FOR
BIT DATA
CLOB - - - - - - - S S S - - - S - - - -
BLOB - - - - - - - - - - - - - - S - - -
DATE - - - - - - - S S - - - - - - S - S
TIME - - - - - - - S S - - - - - - - S S
TIME STAMP - - - - - - - S S - - - - - - S S S

72
Direitos autorais reservados

Se a converso for vlida, ento CAST ser permitida. Incompatibilidades de tamanhos


entre os tipos de origem e de destino podem causar erros em tempo de execuo.

Notas
Nesta discusso, os tipos de dado SQL-92 do Derby so categorizados da seguinte
maneira:
numrico
numrico exato (SMALLINT, INTEGER, BIGINT, DECIMAL, NUMERIC)
numrico aproximado (FLOAT, REAL, DOUBLE PRECISION)
cadeia
cadeia de caracteres (CLOB, CHAR, VARCHAR, LONG VARCHAR)
cadeia de bits (BLOB, CHAR FOR BIT DATA, VARCHAR FOR BIT DATA,
LONG VARCHAR FOR BIT DATA)
data/hora
DATE
TIME
TIMESTAMP

Converses de tipos de dado numricos


Um tipo numrico pode ser convertido para qualquer outro tipo numrico. Se o tipo de
destino no puder representar o componente no-fracionrio sem truncamento, ser
lanada uma excesso. Se o destino numrico no puder representar o componente
fracionrio (escala) da origem numrica, ento a origem ser truncada em silncio para
caber no destino. Por exemplo, converter 763.1234 para INTEGER tem como resultado
763.

Converses de/para cadeias de bits


As cadeias de bits podem ser convertidas para outras cadeias de bits, mas no para
cadeias de caracteres. As cadeias que so convertidas para cadeias de bits so
preenchidas com zero no final, para se ajustarem ao tamanho da cadeia de bits do
destino. O tipo BLOB mais limitado, e requer converso explcita. Na maioria dos
casos o tipo BLOB no pode ser convertido de, ou para, outros tipos.

Converses de valores de data/hora


Um valor data/hora sempre pode ser convertido de e para TIMESTAMP. Se DATE for
convertido para TIMESTAMP, o componente TIME do TIMESTAMP resultante ser
sempre 00:00:00. Se um valor de dado TIME for convertido para TIMESTAMP, o
componente DATE de TIMESTAMP ser definido como o valor de CURRENT_DATE do
momento da execuo de CAST. Se TIMESTAMP for convertido para DATE, o
componente TIME ser truncado em silncio. Se TIMESTAMP for convertido para TIME,
o componente DATE ser truncado em silncio.

SELECT CAST (MILHAS AS INT)


FROM VOS
-- converter de carimbo do tempo para texto
INSERT INTO MINHA_TABELA (COLUNA_TEXTO)
VALUES (CAST (CURRENT_TIMESTAMP AS VARCHAR(100)))
-- NULL deve ser convertido para algum tipo de dado para poder ser usado
SELECT LINHA_AREA
FROM LINHAS_AREAS
UNION ALL
VALUES (CAST (NULL AS CHAR(2)))
-- converso de preciso dupla para decimal
SELECT CAST (TEMPO_VO AS DECIMAL(5,2))
FROM VOS
-- converso de SMALLINT para BIGINT
VALUES CAST (CAST (12 AS SMALLINT) AS BIGINT)

73
Direitos autorais reservados

CHAR
A funo CHAR retorna a representao cadeia de caracteres de comprimento fixo de:
uma cadeia de caracteres, se o primeiro argumento for algum tipo de cadeia de
caracteres.
um valor data/hora, se o primeiro argumento for DATE, TIME ou TIMESTAMP.
um nmero decimal, se o primeiro argumento for um nmero decimal.
um nmero de ponto flutuante de preciso dupla, se o primeiro argumento for
DOUBLE ou REAL.
um nmero inteiro, se o primeiro argumento for SMALLINT, INTEGER ou BIGINT.
O primeiro argumento deve ser de um tipo de dado nativo. O resultado da funo uma
cadeia de caracteres de comprimento fixo. Se o primeiro argumento puder ser nulo, o
resultado poder ser nulo. Se o primeiro argumento for nulo, o resultado ser o valor
nulo.
Sintaxe caractere para caractere
CHAR (ExpressoCaractere [, inteiro] )
ExpressoCaractere
Uma expresso que retorna um valor do tipo de dado CHAR, VARCHAR, LONG
VARCHAR ou CLOB.
inteiro
O atributo comprimento da cadeia de caracteres de comprimento fixo resultante. O
valor deve estar entre 0 e 254.
Se o comprimento da expresso caractere for menor que o atributo comprimento do
resultado, o resultado ser preenchido com brancos at o comprimento do resultado. Se
o comprimento da expresso caractere for maior que o atributo comprimento do
resultado, ser realizado um truncamento. Retorna uma advertncia, a menos que os
caracteres truncados sejam todos brancos e a expresso caractere no seja uma cadeia
longa (LONG VARCHAR ou CLOB).

Sintaxe inteiro para caractere


CHAR (ExpressoInteira)
ExpressoInteira
Uma expresso que retorna um valor com tipo de dado inteiro (SMALLINT, INTEGER
ou BIGINT).
O resultado a representao cadeia de caracteres do argumento na forma de uma
constante inteira do SQL. O resultado consiste de n caracteres, que so os dgitos
significativos que representam o valor do argumento, precedidos pelo sinal menos se o
argumento for negativo. alinhado esquerda.
Se o primeiro argumento for um SMALLINT: O comprimento do resultado ser igual
a 6. Se o nmero de caracteres do resultado for menor que 6, ento o resultado
ser preenchido direita com brancos at o comprimento 6.
Se o primeiro argumento for um INTEGER: O comprimento do resultado ser igual
11. Se o nmero de caracteres no resultado for menor que 11, ento o resultado
ser preenchido direita com brancos at o comprimento 11.
Se o primeiro argumento for um BIGINT: O comprimento do resultado ser igual a
20. Se o nmero de caracteres no resultado for menor que 20, ento o resultado
ser preenchido direita com brancos at o comprimento 20.
Sintaxe de data/hora para caractere
CHAR (ExpressoDataHora)
ExpressoDataHora
Uma expresso de um dos trs seguintes tipos de dado:
DATE: O resultado a representao caractere da data. O comprimento do

74
Direitos autorais reservados
resultado 10.
TIME: O resultado a representao caractere da hora. O comprimento do
resultado 8.
TIMESTAMP: O resultado a representao caractere do carimbo do tempo. O
comprimento do resultado 26.
Decimal para caractere
CHAR (ExpressoDecimal)
ExpressoDecimal
Uma expresso que retorna um valor com tipo de dado decimal. Se for desejada uma
preciso e escala diferente, poder ser utilizado primeiro a funo escalar DECIMAL
para fazer a alterao.
Sintaxe ponto flutuante para caractere
CHAR (ExpressoPontoFlutuante)
ExpressoPontoFlutuante
Uma expresso que retorna um valor como tipo de dado de ponto flutuante
(DOUBLE ou REAL).
Utilizar a funo CHAR para retornar os valores para NVEL_EDUC (definido como
SMALLINT) como uma cadeia de caracteres de comprimento fixo:
SELECT CHAR(NVEL_EDUC) FROM EMPREGADOS
Um NVEL_EDUC igual a 18 retorna como o valor CHAR(6) igual a '18 ' (18 seguido
por quatro brancos).

LENGTH
LENGTH aplicado tanto a expresses cadeia de caracteres quanto a expresses
cadeia de bits, e retorna o nmero de caracteres no resultado.

Como todos os tipos de dado nativos so convertidos implicitamente em cadeias, esta


funo pode atuar em todos os tipos de dados nativos.

Sintaxe
LENGTH ( { ExpressoCaractere | ExpressoBit } )

-- retorna 20
VALUES LENGTH('supercalifragilistic')
-- retorna 1
VALUES LENGTH(X'FF')
-- retorna 4
VALUES LENGTH(1234567890)

Concatenao
O operador de concatenao, ||, concatena seu operando direita ao final do seu
operando esquerda. Opera em expresso de caractere e de bit.

Como todos os tipos de dado nativos so convertidos implicitamente em cadeias, esta


funo pode atuar em todos os tipos de dado nativos.

Sintaxe
{

75
Direitos autorais reservados

{ ExpressoCaractere || ExpressoCaractere } |
{ ExpressoBit || ExpressoBit }
}

Nas cadeias de caracteres, se os operandos esquerdo e direito forem do tipo CHAR, o


tipo do resultado ser CHAR; seno, ser VARCHAR. As regras normais de
preenchimento/corte para CHAR e VARCHAR se aplicam ao resultado deste operador.

O comprimento da cadeia resultante a soma dos comprimentos dos dois operandos.

Para as cadeias de bits, se os operandos esquerdo e direito forem do tipo CHAR FOR
BIT DATA, o tipo do resultado ser CHAR FOR BIT DATA; seno, ser VARCHAR FOR
BIT DATA.

--retorna 'supercalifragilisticexbealidocious(sp?)'
VALUES 'supercalifragilistic' || 'exbealidocious' || '(sp?)'
-- retorna NULL
VALUES CAST (NULL AS VARCHAR(7)) || 'UmaCadeiaDeCaracteres'
-- retorna '130asdf'
VALUES '130' || 'asdf'

Expresses NULLIF e CASE


So utilizadas as expresses CASE e NULLIF para as expresses condicionais no
Derby.

Sintaxe da expresso NULLIF


NULLIF(L,R)
A expresso NULLIF muito semelhante expresso CASE. Por exemplo:
NULLIF(V1,V2)
equivale seguinte expresso CASE:
CASE WHEN V1=V2 THEN NULL ELSE V1 END

Sintaxe da expresso CASE

A expresso CASE pode ser colocada em qualquer lugar onde permitida uma
expresso. Escolhe a expresso a ser avaliada baseado em um teste booleano.

CASE WHEN ExpressoBooleana THEN ExpressoThen ELSE ExpressoElse END

A ExpressoThen e a ExpressoElse so expresses que devem possuir tipos


compatveis. Para os tipos nativos, isto significa que estes tipos devem ser o mesmo, ou
deve haver uma converso nativa de alargamento entre os tipos.

No necessrio utilizar a expresso CASE para evitar NullPointerExceptions quando


uma coluna que pode ter nulo se torna receptora do mtodo.
-- retorna 3
VALUES CASE WHEN 1=1 THEN 3 ELSE 4 END;
Se o valor da instncia especificada na chamada do mtodo de instncia for nulo, o
resultado da chamada ser nulo (SQL NULL). Entretanto, ainda necessrio utilizar a

76
Direitos autorais reservados
expresso CASE para uma coluna que pode ter nulo, quando a coluna for o parmetro
de um mtodo primitivo.

COUNT
COUNT uma funo de agregao que conta o nmero de linhas acessadas pela
expresso (consulte Agregaes (funes de conjunto)). COUNT permitida em todos
os tipos de expresso.

Sintaxe
COUNT ( [ DISTINCT | ALL ] Expresso )

O qualificador DISTINCT elimina as linhas duplicadas. O qualificador ALL mantm as


linhas duplicadas. assumido ALL se no for especificado nem ALL nem DISTINCT. Por
exemplo, se uma coluna contiver os valores 1, 1, 1, 1 e 2, COUNT(coluna) retornar um
valor maior que COUNT(DISTINCT coluna).

Somente permitida uma expresso de agregao DISTINCT por ExpressoSeleo .


Por exemplo, a seguinte consulta no permitida:

-- consulta no permitida
SELECT COUNT (DISTINCT TEMPO_VO), SUM (DISTINCT MILHAS)
FROM VOS

A expresso pode conter vrias referncias a colunas ou expresses, mas no pode


conter outra agregao ou subconsulta. Se a Expresso resultar em NULL, a agregao
no ser processada para este valor.

O tipo de dado do resultado de COUNT BIGINT.

-- Contar o nmero de pases em cada regio,


-- mostrando apenas as regies que possuem ao menos 2 pases
SELECT COUNT (PAS), REGIO
FROM PASES
GROUP BY REGIO
HAVING COUNT (PAS) > 1

COUNT(*)
COUNT(*) uma funo de agregao que conta o nmero de linhas acessadas. No
so eliminados nulos nem linhas duplicadas. COUNT(*) no opera em uma expresso.

Sintaxe
COUNT(*)

O tipo de dado do resultado BIGINT.

-- Contar o nmero de linhas da tabela VOS


SELECT COUNT(*)
FROM VOS

CURRENT DATE
CURRENT DATE sinnimo de CURRENT_DATE.

CURRENT_DATE
77
Direitos autorais reservados

CURRENT_DATE retorna a data corrente; o valor retornado no muda se for executado


mais de uma vez na mesma instruo. Isto significa que o valor fixo, mesmo que haja
uma longa demora entre as linhas trazidas pelo cursor.

Sintaxe
CURRENT_DATE

ou, como alternativa

CURRENT DATE

-- descobrir os vos futuros disponveis:


SELECT * FROM VOS_DISPONIBILIDADE WHERE DATA_VO > CURRENT_DATE;

CURRENT ISOLATION
CURRENT ISOLATION retorna o nvel de isolamento corrente como um valor CHAR(2)
contendo ""(branco), "UR", "CS", "RS" ou "RR".

Sintaxe
CURRENT ISOLATION

VALUES CURRENT ISOLATION

CURRENT SCHEMA
CURRENT SCHEMA retorna o nome do esquema utilizado para qualificar as referncias
a objetos do banco de dados no qualificadas.
Note: CURRENT SCHEMA e CURRENT SQLID so sinnimos.
Estas funes retornam uma cadeia de at 128 caracteres.

Sintaxe
CURRENT SCHEMA
-- ou, como alternativa:
CURRENT SQLID

-- Fazer com que a coluna NOME tenha como valor padro


-- o esquema corrente:
CREATE TABLE MINHA_TABELA (ID INT, NOME VARCHAR(128) DEFAULT CURRENT
SQLID)