lumnik. / scénarios Tous les scénarios · English

Oracle et BLOB: le plan refusé, la vue qui le pèse, le PDF perdu la nuit

Objectif Lire le registre des plans d'un PLM sur Oracle sans lire les plans eux-mêmes, et savoir le matin même qu'un plan diffusé a perdu son fichier.

Un bureau d'études garde ses plans dans un PLM sur Oracle: une ligne par révision, le PDF dans un BLOB.

$ lm secret set SCENARIO_PLM_PASSWORD_A -
Created secret "SCENARIO_PLM_PASSWORD_A"
$ lm source jdbc discover --password-stdin --url jdbc:oracle:thin:@//plm-oracle:1521/FREEPDB1 --user HUB_READER --schema PLM
SCHEMA     NAME                            ROWS  COLS PK                   WATERMARK       UNSUPPORTED
PLM        DOC_REVISION                      -1    10 ID                   MODIFIED_AT     CONTENT BLOB

$ lm source jdbc add scenario-plm-a --password-stdin --url jdbc:oracle:thin:@//plm-oracle:1521/FREEPDB1 --user HUB_READER --schema PLM --tables DOC_REVISION
Error: API error 400: table PLM.DOC_REVISION cannot be ingested: column CONTENT has unsupported Oracle type BLOB — v1 reads scalars and CLOB
view.sql
-- What the DBA adds: the register without the drawing itself, its size in bytes instead; REV without the padding of its CHAR(2).
CREATE VIEW V_DOC_REVISION AS
  SELECT ID, DOC_NO, RTRIM(REV) AS REV, TITLE, STATUS, RELEASED_AT, DESCRIPTION, FILE_NAME,
         NVL(DBMS_LOB.GETLENGTH(CONTENT), 0) AS CONTENT_BYTES, MODIFIED_AT
  FROM DOC_REVISION;
GRANT SELECT ON V_DOC_REVISION TO HUB_READER;
manifests/10-drawings.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-plm-drawings-a  connector_type: jdbc-generic  scopes: [engineering-a]spec:  connection:    url: jdbc:oracle:thin:@//plm-oracle:1521/FREEPDB1    user: HUB_READER    password_env: SCENARIO_PLM_PASSWORD_A  defaults:    schema: PLM  source:    tables:      - name: V_DOC_REVISION            # the view: DOC_REVISION holds a BLOB, refused        mode: watermark                 # full never reads an updated row again        watermark_column: MODIFIED_AT        pk_columns: [ID]        target: scenario_plm_drawings_a        rename:          ID: revision_id          DOC_NO: doc_no          REV: rev          TITLE: title          STATUS: status          RELEASED_AT: released_at          DESCRIPTION: description          FILE_NAME: file_name          CONTENT_BYTES: content_bytes          MODIFIED_AT: modified_at
manifests/20-file-lost.yaml
apiVersion: apps.lumnik.io/v1kind: Processmetadata:  name: scenario-plm-file-lost-aspec:  scope: engineering-a  on: { event: data.row.changed, table: connector.t_scenario_plm_drawings_a }  when:    - "status=RELEASED"    - "content_bytes=0"                # a released drawing whose PDF is empty  emit:    type: decision.drawing-file-lost-a    message: "{doc_no} rev {rev} ({title}) is released since {released_at} and its file {file_name} is empty — find the PDF before the workshop asks for it"    key: doc_no
archive.sql
-- The night's archive migration: the PDFs move to the new document store, two of them never arrive,
-- and the rows are copied back with an empty BLOB. The PLM stamps MODIFIED_AT, as on every write.
UPDATE DOC_REVISION SET CONTENT = EMPTY_BLOB(), MODIFIED_AT = TIMESTAMP '2026-11-08 02:14:00' WHERE (DOC_NO, REV) IN (('PL-1004', 'C '), ('PL-1007', 'B '));
COMMIT;

Limites

  • Le hub ne lit pas un BLOB: ni le PDF, ni son contenu, ni une empreinte. Une vue en donne la taille; un PDF corrompu mais non vide passe.
  • La vue est un geste de l'administrateur Oracle: le hub ne la crée pas.
  • Le mode watermark suppose que le PLM met MODIFIED_AT à jour. Une écriture qui ne le touche pas n'est pas relue.
  • La règle ne voit que les pertes à venir: un plan déjà vide au premier run est lu avant que le Process existe.
  • Joué sur Oracle 23ai Free. lumnik Pro seulement: l'édition Open n'a pas de fournisseur Oracle.
  • Plans, révisions et dates synthétiques; les PDF sont de vrais PDF d'une page.

Bureau d'études · PLM

Les plans vivent dans Oracle.

Une ligne par révision, le PDF dans un BLOB.

CONTENT BLOB

Le problème

Le hub ne lit pas un BLOB.

  • La table est refusée, colonne nommée.
  • Et un PDF vide ne se voit nulle part.

Ce qui n'est pas modifié

La table du PLM reste telle quelle.

  • Le PLM continue d'écrire ses plans.
  • Aucun PDF ne quitte Oracle.

Ce qu'il a fallu écrire

NVL(DBMS_LOB.GETLENGTH(CONTENT), 0)
  AS CONTENT_BYTES

Une vue: le plan pesé, pas lu.

  • mode: watermark sur MODIFIED_AT.
  • Une règle: diffusé et 0 octet.

Ce qui a été corrigé

discover --include-views montre la vue (#1890).

  • ROWS -1 pour une table jamais analysée (#1891).
  • PL-1004 C et PL-1007 B: deux décisions.

Essayer

Le scénario se rejoue en local.

Chaque étape est publiée avec sa sortie.

Ce scénario demande lumnik Pro.

Voir l'offre →