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

Oracle SQL:Entendendo o comportamento de SYS_GUID() quando presente em uma visualização inline?


A documentação dá uma razão pela qual você pode ver uma discrepância (ênfase minha):

Cuidado:

Como o SQL é uma linguagem declarativa, em vez de uma linguagem imperativa (ou procedural), você não pode saber quantas vezes uma função invocada por uma instrução SQL será executada — mesmo que a função seja escrita em PL/SQL, uma linguagem imperativa. Use um cursor em vez disso.

Por exemplo, se seu aplicativo exigir que uma função seja chamada para cada linha selecionada, abra um cursor, selecione as linhas do cursor e chame a função para cada linha. Essa técnica garante que o número de chamadas para a função seja o número de linhas buscadas do cursor.

Basicamente, o Oracle não especifica quantas vezes uma função será chamada dentro de uma instrução sql:pode depender do release, do ambiente, do caminho de acesso entre outros fatores.

No entanto, existem maneiras de limitar a reescrita de consulta, conforme explicado no capítulo Desaninhamento de subconsultas aninhadas:

Desaninhamento de subconsulta desaninha e mescla o corpo da subconsulta no corpo da instrução que a contém, permitindo que o otimizador os considere juntos ao avaliar caminhos de acesso e junções. O otimizador pode desaninhar a maioria das subconsultas, com algumas exceções . Essas exceções incluem subconsultas hierárquicas e subconsultas que contêm uma pseudocoluna ROWNUM, um dos operadores de conjunto, uma função de agregação aninhada ou uma referência correlacionada a um bloco de consulta que não é o bloco de consulta externo imediato da subconsulta.

Conforme explicado acima, você pode usar ROWNUM pseudo-coluna para evitar que o Oracle desempanhe uma subconsulta:
SQL> WITH data AS (SELECT SYS_GUID() uuid FROM DUAL WHERE ROWNUM >= 1)
  2  SELECT uuid, uuid FROM data;

UUID                             UUID
-------------------------------- --------------------------------
1ADF387E847F472494A869B033C2661A 1ADF387E847F472494A869B033C2661A