diff --git a/database/packages/pck_net_storage.pkb b/database/packages/pck_net_storage.pkb index 938710e..238f45a 100644 --- a/database/packages/pck_net_storage.pkb +++ b/database/packages/pck_net_storage.pkb @@ -187,6 +187,7 @@ create or replace package body pck_net_storage as l_done boolean := false; l_cur_start varchar2(1024) := i_start_with; l_parent_folder varchar2(1024) := f_normalize_prefix(i_parent_folder); + l_obj_path t_object_path; c_page_size constant number := 1000; begin while not l_done @@ -219,11 +220,14 @@ create or replace package body pck_net_storage as )) jt ) loop + l_obj_path := f_split_object_key(rec.object_name); l_result.extend; l_result(l_result.last) := t_net_storage_row( rec.object_name + ,l_obj_path.path + ,l_obj_path.filename -- Explizit angelegte Ordner sind Zero-Byte-Objekte mit trailing /; - -- size und last_modified sind für Ordner nicht relevant + -- size, last_modified und etag sind für Ordner nicht relevant ,(case when rec.object_name like '%/' then null else rec.object_size end) ,(case when rec.object_name like '%/' then null else to_date(substr(rec.last_modified, 1, 19), 'YYYY-MM-DD"T"HH24:MI:SS') end) ,(case when rec.object_name like '%/' then 'Y' else 'N' end) @@ -249,10 +253,13 @@ create or replace package body pck_net_storage as )) jt ) loop + l_obj_path := f_split_object_key(rec.prefix_name); l_result.extend; l_result(l_result.last) := t_net_storage_row( rec.prefix_name - ,0 + ,l_obj_path.path + ,l_obj_path.filename + ,null ,null ,'Y' ,null @@ -304,16 +311,16 @@ create or replace package body pck_net_storage as -- level 2 → 'mandant/Eingang/' -- level 3 → 'mandant/Eingang/batch-001/' -- - -- prior object_name = object_name : bindet jede Zeile an sich selbst, + -- prior object_key = object_key : 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, + -- 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 + select substr(r.object_key, 1, instr(r.object_key, '/', 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 + connect by level <= regexp_count(r.object_key, '/') + and prior r.object_key = r.object_key + 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/' @@ -326,16 +333,19 @@ create or replace package body pck_net_storage as -- Bereits vorhandene Ordner-Einträge ausschließen (explizit angelegte -- Zero-Byte-Objekte oder via $.prefixes gelieferte virtuelle Ordner). minus - select object_name + select object_key from table(l_result) where is_folder = 'Y'; for i in 1..l_new_folders.count loop + l_obj_path := f_split_object_key(l_new_folders(i)); l_result.extend; l_result(l_result.last) := t_net_storage_row( l_new_folders(i) - ,0 + ,l_obj_path.path + ,l_obj_path.filename + ,null ,null ,'Y' ,null diff --git a/database/types/t_net_storage_row.typ b/database/types/t_net_storage_row.typ index fec5189..8029254 100644 --- a/database/types/t_net_storage_row.typ +++ b/database/types/t_net_storage_row.typ @@ -1,7 +1,9 @@ -- Schema-Level Type für f_list_objects Cursor-Rückgabe. -- Wird benötigt da Oracle TABLE() in SQL nur schema-level Types unterstützt. create or replace type t_net_storage_row as object ( - object_name varchar2(1024) + object_key varchar2(1024) + ,object_path varchar2(1024) + ,name varchar2(256) ,object_size number ,last_modified date ,is_folder varchar2(1)