Tentei modificar um procedimento armazenado do Oracle para usar um CTE em vez de uma simples instrução Select.
Meu procedimento ficou assim:
Create or replace Myproc ( MyRefCursor IN OUT SYS_REFCURSOR)
as
begin
Open MyRefCursor for
Select * from ...something ...;
end;
/
Eu reescrevi esta consulta:
Select * from ...something ...;
Como este CTE:
with MyCTE As (
... ;
)
Select * from MyCTE;
Abrir um cursor dessa maneira não funciona:
Open MyRefCursor for
with MyCTE As (
... ;
)
Select * from MyCTE;
Nem isso:
with MyCTE As (
... ;
)
Open MyRefCursor for
Select * from MyCTE;
Como a CTE faz parte da mesma instrução SQL, ela não deve conter ponto e vírgula.
Portanto, não deve haver ponto e vírgula na segunda linha do terceiro bloco ou na terceira linha do quarto bloco. O quinto bloco não possui uma instrução SQL contígua.
Um exemplo muito básico completo usando um procedimento armazenado sem parâmetro de entrada:
Alguns dados de demonstração:
Agora, um procedimento armazenado simples usando um CTE trivial:
E finalmente uma chamada de teste para sqlplus ou TOAD
Contexto para esta pergunta:
Fiz a transformação da instrução Select para CTE no SQL-Server e queria adicionar números de linha ao resultado. Eu simplesmente esqueço que adicione um alias ao *
os CTEs não reursivos parecem ajudar a migrar do SQL-Server para o Oracle, mas existem algumas pequenas diferenças de sintaxe.