Използвайки малко по-различен подход, но изглежда, че работи. Вместо да използвате регистър и да преброявате, просто проверете дали агрегатът е нулев (coalesce връща първата ненулева стойност в поредица) и ако е, заменете вашето съобщение. Това избягва групиране на второ ниво, което не вярвам, че е необходимо.
Жалко, че listagg не поддържа и distinct в агрегата; можем да избегнем вградения изглед.
SELECT coalesce(listagg(A.osuser, ', ') within group (order by A.osuser),
'There are no users connected') as userList
FROM (select distinct osuser from v$session) A
WHERE A.osuser!= 'SYSTEM' and A.osuser not like 'VMCONFTEST%'
Това наистина има допълнителни разходи, тъй като се опитва да генерира списък с потребители, които вашият случай може да се опитва да късо съединение. Ако обаче няма записи във V$session, изборът на различен трябва да бъде бърз.
Въпреки че, честно казано, не съм сигурен защо трябва да правим това. Null в списъка обикновено е адекватен отговор, показващ липса на потребители. и потребителският интерфейс ще обработва null, което означава, че няма потребители.
Може дори да бъде по-бързо, ако добавим клаузата where към вградения изглед..
SELECT coalesce(listagg(A.osuser, ', ') within group (order by A.osuser),
'There are no users connected') as userList
FROM (SELECT distinct osuser
FROM v$session
WHERE A.osuser!= 'SYSTEM'
and A.osuser not like 'VMCONFTEST%') A