Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Por que EXECUTE IMEDIATE é necessário aqui?


Todo o bloco PL/SQL é analisado em tempo de compilação, mas o texto dentro de uma instrução dinâmica não é avaliado até o tempo de execução. (Eles são quase a mesma coisa para um bloco anônimo, mas ainda são etapas distintas).

Seu if/else também não é avaliado até o tempo de execução. O compilador não sabe que a tabela sempre existirá no momento em que você fizer sua inserção, ele só pode verificar se ela existe ou não no momento em que analisa o bloco inteiro.

Se a tabela já existir, tudo bem; o compilador pode ver, o bloco é executado, seu select recebe 1, e você entra no else para fazer a inserção. Mas se não existir, a análise da inserção falhará corretamente com ORA-00942 em tempo de compilação e nada no bloco é executado.

Como a criação da tabela é dinâmica, todas as referências à tabela também devem ser dinâmicas - sua inserção como você viu, mas também se você a consultar. Basicamente, torna seu código muito mais difícil de ler e pode ocultar erros de sintaxe - já que o código dinâmico não é analisado até o tempo de execução, e é possível que você tenha um erro em uma instrução dinâmica em uma ramificação que não é atingida por um muito tempo.

As tabelas temporárias globais não devem ser criadas dinamicamente de qualquer maneira. Eles são objetos permanentes com dados temporários, específicos para cada sessão, e não devem ser criados/descartados como parte do código do seu aplicativo. (Nenhuma alteração de esquema deve ser feita pelo seu aplicativo em geral; elas devem ser limitadas a alterações de atualização/manutenção e ser controladas, para evitar erros, perda de dados e efeitos colaterais inesperados; GTTs não são diferentes).

Ao contrário das tabelas temporárias em alguns outros bancos de dados relacionais, ao criar uma tabela temporária em um banco de dados Oracle, você cria uma definição de tabela estática. A tabela temporária é um objeto persistente descrito no dicionário de dados, mas aparece vazio até que sua sessão insira dados na tabela. Você cria uma tabela temporária para o próprio banco de dados, não para cada procedimento armazenado PL/SQL.

Crie o GTT uma vez e torne todo o seu código PL/SQL estático. Se você quiser algo mais próximo das tabelas temporárias locais do SQL Server, examine as coleções PL/SQL.