You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django+cx_Oracle查询Oracle 11g视图'ORDER'遇ORA-01722错误求助

解决方案:处理Oracle保留关键字作为视图名引发的ORA-01722错误

核心原因

ORDER是Oracle的保留关键字,直接调用会导致SQL解析器混淆——将其识别为ORDER BY的排序关键字,而非视图名称,最终触发ORA-01722错误(属于解析逻辑混乱引发的表象错误)。

具体解决方法

1. 原生RAW查询处理

在原生SQL语句中,必须用双引号"包裹视图名,强制Oracle将其识别为对象名称:

from django.db import connection

with connection.cursor() as cursor:
    # 双引号需保留,视图名大小写要与数据库定义完全一致(Oracle默认存储为大写)
    cursor.execute('SELECT * FROM "ORDER"')
    rows = cursor.fetchall()

2. Django模型映射处理

如果通过Django模型关联该视图,需在模型Meta类的db_table属性中用双引号包裹视图名:

from django.db import models

class OrderView(models.Model):
    # 字段与视图结构一一对应,示例字段
    order_id = models.IntegerField()
    order_date = models.DateTimeField()
    # 其他字段...

    class Meta:
        managed = False  # 视图无需Django管理表结构
        db_table = '"ORDER"'  # 用双引号包裹保留关键字视图名

之后即可正常使用ORM查询:

orders = OrderView.objects.all()

3. 直接使用cx_Oracle的处理

若绕过Django直接用cx_Oracle连接查询,同样需要在SQL中用双引号包裹视图名:

import cx_Oracle

conn = cx_Oracle.connect(user="你的用户名", password="你的密码", dsn="你的数据库DSN")
cursor = conn.cursor()
cursor.execute('SELECT * FROM "ORDER"')
rows = cursor.fetchall()
cursor.close()
conn.close()

注意事项

Oracle对象名称默认以大写存储,务必保证双引号内的视图名大小写与数据库中完全匹配,否则会引发对象不存在的错误。

内容的提问来源于stack exchange,提问作者Marek Zacharewicz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:33:09