Python jaydebeapi - DB2

derocco

Lt. Junior Grade
Registriert
Nov. 2015
Beiträge
347
Hi zusammen,
Ich versuche gerade mit jaydebeapi einen CLOB der ein XML enthält aus einer DB2 zu entladen.

Das klappt soweit auch alles wenn ich
row = cursor.fetchone() verwende und dann den inhalt vom CLOB lese.

mit einem Fetchall und dann auslesen komme ich immer wieder in das Problem: "Lob is closed."


Das war der sample code:
Python:
try:
    # Disable auto-commit to manually manage transactions
    conn.jconn.setAutoCommit(False)

    # Execute SQL query to fetch LOB data
    cursor.execute("SELECT id, xml_clob_column FROM your_table")
    rows = cursor.fetchall()

    # Process each row immediately within the transaction
    for row in rows:
        record_id, xml_clob = row
        # Ensure the LOB is accessed before any commit or close
        if xml_clob:
            xml_content = xml_clob.getSubString(1, int(xml_clob.length()))
            print(f"XML content for record {record_id}: {xml_content}")

    # Commit the transaction after all LOB data has been safely processed
    conn.commit()

hat aber null geholfen auch mit Autocommit off etc ist der LOB geschlossen.


Ich überlege nun 1 Statement um die ID's vom resultset zu holen und dann durch die alle zu loopen und halt indiv. Queries absetzten die dann je 1 LOP abzieht.

Hatte jemand schon mal so ein Issue und das mit fetchall doch lösen können?
 
derocco schrieb:
mit einem Fetchall und dann auslesen komme ich immer wieder in das Problem: "Lob is closed."
dann mach doch kein fetchall :)

ich code kein python, aber versuch mal
Code:
for row in cursor:
(statt Zeile 10, Zeile 7 gelöscht)
 
Zuletzt bearbeitet:
Könnte evtl am progressive streaming über JDBC liegen. Probier das mal auszuschalten.
Im connection string
Code:
progressiveStreaming=2;
mit rein. 2 steht hier in JDBC für 0, also aus. Default ist an.

Immer wenn das Objekt größer ist als 32k (also nicht mehr in varchar(32000) passt) wird es bei neueren DB2 Versionen gestreamt, wenn du nichts eingestellt hast. Das kann zu solchen Fehlern führen.

Btw diese Python lib bzw Wrapper ist wohl Abandonware, würde mich nach was aktuellem bzw gepflegten umsehen.
 
Ich habes jetzt händisch gemacht.
Mit fetchone und loopen durch das Resultset mit jedesmal neu anziehen.
Performt trotzdem noch gut genug.
 
Zurück
Oben