Не указано, какой модуль используется для доступа к Oracle, поэтому я предполагаю, что это cx_Oracle.
При чтении большого объекта из Oracle OCI предоставляет локатор большого объекта, который оборачивается в объект с помощью cx_Oracle. Таким образом, в примере dataDB [0] является не строкой, а объектом cx_Oracle.LOB. В зависимости от того, как закодирован ParseFromString, он может или не может быть должным образом преобразован в строку.
Поэтому я бы использовал dataDB [0] .read () в качестве параметра для ParseFromString.
cursor.execute("select myblob from mytable")
for dataDB in cursor:
lob = dataDB[0].read()
print "size:", len(lob)
mydata = Data_pb2.MyData()
mydata.ParseFromString(lob)
Кроме того, метод ByteSize () обычно используется во время сериализации для вычисления размера сериализованного сообщения. Я не уверен, что его можно использовать сразу после разбора сообщения. В API буфера протокола ByteSize () явно связан с сериализацией. На самом деле бессмысленно вызывать его во время разбора, поскольку размер буфера уже известен до разбора.