Dependênciasacompanhamento interno das
Instruções preparadasacompanhamento das dependências
O
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
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
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
:
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 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 recompila automaticamente e executa p1
ij> DROP TABLE MINHA_TABELA;
0 rows inserted/updated/deleted
-- O 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 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.