Encoding der DB Dateien zu Windows 1252 konvertiert

This commit is contained in:
2026-05-04 10:15:18 +02:00
parent a74b220ed7
commit ca7b26509a
6 changed files with 160 additions and 160 deletions

View File

@@ -9,15 +9,15 @@ create or replace package body pck_net_storage as
,i_action in varchar2 default null
) return varchar2
/*Kopf------------------------------------------------------------------------------------------------
-- Beschreibung: Baut die vollständige OCI Object Storage URL aus den Konfigurationsparametern.
-- Entweder für eine Bucket-Action, ein einzelnes Objekt oder den Bucket-Root.
-- Beschreibung: Baut die vollständige OCI Object Storage URL aus den Konfigurationsparametern.
-- Entweder für eine Bucket-Action, ein einzelnes Objekt oder den Bucket-Root.
------------------------------------------------------------------------------------------------------
-- Parameter: i_object_key Objektschlüssel (Pfad im Bucket); null für Bucket-Root oder Action-URL
-- i_action OCI Bucket-Action (z.B. renameObject); null für Objekt-URL
-- Parameter: i_object_key Objektschlüssel (Pfad im Bucket); null für Bucket-Root oder Action-URL
-- i_action OCI Bucket-Action (z.B. renameObject); null für Objekt-URL
------------------------------------------------------------------------------------------------------
-- Rückgabe: Vollständige URL als VARCHAR2
-- Rückgabe: Vollständige URL als VARCHAR2
------------------------------------------------------------------------------------------------------
-- MA Datum Änderung
-- MA Datum Änderung
-- SCK 2026-04-08 Funktion erstellt
------------------------------------------------------------------------------------------------Kopf*/
is
@@ -35,7 +35,7 @@ create or replace package body pck_net_storage as
return l_base || '/actions/' || i_action;
elsif i_object_key is not null
then
-- Sonderzeichen kodieren, Schrägstriche im Key unverändert lassen
-- Sonderzeichen kodieren, Schrägstriche im Key unverändert lassen
return l_base || '/o/' || utl_url.escape(i_object_key, false);
else
return l_base || '/o';
@@ -57,15 +57,15 @@ create or replace package body pck_net_storage as
procedure p_assert_allowed (i_object_key in varchar2)
/*Kopf------------------------------------------------------------------------------------------------
-- Beschreibung: Prüft den Objektschlüssel auf Gültigkeit, Path-Traversal-Angriffe und Tenant-Scope.
-- Beschreibung: Prüft den Objektschlüssel auf Gültigkeit, Path-Traversal-Angriffe und Tenant-Scope.
-- Wirft Application Error -20008 bei null-Key, -20004 bei Path Traversal,
-- -20005 bei Scope-Verletzung.
------------------------------------------------------------------------------------------------------
-- Parameter: i_object_key Zu prüfender Objektschlüssel
-- Parameter: i_object_key Zu prüfender Objektschlüssel
------------------------------------------------------------------------------------------------------
-- MA Datum Änderung
-- MA Datum Änderung
-- SCK 2026-04-08 Prozedur erstellt
-- SCK 2026-04-10 Null-Prüfung und führender-Slash-Check ergänzt
-- SCK 2026-04-10 Null-Prüfung und führender-Slash-Check ergänzt
------------------------------------------------------------------------------------------------Kopf*/
is
l_tenant_prefix varchar2(256);
@@ -109,21 +109,21 @@ create or replace package body pck_net_storage as
,i_content_type in varchar2 default null
) return clob
/*Kopf------------------------------------------------------------------------------------------------
-- Beschreibung: Führt einen HTTP-Request gegen die OCI Object Storage API aus.
-- Wertet den HTTP-Statuscode aus und löst bei Fehler einen Application Error aus.
-- Authentifizierung erfolgt über APEX Web Credential (NETSTORE_CRED_ID).
-- Beschreibung: Führt einen HTTP-Request gegen die OCI Object Storage API aus.
-- Wertet den HTTP-Statuscode aus und löst bei Fehler einen Application Error aus.
-- Authentifizierung erfolgt über APEX Web Credential (NETSTORE_CRED_ID).
------------------------------------------------------------------------------------------------------
-- Parameter: i_method HTTP-Methode (GET, PUT, DELETE, POST, HEAD)
-- i_url Vollständige Ziel-URL
-- i_url Vollständige Ziel-URL
-- i_body_clob Optionaler Request-Body als CLOB (z.B. JSON)
-- i_body_blob Optionaler Request-Body als BLOB (Binärinhalt)
-- i_body_blob Optionaler Request-Body als BLOB (Binärinhalt)
-- i_content_type Optionaler Content-Type Header
------------------------------------------------------------------------------------------------------
-- Rückgabe: Response-Body als CLOB (bei HEAD-Requests leer)
-- Rückgabe: Response-Body als CLOB (bei HEAD-Requests leer)
------------------------------------------------------------------------------------------------------
-- MA Datum Änderung
-- MA Datum Änderung
-- SCK 2026-04-08 Funktion erstellt
-- SCK 2026-04-16 empty_blob()/empty_clob() als Default entfernt — APEX OCI-Signing braucht null für nicht genutzte Body-Parameter
-- SCK 2026-04-16 empty_blob()/empty_clob() als Default entfernt — APEX OCI-Signing braucht null für nicht genutzte Body-Parameter
------------------------------------------------------------------------------------------------Kopf*/
is
l_response clob;
@@ -131,7 +131,7 @@ create or replace package body pck_net_storage as
l_header_index number := 1;
l_content_length number;
begin
-- headers zurücksetzen - nur zur Sicherheit, damit keine alten Header übertragen werden.
-- headers zurücksetzen - nur zur Sicherheit, damit keine alten Header übertragen werden.
apex_web_service.g_request_headers.delete;
if i_content_type is not null
@@ -161,9 +161,9 @@ create or replace package body pck_net_storage as
l_header_index := l_header_index + 1;
*/
-- nur für leere BLOBs (z.B. leerer Ordner) Content-Length setzen
-- bei nicht leeren blob setzt apex_web_service.make_rest_request den content-length header automatisch, doppeltes setzen führt aber zu einem HTTP-400 API Fehler
-- bei leeren blobs (empty_blob()) wird er aber nicht automatisch gesetzt, daher müssen wir ihn manuell setzen
-- nur für leere BLOBs (z.B. leerer Ordner) Content-Length setzen
-- bei nicht leeren blob setzt apex_web_service.make_rest_request den content-length header automatisch, doppeltes setzen führt aber zu einem HTTP-400 API Fehler
-- bei leeren blobs (empty_blob()) wird er aber nicht automatisch gesetzt, daher müssen wir ihn manuell setzen
if i_body_blob is not null
and dbms_lob.getlength(i_body_blob) = 0
then
@@ -217,7 +217,7 @@ create or replace package body pck_net_storage as
return l_response;
end f_make_request;
-- Interne Implementierung ohne Rechteprüfung — wird von f_list_objects und p_delete_folder (Leerprüfung) genutzt
-- Interne Implementierung ohne Rechteprüfung — wird von f_list_objects und p_delete_folder (Leerprüfung) genutzt
function f_list_objects_internal (
i_parent_folder in varchar2
,i_include_subfolders in varchar2
@@ -225,18 +225,18 @@ create or replace package body pck_net_storage as
,i_limit in number
) return t_net_storage_tab
/*Kopf------------------------------------------------------------------------------------------------
-- Beschreibung: Listet Objekte und Unterordner im Bucket ohne Rechte- oder Scope-Prüfung.
-- Paginiert automatisch über nextStartWith bis alle Ergebnisse geladen sind.
-- Wird von f_list_objects (öffentlich) und p_delete_folder (Leerprüfung) intern genutzt.
-- Beschreibung: Listet Objekte und Unterordner im Bucket ohne Rechte- oder Scope-Prüfung.
-- Paginiert automatisch über nextStartWith bis alle Ergebnisse geladen sind.
-- Wird von f_list_objects (öffentlich) und p_delete_folder (Leerprüfung) intern genutzt.
------------------------------------------------------------------------------------------------------
-- Parameter: i_parent_folder Ordnerpfad im Bucket (z.B. eingang/)
-- i_include_subfolders 'Y' = alle Dateien rekursiv, 'N' = nur direkte Kinder des Ordners
-- i_start_with Optionaler Startpunkt für Paginierung
-- i_start_with Optionaler Startpunkt für Paginierung
-- i_limit Maximale Anzahl Ergebnisse (0 = unbegrenzt)
------------------------------------------------------------------------------------------------------
-- Rückgabe: Collection t_net_storage_tab mit allen gefundenen Objekten
-- Rückgabe: Collection t_net_storage_tab mit allen gefundenen Objekten
------------------------------------------------------------------------------------------------------
-- MA Datum Änderung
-- MA Datum Änderung
-- SCK 2026-04-08 Funktion erstellt
------------------------------------------------------------------------------------------------Kopf*/
is
@@ -288,7 +288,7 @@ create or replace package body pck_net_storage as
,l_obj_path.path
,l_obj_path.filename
-- Explizit angelegte Ordner sind Zero-Byte-Objekte mit trailing /;
-- size, last_modified und etag 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)
@@ -335,7 +335,7 @@ create or replace package body pck_net_storage as
end loop;
end if;
-- Nächste Seite prüfen
-- Nächste Seite prüfen
if not l_done
then
l_next_start := json_value(l_response, '$.nextStartWith');
@@ -351,9 +351,9 @@ create or replace package body pck_net_storage as
-- 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
-- ü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.
-- und ergänzen fehlende Ordner-Einträge.
declare
l_new_folders apex_t_varchar2;
begin
@@ -364,16 +364,16 @@ create or replace package body pck_net_storage as
--
-- 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.
-- 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/'
-- 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_key = object_key : bindet jede Zeile an sich selbst,
-- damit connect by die Levels pro Zeile unabhängig hochzählt.
-- 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_key, 1, instr(r.object_key, '/', 1, level)) as folder_path
@@ -384,14 +384,14 @@ create or replace package body pck_net_storage as
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/'
-- 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.
-- != 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.
-- 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
-- Bereits vorhandene Ordner-Einträge ausschließen (explizit angelegte
-- Zero-Byte-Objekte oder via $.prefixes gelieferte virtuelle Ordner).
minus
select object_key
@@ -417,18 +417,18 @@ create or replace package body pck_net_storage as
return l_result;
end f_list_objects_internal;
-- ==================== Öffentliche Funktionen ====================
-- ==================== Öffentliche Funktionen ====================
function f_split_object_key (i_object_key in varchar2) return t_object_path
/*Kopf------------------------------------------------------------------------------------------------
-- Beschreibung: Extrahiert Pfad und Dateiname aus einem OCI-Objektschlüssel.
-- Bei Ordner-Keys (trailing Slash) wird der Ordnername als Dateiname zurückgegeben.
-- Beschreibung: Extrahiert Pfad und Dateiname aus einem OCI-Objektschlüssel.
-- Bei Ordner-Keys (trailing Slash) wird der Ordnername als Dateiname zurückgegeben.
------------------------------------------------------------------------------------------------------
-- Parameter: i_object_key Vollständiger Objektschlüssel (z.B. mandant/Eingang/Import/datei.pdf)
-- Parameter: i_object_key Vollständiger Objektschlüssel (z.B. mandant/Eingang/Import/datei.pdf)
------------------------------------------------------------------------------------------------------
-- Rückgabe: t_object_path Record mit path (inkl. trailing Slash) und filename
-- Rückgabe: t_object_path Record mit path (inkl. trailing Slash) und filename
------------------------------------------------------------------------------------------------------
-- MA Datum Änderung
-- MA Datum Änderung
-- SCK 2026-04-09 Funktion erstellt
------------------------------------------------------------------------------------------------Kopf*/
is
@@ -460,16 +460,16 @@ create or replace package body pck_net_storage as
,i_limit in number default 0
) return t_net_storage_tab
/*Kopf------------------------------------------------------------------------------------------------
-- Beschreibung: Listet Objekte und Unterordner im Bucket mit Rechteprüfung und Scope-Validierung.
-- Beschreibung: Listet Objekte und Unterordner im Bucket mit Rechteprüfung und Scope-Validierung.
------------------------------------------------------------------------------------------------------
-- Parameter: i_parent_folder Ordnerpfad im Bucket (z.B. eingang/)
-- i_include_subfolders 'Y' = alle Dateien rekursiv inkl. Unterordner, 'N' = nur direkte Dateien im Ordner (Standard)
-- i_start_with Optionaler Startpunkt für Paginierung
-- i_start_with Optionaler Startpunkt für Paginierung
-- i_limit Maximale Anzahl Ergebnisse (0 = unbegrenzt)
------------------------------------------------------------------------------------------------------
-- Rückgabe: Collection t_net_storage_tab mit allen gefundenen Objekten
-- Rückgabe: Collection t_net_storage_tab mit allen gefundenen Objekten
------------------------------------------------------------------------------------------------------
-- MA Datum Änderung
-- MA Datum Änderung
-- SCK 2026-04-08 Funktion erstellt
------------------------------------------------------------------------------------------------Kopf*/
is
@@ -485,13 +485,13 @@ create or replace package body pck_net_storage as
function f_download_object (i_object_key in varchar2) return blob
/*Kopf------------------------------------------------------------------------------------------------
-- Beschreibung: Lädt ein einzelnes Objekt aus dem OCI Bucket als BLOB herunter.
-- Beschreibung: Lädt ein einzelnes Objekt aus dem OCI Bucket als BLOB herunter.
------------------------------------------------------------------------------------------------------
-- Parameter: i_object_key Vollständiger Objektschlüssel im Bucket
-- Parameter: i_object_key Vollständiger Objektschlüssel im Bucket
------------------------------------------------------------------------------------------------------
-- Rückgabe: Dateiinhalt als BLOB
-- Rückgabe: Dateiinhalt als BLOB
------------------------------------------------------------------------------------------------------
-- MA Datum Änderung
-- MA Datum Änderung
-- SCK 2026-04-08 Funktion erstellt
------------------------------------------------------------------------------------------------Kopf*/
is
@@ -529,13 +529,13 @@ create or replace package body pck_net_storage as
,i_content_type in varchar2
)
/*Kopf------------------------------------------------------------------------------------------------
-- Beschreibung: Lädt ein Objekt in den OCI Bucket hoch (PUT). Überschreibt vorhandene Objekte.
-- Beschreibung: Lädt ein Objekt in den OCI Bucket hoch (PUT). Überschreibt vorhandene Objekte.
------------------------------------------------------------------------------------------------------
-- Parameter: i_object_key Zielpfad im Bucket
-- i_content Dateiinhalt als BLOB
-- i_content_type MIME-Type des Inhalts (z.B. application/octet-stream)
------------------------------------------------------------------------------------------------------
-- MA Datum Änderung
-- MA Datum Änderung
-- SCK 2026-04-08 Prozedur erstellt
------------------------------------------------------------------------------------------------Kopf*/
is
@@ -547,7 +547,7 @@ create or replace package body pck_net_storage as
if substr(i_object_key, -1) = '/'
then
raise_application_error(-20012, 'Object Key darf nicht mit / enden — zum Anlegen von Ordnern p_create_folder verwenden');
raise_application_error(-20012, 'Object Key darf nicht mit / enden — zum Anlegen von Ordnern p_create_folder verwenden');
end if;
l_response := f_make_request(
@@ -568,11 +568,11 @@ create or replace package body pck_net_storage as
procedure p_delete_object (i_object_key in varchar2)
/*Kopf------------------------------------------------------------------------------------------------
-- Beschreibung: Löscht ein einzelnes Objekt aus dem OCI Bucket (DELETE).
-- Beschreibung: Löscht ein einzelnes Objekt aus dem OCI Bucket (DELETE).
------------------------------------------------------------------------------------------------------
-- Parameter: i_object_key Vollständiger Objektschlüssel im Bucket
-- Parameter: i_object_key Vollständiger Objektschlüssel im Bucket
------------------------------------------------------------------------------------------------------
-- MA Datum Änderung
-- MA Datum Änderung
-- SCK 2026-04-08 Prozedur erstellt
------------------------------------------------------------------------------------------------Kopf*/
is
@@ -591,21 +591,21 @@ create or replace package body pck_net_storage as
pck_log.p_info(
i_module => c_log_module
,i_action => 'DELETE'
,i_message => 'Datei "' || l_obj_path.filename || '" gelöscht | Ordner: ' || l_obj_path.path
,i_message => 'Datei "' || l_obj_path.filename || '" gelöscht | Ordner: ' || l_obj_path.path
,i_object_ref => i_object_key
);
end p_delete_object;
procedure p_delete_folder (i_folder_key in varchar2)
/*Kopf------------------------------------------------------------------------------------------------
-- Beschreibung: Löscht einen leeren Ordner im OCI Bucket.
-- Schlägt fehl, wenn noch Objekte oder Unterordner vorhanden sind.
-- Beschreibung: Löscht einen leeren Ordner im OCI Bucket.
-- Schlägt fehl, wenn noch Objekte oder Unterordner vorhanden sind.
------------------------------------------------------------------------------------------------------
-- Parameter: i_folder_key Kompletter Ordner name inkl. Pfad (z.B. eingang/batch-001/)
------------------------------------------------------------------------------------------------------
-- MA Datum Änderung
-- MA Datum Änderung
-- SCK 2026-04-08 Prozedur erstellt
-- SCK 2026-04-10 Rekursives Löschen entfernt — Ordner muss leer sein
-- SCK 2026-04-10 Rekursives Löschen entfernt — Ordner muss leer sein
------------------------------------------------------------------------------------------------Kopf*/
is
l_objects t_net_storage_tab;
@@ -617,7 +617,7 @@ create or replace package body pck_net_storage as
pck_mitarbeiterrecht.p_hat_recht('ADMIN');
p_assert_allowed(l_prefix);
-- Direkte Kinder prüfen (Dateien und Unterordner)
-- Direkte Kinder prüfen (Dateien und Unterordner)
l_objects := f_list_objects_internal(
i_parent_folder => l_prefix
,i_include_subfolders => 'N'
@@ -626,14 +626,14 @@ create or replace package body pck_net_storage as
);
/*
apex_debug.info('p_delete_folder: prefix=%s, Anzahl gefundene Einträge=%s', l_prefix, l_objects.count);
apex_debug.info('p_delete_folder: prefix=%s, Anzahl gefundene Einträge=%s', l_prefix, l_objects.count);
for i in 1 .. l_objects.count
loop
apex_debug.info(' [%s] key=%s | is_folder=%s', i, l_objects(i).object_key, l_objects(i).is_folder);
end loop;
*/
-- Den Ordner selbst (object_key = l_prefix) aus der Zählung ausschließen
-- Den Ordner selbst (object_key = l_prefix) aus der Zählung ausschließen
select count(*)
into l_count
from table(l_objects)
@@ -641,10 +641,10 @@ create or replace package body pck_net_storage as
if l_count > 0
then
raise_application_error(-20017, 'Ordner ist nicht leer und kann nicht gelöscht werden');
raise_application_error(-20017, 'Ordner ist nicht leer und kann nicht gelöscht werden');
end if;
-- Ordner-Objekt selbst löschen
-- Ordner-Objekt selbst löschen
l_response := f_make_request(
i_method => 'DELETE'
,i_url => f_build_url(l_prefix)
@@ -654,7 +654,7 @@ create or replace package body pck_net_storage as
pck_log.p_info(
i_module => c_log_module
,i_action => 'DELETE_FOLDER'
,i_message => 'Ordner "' || l_obj_path.filename || '" gelöscht | Pfad: ' || l_obj_path.path
,i_message => 'Ordner "' || l_obj_path.filename || '" gelöscht | Pfad: ' || l_obj_path.path
,i_object_ref => l_prefix
);
end p_delete_folder;
@@ -667,10 +667,10 @@ create or replace package body pck_net_storage as
-- Beschreibung: Benennt ein Objekt innerhalb desselben Verzeichnisses um.
-- Verwendet die OCI renameObject-Action (kein physisches Kopieren).
------------------------------------------------------------------------------------------------------
-- Parameter: i_object_key Vollständiger Objektschlüssel des Quelldatei
-- Parameter: i_object_key Vollständiger Objektschlüssel des Quelldatei
-- i_new_name Neuer Dateiname (ohne Pfad)
------------------------------------------------------------------------------------------------------
-- MA Datum Änderung
-- MA Datum Änderung
-- SCK 2026-04-08 Prozedur erstellt
------------------------------------------------------------------------------------------------Kopf*/
is
@@ -689,7 +689,7 @@ create or replace package body pck_net_storage as
if instr(i_new_name, '/') > 0
then
raise_application_error(-20014, 'Dateiname darf keinen Schrägstrich enthalten — zum Verschieben explizite Verschieben-Funktion verwenden');
raise_application_error(-20014, 'Dateiname darf keinen Schrägstrich enthalten — zum Verschieben explizite Verschieben-Funktion verwenden');
end if;
l_obj_path := f_split_object_key(i_object_key);
@@ -698,7 +698,7 @@ create or replace package body pck_net_storage as
if l_new_key = i_object_key
then
raise_application_error(-20016, 'Der Dateiname darf beim Umbenennen nicht unverändert bleiben.');
raise_application_error(-20016, 'Der Dateiname darf beim Umbenennen nicht unverändert bleiben.');
end if;
select json_object(
@@ -730,12 +730,12 @@ create or replace package body pck_net_storage as
/*Kopf------------------------------------------------------------------------------------------------
-- Beschreibung: Verschiebt ein Objekt in einen anderen Ordner im selben Bucket.
-- Verwendet die OCI renameObject-Action (kein physisches Kopieren).
-- Der Dateiname bleibt erhalten; nur der Pfad ändert sich.
-- Der Dateiname bleibt erhalten; nur der Pfad ändert sich.
------------------------------------------------------------------------------------------------------
-- Parameter: i_object_key Vollständiger Objektschlüssel der Quelldatei
-- i_target_prefix Zielpräfix inkl. trailing Slash (z.B. verarbeitet/batch-001/)
-- Parameter: i_object_key Vollständiger Objektschlüssel der Quelldatei
-- i_target_prefix Zielpräfix inkl. trailing Slash (z.B. verarbeitet/batch-001/)
------------------------------------------------------------------------------------------------------
-- MA Datum Änderung
-- MA Datum Änderung
-- SCK 2026-04-08 Prozedur erstellt
------------------------------------------------------------------------------------------------Kopf*/
is
@@ -751,7 +751,7 @@ create or replace package body pck_net_storage as
if i_target_prefix is null
then
raise_application_error(-20015, 'Zielpräfix darf nicht null sein');
raise_application_error(-20015, 'Zielpräfix darf nicht null sein');
end if;
l_target_prefix := f_normalize_prefix(i_target_prefix);
@@ -802,10 +802,10 @@ create or replace package body pck_net_storage as
-- Beschreibung: Legt einen neuen Ordner im OCI Bucket an.
-- Ordner werden als leeres Objekt mit trailing Slash simuliert.
------------------------------------------------------------------------------------------------------
-- Parameter: i_parent_folder Übergeordneter Pfad inkl. trailing Slash (z.B. eingang/)
-- Parameter: i_parent_folder Übergeordneter Pfad inkl. trailing Slash (z.B. eingang/)
-- i_folder_name Name des neuen Ordners (ohne Slash)
------------------------------------------------------------------------------------------------------
-- MA Datum Änderung
-- MA Datum Änderung
-- SCK 2026-04-08 Prozedur erstellt
------------------------------------------------------------------------------------------------Kopf*/
is
@@ -823,7 +823,7 @@ create or replace package body pck_net_storage as
if instr(i_folder_name, '/') > 0
then
raise_application_error(-20011, 'Ordnername darf keinen Schrägstrich enthalten');
raise_application_error(-20011, 'Ordnername darf keinen Schrägstrich enthalten');
end if;
if l_prefix is not null
@@ -854,13 +854,13 @@ create or replace package body pck_net_storage as
function f_get_object_metadata (i_object_key in varchar2) return t_object_meta
/*Kopf------------------------------------------------------------------------------------------------
-- Beschreibung: Ruft die Metadaten eines Objekts per HEAD-Request ab (kein Download des Inhalts).
-- Liest Größe, Content-Type, Last-Modified und ETag aus den Response-Headern.
-- Liest Größe, Content-Type, Last-Modified und ETag aus den Response-Headern.
------------------------------------------------------------------------------------------------------
-- Parameter: i_object_key Vollständiger Objektschlüssel im Bucket
-- Parameter: i_object_key Vollständiger Objektschlüssel im Bucket
------------------------------------------------------------------------------------------------------
-- Rückgabe: t_object_meta Record mit object_name, object_size, last_modified, content_type, etag
-- Rückgabe: t_object_meta Record mit object_name, object_size, last_modified, content_type, etag
------------------------------------------------------------------------------------------------------
-- MA Datum Änderung
-- MA Datum Änderung
-- SCK 2026-04-08 Funktion erstellt
------------------------------------------------------------------------------------------------Kopf*/
is