If you need SQL statement columns description then just use cursor.description. If you need exact table schema the select from ALL_TAB_COLUMNS oracle view:
cnn = cx_Oracle.connect(cnn_str)
cursor = cnn.cursor()
cursor.execute("SELECT * FROM dual")
print(cursor.description)
cursor.execute("select * from ALL_TAB_COLUMNS where table_name = 'DUAL'")
print(cursor.fetchall())
cursor.close()
It will provede output:
[('DUMMY', <class 'cx_Oracle.STRING'>, 1, 4, None, None, 1)]
[('SYS', 'DUAL', 'DUMMY', 'VARCHAR2', None, None, 1, None, None, 'Y', 1, None, None, 1, b'X', b'X', 1, 0, 1, datetime.datetime(2009, 4, 25, 23, 49, 59), 1, 'CHAR_CS', 1, 'YES', 'NO', 2, 1, 'B', 'NO', 'YES', 'NONE', 'NO', 'NO', None, None, None)]
USE databasefirst?