Nur mit etwas Aufwand. Etwa so:
select listagg((case when running_len < 4000 then oi.impression end), ',') within group (order by oi.line)
from (select oi.*,
sum(length(oi.impression) + 1) over (partition by ?? order by oi.line) as running_len
from order_impression oi
) oi
group by ??;
Dieser berechnet die Lauflänge und aggregiert nur Werte, die die Länge nicht überschreiten. Der ??
ist, was auch immer Sie für die Aggregation verwenden. Dies setzt voraus, dass line
ist eindeutig, also order by
ist stabil.
Dies beinhaltet nicht die impression
das die Länge überschreitet - und nichts danach. Es schneidet den Eindruck nicht ab. Diese Logik ist möglich, verkompliziert aber die Abfrage.