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

如何在Python的Oracle查询语句中传递表名参数?

在Python的Oracle查询中传递表名参数的正确方式

你的三种写法的问题

  • 写法1(字符串拼接):存在语法错误(Python不支持string table_name的变量声明,应改为table_name = "abctable"),且有严重SQL注入风险——如果表名来自不可信输入,攻击者可构造特殊值执行任意SQL。
  • 写法2(&table_name):这是Oracle SQL*Plus的专属变量语法,cx_Oracle驱动不支持,执行会直接报错。
  • 写法3(:table_name):绑定变量仅能传递查询中的值参数(如WHERE条件的字段值),无法用于替换表名、列名这类数据库对象名,Oracle会抛出语法错误。

正确实现思路

由于Oracle不支持用绑定变量替换对象名,必须通过安全校验+合法拼接的方式实现,步骤如下:

  1. 严格校验表名合法性

    • 限制表名仅包含字母、数字、下划线(Oracle标识符的合法字符);
    • 维护允许访问的表名白名单,只接受白名单内的表名;
    • 若需支持模式名(如SCOTT.EMP),需分别校验模式名和表名的合法性。
  2. 安全拼接SQL语句
    使用cx_Oracle提供的cursor.identifier()方法处理表名,该方法会自动处理标识符的大小写、特殊字符等问题,同时降低注入风险:

    import cx_Oracle
    
    conn_str = u'user/password@host:port/service'
    conn = cx_Oracle.connect(conn_str)
    c = conn.cursor()
    
    table_name = "abctable"
    # 安全处理表名,自动适配Oracle标识符规则
    safe_table = c.identifier(table_name)
    # 拼接并执行SQL
    c.execute(f'select your_col_1, your_col_2 from {safe_table}')
    
    for row in c:
        print(row[0], "-", row[1])
    
    conn.close()
    
  3. 核心注意事项
    绝对不能直接使用未校验的用户输入作为表名,白名单校验是防止SQL注入的关键。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:53:22