Tengo este código:

    dsn = cx_Oracle.makedsn(hostname, port, sid)
    orcl = cx_Oracle.connect(username + '/' + password + '@' + dsn)
    curs = orcl.cursor()
    sql = "select TEMPLATE from my_table where id ='6'"
    curs.execute(sql)
    rows = curs.fetchall()
    print rows
    template = rows[0][0]
    orcl.close()
    print template.read()

Cuando hago print rows, me sale esto:

[(<cx_Oracle.LOB object at 0x0000000001D49990>,)]

Sin embargo, cuando hago print template.read(), me sale este error:

cx_Oracle.DatabaseError: identificador no Válido!

¿ Cómo puedo conseguir y leer este tipo de datos? Gracias.

OriginalEl autor Di Zou | 2011-12-27

3 Comentarios

  1. 18

    He encontrado que esto sucede en el caso cuando la conexión a Oracle está cerrada antes de la cx_Oracle.LOB.método read() se utiliza.

    orcl = cx_Oracle.connect(usrpass+'@'+dbase)
    c = orcl.cursor()
    c.execute(sq)
    dane =  c.fetchall()
    
    orcl.close() # before reading LOB to str
    
    wkt = dane[0][0].read()

    Y me sale: DatabaseError: identificador no Válido!

    Pero funciona el siguiente código:

    orcl = cx_Oracle.connect(usrpass+'@'+dbase)
    c = orcl.cursor()
    c.execute(sq)
    dane =  c.fetchall()
    
    wkt = dane[0][0].read()
    
    orcl.close() # after reading LOB to str
    alguna idea de por qué este es el caso?
    Aún no puedo reproducir el error más, pero es bueno que se sepa. Gracias! Edit: en Realidad, yo sólo reproducido y que trabajó después de mover la orcl.close() para después de la read(). Gracias!
    Hice algunas pruebas más. Esto sucede solamente en datos de línea de negocio. Esto es realmente interesante. Puedo hacer otra pregunta acerca de esto.

    OriginalEl autor geowrw

  2. 6

    Imaginé. Tengo que hacer algo como esto:

    curs.execute(sql)        
    for row in curs:
        print row[0].read()
    Para añadir a esto, si la fila es de tipo int única fila[0] es necesario. Para int no hay ninguna read().

    OriginalEl autor Di Zou

  3. 0

    Básicamente tiene un bucle a través de la fetchall objeto

    dsn = cx_Oracle.makedsn(hostname, port, sid)
    orcl = cx_Oracle.connect(username + '/' + password + '@' + dsn)
    curs = orcl.cursor()
    sql = "select TEMPLATE from my_table where id ='6'"
    curs.execute(sql)
    rows = curs.fetchall()
    for x in rows:
       list_ = list(x)
       print(list_)

    OriginalEl autor Jain26

Dejar respuesta

Please enter your comment!
Please enter your name here