Първо, това няма нищо общо с CTE. Това поведение би било същото с просто select * from table
заявка. Разликата е, че при T-SQL заявката отива в имплицитен курсор, който се връща на повикващия. Когато изпълнявате SP от Management Studio, това е удобно. Наборът от резултати се появява в прозореца с данни, сякаш сме изпълнили директно заявката. Но това всъщност е нестандартно поведение. Oracle има по-стандартно поведение, което може да бъде заявено като "резултатният набор от всяка заявка, която не е насочена към курсор, трябва да бъде насочена към променливи." Когато е насочена към променливи, тогава заявката трябва да върне само един ред.
За да дублирате поведението на T-SQL, просто трябва изрично да декларирате и върнете курсора. Тогава извикващият код извлича от курсора целия набор от резултати, но един ред наведнъж. Не получавате удобството на Sql Developer или PL/SQL Developer, които отклоняват набора от резултати към прозореца за показване на данни, но не можете да имате всичко.
Въпреки това, тъй като обикновено не пишем SP само за да бъдат извикани от IDE, е по-лесно да се работи с явните курсори на Oracle, отколкото с неявните курсори на SQL Server. Просто потърсете в Google „oracle return ref cursor to caller“, за да получите много добър материал.