Ordner auflistung korrigiert
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user