# Instrução DECLARE GLOBAL TEMPORARY TABLE

A instrução DECLARE GLOBAL TEMPORARY TABLE define uma tabela temporária para a conexão corrente. Estas tabelas não residem nos catálogos do sistema, e não são persistentes. As tabelas temporárias existem somente durante a conexão em que foram declaradas, não podendo ser referenciadas de fora da conexão. Ao fechar a conexão, as linhas da tabela são excluídas e a descrição em-memória da tabela temporária é removida.

As tabelas temporárias são úteis quando:

- a estrutura da tabela não é conhecida antes de utilizar o aplicativo.
- os outros usuários não necessitam da mesma estrutura de tabela.
- os dados da tabela temporária são necessários durante o uso do aplicativo.
- a tabela pode ser declarada e removida sem manter bloqueios no catálogo do sistema.

#### Sintaxe

    DECLARE GLOBAL TEMPORARY TABLE nome-da-tabela
        { definição-da-coluna [ , definição-da-coluna ] * }
    [ ON COMMIT {DELETE | PRESERVE} ROWS ]
    NOT LOGGED [ON ROLLBACK DELETE ROWS]

#### nome-da-tabela

O nome da tabela temporária. Se for especificado um nome-do-esquema diferente de SESSION, ocorrerá um erro (SQLState 428EK). Se o nome-do-esquema não for especificado, será atribuído SESSION. Várias conexões podem definir tabelas temporárias globais declaradas com o mesmo nome, porque cada conexão possui seu próprio descritor de tabela único.

A utilização de SESSION como nome do esquema de uma tabela física não gera erro, mas é desestimulado. O nome de esquema SESSION deve ser reservado para o esquema de tabelas temporárias.

#### definição-da-coluna

Para obter mais informações sobre a `definição-da-coluna` deve ser consultada definição-da-coluna em `CREATE TABLE`. A instrução `DECLARE GLOBAL TEMPORARY TABLE` não permite `especificação-de-coluna-gerada` na `definição-da-coluna`.

#### Tipo-de-dado

Os tipos-de-dado suportados são:

- BIGINT
- CHAR
- DATE
- DECIMAL
- DOUBLE PRECISION
- FLOAT
- INTEGER
- NUMERIC
- REAL
- SMALLINT
- TIME
- TIMESTAMP
- VARCHAR

#### ON COMMIT

Especifica a ação a ser executada na tabela temporária global quando é realizada uma operação de COMMIT.

#### DELETE ROWS

Todas as linhas da tabela serão excluídas, se não houver nenhum cursor com possibilidade de HOLD aberto na tabela. Este é o valor padrão para ON COMMIT. Se for especificado ON ROLLBACK DELETE ROWS, serão excluídas todas as linhas da tabela somente se a tabela temporária tiver sido utilizada. ON COMMIT DELETE ROWS exclui as linhas da tabela, mesmo que a tabela não tenha sido utilizada (se a tabela não possuir nenhum cursor com possibilidade de HOLD aberto na mesma).

#### PRESERVE ROWS

As linhas da tabela são preservadas.

#### NOT LOGGED

Especifica a ação realizada na tabela temporária global quando uma operação de desfazer é realizada. Quando é realizada uma operação 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 padrão para NOT LOGGED. NOT LOGGED [ON ROLLBACK DELETE ROWS ]] especifica a ação a ser realizada na tabela temporária global quando é realizada uma operação de ROLLBACK (ou ROLLBACK TO SAVEPOINT). Se os dados da tabela foram modificados, todas as linhas serão excluídas.

#### Exemplos

    SET SCHEMA MYAPP;

    CREATE TABLE T1(C11 INT, C12 DATE);

    DECLARE GLOBAL TEMPORARY TABLE SESSION.T1(C11 INT) NOT LOGGED;
    -- A qualificação SESSION é redundante, porque as tabelas temporárias
    -- somente podem existir no esquema SESSION.

    DECLARE GLOBAL TEMPORARY TABLE T2(C21 INT) NOT LOGGED;
    -- A tabela temporária não é qualificada neste caso com SESSION, porque
    -- as tabelas temporárias somente podem existir no esquema SESSION.

    INSERT INTO SESSION.T1 VALUES (1);
    -- Neste caso a qualificação SESSION é obrigatória para utilizar a
    -- tabela temporária, porque o esquema corrente é MYAPP.

    SELECT * FROM T1;
    -- Esta instrução SELECT está fazendo referência à tabela física
    -- "MYAPP.T1", uma vez que a tabela não foi qualificada com SESSION.

Deve ser observado que as tabelas temporárias somente podem ser declaradas no esquema SESSION. Nunca deve ser declarado um esquema físico com o nome SESSION.

A seguir está mostrada uma lista de funções da instrução DECLARE GLOBAL TEMPORARY TABLE do DB2 UDB que não são suportadas pelo Derby:

- IDENTITY opções-de-coluna
- IDENTITY atributo nas opções-de-cópia
- AS (FULLSELECT) DEFINITION ONLY
- NOT LOGGED ON ROLLBACK PRESERVE ROWS
- IN nome-do-espaço-de-tabelas
- PARTITIONING KEY
- WITH REPLACE

#### Restrições das tabelas temporárias globais declaradas

As tabelas temporárias não podem ser especificadas nas seguintes instruções:

- ALTER TABLE
- CREATE SYNONYM
- CREATE TRIGGER
- CREATE VIEW
- LOCK
- RENAME

As tabelas temporárias não pode ser especificadas nas restrições referenciais.

Não há suporte para restrição de verificação nas colunas.

Não podem ser utilizados os seguintes tipos de dado nas tabelas temporárias globais declaradas:

- BLOB
- CLOB
- LONG VARCHAR

As tabelas temporárias não podem ser referenciadas por uma instrução-SQL-engatilhada.

Se uma instrução realizando uma inserção, atualização ou exclusão em uma tabela temporária encontrar um erro, todas as linhas da tabela serão excluídas.

#### Restrições específicas do Derby

O Derby não dá suporte em tabelas temporárias a:

- índices
- sinônimos, gatilhos e visões em tabelas no esquema SESSION (incluindo as tabelas físicas e as tabelas temporárias)
- LOCK TABLE
- restrições e chaves primárias
- especificação-de-coluna-gerada
- importação em tabelas temporárias

As instruções fazendo referência a tabelas e visões no esquema SESSION não ficam no cache.

Tópico pai: Instruções
Conceitos relacionados
Interação com o sistema de dependências
Instruções CREATE
Instruções DROP
Instruções RENAME
Instruções SET
Referências relacionadas
Instrução ALTER TABLE
CALL (PROCEDIMENTO)
Cláusula CONSTRAINT
Instrução DELETE
Cláusula FOR UPDATE
Cláusula FROM
Cláusula GROUP BY
Cláusula HAVING
INNER JOIN
Instrução INSERT
Operação JOIN
LEFT OUTER JOIN
Instrução LOCK TABLE
Cláusula ORDER BY
Consulta
RIGHT OUTER JOIN
SubconsultaEscalar
ExpressãoSeleção
Instrução SELECT
ExpressãoTabela
SubconsultaTabela
Instrução UPDATE
VALUES Expressão
Cláusula WHERE
Cláusula WHERE CURRENT OF