LOB.read(0) gives unhelpful error message in thin mode · Issue #13 · oracle/python-oracledb (original) (raw)

The following Python script:

import oracledb db = oracledb.connect("user/pwd@db") c = db.cursor() c.execute("select to_clob('foo') from dual").fetchone()[0].read(0)

gives the following output:

Traceback (most recent call last):
  File "/Users/walter/oracledb_bug.py", line 4, in <module>
    c.execute("select to_clob('foo') from dual").fetchone()[0].read(0)
  File "/Users/walter/pyvenvs/default/lib/python3.10/site-packages/oracledb/lob.py", line 116, in read
    return self._impl.read(offset, amount)
  File "src/oracledb/impl/thin/lob.pyx", line 140, in oracledb.thin_impl.ThinLobImpl.read
  File "src/oracledb/impl/thin/protocol.pyx", line 294, in oracledb.thin_impl.Protocol._process_single_message
  File "src/oracledb/impl/thin/protocol.pyx", line 295, in oracledb.thin_impl.Protocol._process_single_message
  File "src/oracledb/impl/thin/protocol.pyx", line 288, in oracledb.thin_impl.Protocol._process_message
oracledb.exceptions.DatabaseError: ORA-03137: malformed TTC packet from client rejected: [kpolob:offset 0] [0] [0] [2] [] [] [] []

In thick mode I get:

Traceback (most recent call last):
  File "/Users/walter/oracledb_bug.py", line 5, in <module>
    c.execute("select to_clob('foo') from dual").fetchone()[0].read(0)
  File "/Users/walter/pyvenvs/default/lib/python3.10/site-packages/oracledb/lob.py", line 116, in read
    return self._impl.read(offset, amount)
  File "src/oracledb/impl/thick/lob.pyx", line 168, in oracledb.thick_impl.ThickLobImpl.read
  File "src/oracledb/impl/thick/utils.pyx", line 409, in oracledb.thick_impl._raise_from_odpi
  File "src/oracledb/impl/thick/utils.pyx", line 399, in oracledb.thick_impl._raise_from_info
oracledb.exceptions.DatabaseError: ORA-24801: Unzulässiger Parameterwert in OCI-LOB-Funktion

which at least gives a hint at what the problem is.

import sys, platform, oracledb

print(f"{platform.platform()=}") print(f"{sys.maxsize > 2**32=}") print(f"{platform.python_version()=}") print(f"{oracledb.version=}")

prints

platform.platform()='macOS-12.4-x86_64-i386-64bit'
sys.maxsize > 2**32=True
platform.python_version()='3.10.4'
oracledb.__version__='1.0.0'

The database is an Oracle XE.

select value from nls_database_parameters where parameter='NLS_RDBMS_VERSION';

returns 21.0.0.0.0.