From edb5a70449501495becd799458fb2a0ed03af208 Mon Sep 17 00:00:00 2001 From: "Simon C. Kessler" Date: Thu, 9 Apr 2026 09:29:05 +0200 Subject: [PATCH] =?UTF-8?q?Einf=C3=BChren=20zus=C3=A4tzlicher=20Parameter?= =?UTF-8?q?=20f=C3=BCr=20Ordnerstruktur=20auf=20Object=20Store?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/docs/plan_pck_net_storage.md | 13 ++++++++----- database/packages/pck_auto_import.pkb | 23 +++++++++++++---------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/database/docs/plan_pck_net_storage.md b/database/docs/plan_pck_net_storage.md index 602b672..320a329 100644 --- a/database/docs/plan_pck_net_storage.md +++ b/database/docs/plan_pck_net_storage.md @@ -51,11 +51,14 @@ Alle zur Laufzeit via `pck_system.f_get_par_wert_by_programmid`: | Parameter-ID | Inhalt | |---|---| -| `NET_STORAGE_BUCKET` | Bucket-Name | -| `NET_STORAGE_NAMESPACE` | OCI Object Storage Namespace | -| `NET_STORAGE_REGION` | z.B. `eu-frankfurt-1` | -| `NET_STORAGE_TENANT_ID` | Erlaubter Root-Prefix, z.B. `mandant_42/` | -| `NET_STORAGE_APEX_CREDENTIAL_ID` | Credential Static ID für apex_web_service calls, z.B. 'OCI_OBJ_STORE_CRED' | +| `NETSTORE_BUCKET` | Bucket-Name | +| `NETSTORE_NAMESPACE` | OCI Object Storage Namespace | +| `NETSTORE_REGION` | z.B. `eu-frankfurt-1` | +| `NETSTORE_TENANT_ID` | Erlaubter Root-Prefix, z.B. `mandant_42/` | +| `NETSTORE_CRED_ID` | Credential Static ID für apex_web_service calls, z.B. 'OCI_OBJ_STORE_CRED' | +| `NETSTORE_MARKER_NAME` | Name der Marker-Datei im Object Store, der von Automaton abgelegt wird, um zu signalisieren, dass der entsprechende Unterordner komplett hochgeladen wurde. Verhindert die Verarbeitung von unvollständig hochgeladenen Ordnern. z.B.: `_READY_FOR_DB_PROCESSING_` | +| `NETSTORE_BA_PREFIX` | Pfad in Object Storage, wo BA-Daten liegen. Muss mit einem `/` enden, z.B. `BA/Eingang/` | +| `NETSTORE_BA_IMPORT` | Name des Unterordners von NETSTORE_BA_PREFIX im Object Storage, wo entpackte Dateien, die noch importiert werden müssen, zwischengespeichert werden. | --- diff --git a/database/packages/pck_auto_import.pkb b/database/packages/pck_auto_import.pkb index c105319..aa47d43 100644 --- a/database/packages/pck_auto_import.pkb +++ b/database/packages/pck_auto_import.pkb @@ -1,10 +1,6 @@ create or replace package body pck_auto_import as c_module constant varchar2(20) := 'PCK_AUTO_IMPORT'; - c_eingang_prefix constant varchar2(10) := 'eingang/'; - c_marker constant varchar2(50) := '_READY_FOR_DB_PROCESSING_'; - -- Zielordner nach erfolgreicher Verarbeitung — ggf. in sy_parameter auslagern - c_target_prefix constant varchar2(20) := 'verarbeitet/'; procedure p_import_file ( i_object_key in varchar2 @@ -56,15 +52,22 @@ create or replace package body pck_auto_import as l_file_etag varchar2(256); -- Verarbeitungsvariablen l_marker_key varchar2(1024); - l_target_folder varchar2(1024); + l_target_folder varchar2(4000 char); + l_target_prefix varchar2(4000 char); + l_eingang_prefix varchar2 (4000 char); l_zip_name varchar2(512); l_file_content blob; l_meta pck_net_storage.t_object_meta; l_remaining number; + begin + -- Zielordner Name zusammenstellen + l_target_prefix := pck_system.f_get_par_wert_by_programmid('NETSTORE_BA_PREFIX') || 'Verarbeitet ' || to_char(sysdate, 'YYYY') || '/'; + l_eingang_prefix := pck_system.f_get_par_wert_by_programmid('NETSTORE_BA_PREFIX') || pck_system.f_get_par_wert_by_programmid('NETSTORE_BA_IMPORT'); + -- Unterordner in eingang/ auflisten (Delimiter '/' liefert nur direkte Kinder) l_folder_cursor := pck_net_storage.f_list_objects( - i_prefix => c_eingang_prefix + i_prefix => l_eingang_prefix ,i_delimiter => '/' ); @@ -81,7 +84,7 @@ create or replace package body pck_auto_import as -- Der Marker ist eine Datei mit speziellem Namen, welche vom quarkus automaton in einen entpackten zip-ordner gelegt wird um zu signalisieren, dass alle Dateien des ZIPs erfolgreich in den ordner gelegt wurden. -- Das verhindert die verarbeitung von unvollständig entpackten zips - l_marker_key := l_folder_name || c_marker; + l_marker_key := l_folder_name || pck_system.f_get_par_wert_by_programmid('NETSTORE_MARKER_NAME'); -- Marker prüfen: -20001 = nicht vorhanden → Upload noch nicht abgeschlossen begin @@ -99,10 +102,10 @@ create or replace package body pck_auto_import as -- Zip-Namen aus Ordnerpfad ableiten: eingang// → l_zip_name := substr( l_folder_name - ,length(c_eingang_prefix) + 1 - ,length(l_folder_name) - length(c_eingang_prefix) - 1 + ,length(l_eingang_prefix) + 1 + ,length(l_folder_name) - length(l_eingang_prefix) - 1 ); - l_target_folder := c_target_prefix || l_zip_name || '/'; + l_target_folder := l_target_prefix || l_zip_name || '/'; -- Alle Dateien im Unterordner auflisten (kein Delimiter = flach, alle Tiefen) l_file_cursor := pck_net_storage.f_list_objects(