Python Jupyter用cx_Oracle执行DESCRIBE语句报ORA-00900错误如何解决
你遇到的ORA-00900报错原因是:DESCRIBE是Oracle官方客户端工具(如SQL*Plus、PL/SQL Developer)自带的交互式命令,不属于标准SQL语法,因此无法直接通过cx_Oracle执行。要实现等效的字段详情查询,可使用以下两种方案:
方案1:查询Oracle系统数据字典(推荐,可获取完整元信息)
Oracle的ALL_TAB_COLUMNS系统视图存储了所有当前账号有权限访问的表的字段元数据,查询该视图可以得到和DESCRIBE完全一致的信息,包括字段名、数据类型、长度、精度、非空约束等。
import cx_Oracle connection = cx_Oracle.connect(user=username, password=userpwd, dsn=dsn, encoding="UTF-8") cursor = connection.cursor() # 构造查询语句,注意表名、用户名大小写要和Oracle库中存储一致 desc_query = """ SELECT COLUMN_NAME AS 字段名, DATA_TYPE AS 字段类型, DATA_LENGTH AS 类型长度, DATA_PRECISION AS 数值精度, DATA_SCALE AS 小数位数, NULLABLE AS 是否允许为空 FROM ALL_TAB_COLUMNS WHERE OWNER = 'ARADMIN' AND TABLE_NAME = 'EPM_TechnicianInformation' ORDER BY COLUMN_ID ASC """ cursor.execute(desc_query) # 获取所有字段详情 column_details = cursor.fetchall() # 打印结果 for col in column_details: print(col) cursor.close() connection.close()
如果查询的是当前登录用户名下的表,也可以直接查询USER_TAB_COLUMNS视图,不需要加OWNER过滤条件。
方案2:使用cx_Oracle内置的description属性
如果只需要快速获取字段名和基础类型,不需要复杂的元信息,可以执行一个无返回结果的查询,直接通过cursor的description属性读取字段结构,不需要记忆系统视图语法。
import cx_Oracle connection = cx_Oracle.connect(user=username, password=userpwd, dsn=dsn, encoding="UTF-8") cursor = connection.cursor() # 加WHERE 1=0条件不会返回任何业务数据,仅加载表的字段结构 cursor.execute("SELECT * FROM ARADMIN.EPM_TechnicianInformation WHERE 1=0") # description返回的每个元组对应一个字段的属性:(名称, 类型编码, 显示长度, 内部长度, 精度, 小数位, 是否允许为空) for col_attr in cursor.description: print(f"字段名:{col_attr[0]}, 类型编码:{col_attr[1]}, 允许为空:{col_attr[6]}") cursor.close() connection.close()
如果需要将类型编码转为可读的类型名称,可以直接匹配cx_Oracle内置的类型常量,例如cx_Oracle.DB_TYPE_VARCHAR对应字符串类型、cx_Oracle.DB_TYPE_NUMBER对应数值类型。
内容的提问来源于stack exchange,提问作者Bharti
相关产品推荐
相关产品推荐

