For det første har dette intet at gøre med CTE'er. Denne adfærd ville være den samme med en simpel select * from table
forespørgsel. Forskellen er, at med T-SQL går forespørgslen ind i en implicit markør, som returneres til den, der ringer. Når du udfører SP'en fra Management Studio, er dette praktisk. Resultatsættet vises i datavinduet, som om vi havde udført forespørgslen direkte. Men dette er faktisk ikke-standard adfærd. Oracle har den mere standardadfærd, som kan angives som "resultatsættet af enhver forespørgsel, der ikke er rettet ind i en markør, skal dirigeres til variabler." Når forespørgslen ledes ind i variabler, må forespørgslen kun returnere én række.
For at duplikere opførselen af T-SQL, skal du blot udtrykkeligt erklære og returnere markøren. Derefter henter den kaldende kode fra markøren hele resultatsættet, men en række ad gangen. Du får ikke bekvemmeligheden ved, at Sql Developer eller PL/SQL Developer omdirigerer resultatsættet til datavisningsvinduet, men du kan ikke få alt.
Men da vi generelt ikke skriver SP'er bare for at blive kaldt fra IDE, er det lettere at arbejde med Oracles eksplicitte markører end SQL Servers implicitte. Bare google "oracle return ref cursor to caller" for at få en hel masse godt materiale.