# Interação com o sistema de dependências

O Derby acompanha internamente as dependências das instruções preparadas, que são instruções SQL pré-compiladas antes de serem executadas. São tipicamente preparadas (pré-compiladas) uma vez, e executadas várias vezes.

As instruções preparadas dependem de objetos do dicionário, e de instruções referenciadas pelas mesmas (Os objetos do dicionário incluem tabelas, colunas, restrições, índices, visões e gatilhos). A remoção ou modificação de objetos do dicionário ou de instruções que a instrução preparada depende a invalida internamente, significando que o Derby vai tentar recompilar automaticamente a instrução quando esta for executada. Se a recompilação da instrução não for bem-sucedida, o pedido de execução falhará. Entretanto, se for tomada alguma ação para restaurar a dependência quebrada (como a restauração da tabela que falta), a instrução preparada poderá ser executada, porque o Derby irá recompilá-la automaticamente no próximo pedido de execução.

As instruções dependem umas das outras; uma instrução UPDATE WHERE CURRENT depende da instrução referenciada. Remover a instrução da qual esta depende, invalida a instrução UPDATE WHERE CURRENT.

Além disso, as instruções preparadas não permitem a execução de certas instruções de DDL quando existem conjuntos de resultados abertos para as mesmas.

As páginas do manual de cada instrução detalham quais ações invalidam a instrução, 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 instrução
    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 inválido 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 instrução p1 está temporariamente inválida
    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á inválida, o Derby tenta recompilar
    -- antes de executar.
    -- É bem-sucedido e executa.
    ij> DROP TABLE MINHA_TABELA;
    0 rows inserted/updated/deleted
    -- a instrução p1 agora está inválida,
    -- 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.

Tópico pai: Instruções
Conceitos relacionados
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 DECLARE GLOBAL TEMPORARY TABLE
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