From f328b4025bb542b0f74c8fdf67b0a32f1dd1bad5 Mon Sep 17 00:00:00 2001 From: "Simon C. Kessler" Date: Fri, 10 Apr 2026 12:51:47 +0200 Subject: [PATCH] Ordner auflistung korrigiert --- database/packages/pck_net_storage.pkb | 62 +++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/database/packages/pck_net_storage.pkb b/database/packages/pck_net_storage.pkb index 58ae720..6d3cd10 100644 --- a/database/packages/pck_net_storage.pkb +++ b/database/packages/pck_net_storage.pkb @@ -279,6 +279,68 @@ create or replace package body pck_net_storage as end if; 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, ) 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; end f_list_objects_internal;