Ordner auflistung korrigiert

This commit is contained in:
2026-04-10 12:51:47 +02:00
parent 863390a064
commit f328b4025b

View File

@@ -279,6 +279,68 @@ create or replace package body pck_net_storage as
end if; end if;
end loop; end loop;
-- Implizite Ordner aus Object-Keys ableiten.
-- Die OCI-API liefert virtuelle Ordner (nie als Zero-Byte-Objekt angelegt) nur
-- über $.prefixes, und auch nur wenn delimiter gesetzt ist. Bei rekursivem Abruf
-- fehlen sie daher komplett. Wir leiten alle Zwischenpfade aus den Object-Keys ab
-- und ergänzen fehlende Ordner-Einträge.
declare
l_new_folders apex_t_varchar2;
begin
select distinct folder_path
bulk collect into l_new_folders
from (
-- Innere Query: alle Zwischenpfade aus den Datei-Keys ableiten.
--
-- connect by level iteriert von 1 bis zur Anzahl der Slashes im Key.
-- instr(..., '/', 1, level) liefert die Position des n-ten Slashes.
-- substr(..., 1, <position>) schneidet den Key bis einschließlich
-- dieses Slashes ab — das Ergebnis ist der Ordnerpfad auf Ebene n.
--
-- Beispiel für 'mandant/Eingang/batch-001/datei.pdf' (3 Slashes):
-- level 1 → 'mandant/'
-- level 2 → 'mandant/Eingang/'
-- level 3 → 'mandant/Eingang/batch-001/'
--
-- prior object_name = object_name : bindet jede Zeile an sich selbst,
-- damit connect by die Levels pro Zeile unabhängig hochzählt.
-- prior sys_guid() is not null : verhindert Cycle-Detection-Fehler,
-- da keine echte Eltern-Kind-Beziehung vorliegt.
select substr(r.object_name, 1, instr(r.object_name, '/', 1, level)) as folder_path
from table(l_result) r
where r.is_folder = 'N'
connect by level <= regexp_count(r.object_name, '/')
and prior r.object_name = r.object_name
and prior sys_guid() is not null
)
-- Nur Pfade unterhalb des Parent-Folders behalten:
-- like-Bedingung schließt Vorfahren-Pfade aus (z.B. 'mandant/', 'mandant/Eingang/'
-- wenn der Parent-Folder 'mandant/Eingang/batch/' ist).
-- != schließt den Parent-Folder selbst aus.
-- Bei null-Parent-Folder (Bucket-Root): like '%' = immer wahr, chr(0) passt
-- auf keinen gültigen Key → beide Bedingungen greifen nicht.
where folder_path like nvl(l_parent_folder, '') || '%'
and folder_path != nvl(l_parent_folder, chr(0))
-- Bereits vorhandene Ordner-Einträge ausschließen (explizit angelegte
-- Zero-Byte-Objekte oder via $.prefixes gelieferte virtuelle Ordner).
minus
select object_name
from table(l_result)
where is_folder = 'Y';
for i in 1..l_new_folders.count
loop
l_result.extend;
l_result(l_result.last) := t_net_storage_row(
l_new_folders(i)
,0
,null
,'Y'
,null
);
end loop;
end;
return l_result; return l_result;
end f_list_objects_internal; end f_list_objects_internal;