【问题标题】:cx_Oracle query returns zero rowscx_Oracle 查询返回零行
【发布时间】:2013-09-28 04:13:18
【问题描述】:

为什么下面的代码不起作用?即使我有很多多个匹配搜索条件,它也会返回零行。

select * from Table_1 形式的简单查询可以正常工作并返回正数行数

import cx_Oracle
def function_A (data):
    connection = cx_Oracle.connect('omitted details here')

    for index in range(len(data)):
        # connection is already open
        cursor = connection.cursor()

        query = "select * from Table_1 where column_1=:column1 and column_2=:column2 and column_3=:column3 and column_4=:column4"
        bindVars={'column1':data[index][3], 'column2':data[index][4], 'column4':data[index][5], 'column5':data[index][6]}
        cursor.execute(query, bindVars)
        cursor.arraysize = 256
        rowCount = 0
        resultSet = cursor.fetchall()
        if (resultSet != None):
            logger.debug("Obtained a resultSet with length = %s", len(resultSet))
            for index in range(len(resultSet)):
                logger.debug("Fetched one row from cursor, incrementing counter !!")
                rowCount = rowCount + 1
                logger.debug("Fetched one row from cursor, incremented counter !!")
            logger.debug("Successfully executed the select statement for table Table_1; that returned %s rows !!", rowCount)
            logger.debug("Successfully executed the select statement for table Table_1; that returned %s rows !!", cursor.rowcount)

请忽略轻微的格式问题,代码运行不会给我一个正数的行数。

代码正在使用 python2.6 和 cx_Oracle 兼容版本的 IBM AIX 上运行。

【问题讨论】:

    标签: python sql cx-oracle


    【解决方案1】:

    Oracle CX 的 cursor 对象具有只读的 rowcount 属性。 Rowcount 正在返回使用 fetch* 方法返回的行数。

    假设查询产生5行,那么交互是这样的

    1. 执行行数 = 0
    2. fetchone rowcount = 1
    3. fetchone rowcount = 2
    4. fetchall 行数 = 5

    您不需要手动跟踪它。您的查询问题必须首先解决:)

    【讨论】:

    • 虽然这个答案对于 Oracle CX 游标的行为方式是正确的,但值得指出的是 this behaviour is wrong and not as per the spec。事实上,Oracle 的 cx .rowcountSELECT 的行为方式正是 .rownumber 应该做的:"这个只读属性应该在结果中提供当前从 0 开始的游标索引如果无法确定索引,请设置或None。” 当然,'cx_Oracle.Cursor' object has no attribute 'rownumber'
    • @aneroid 感谢您的精彩评论!
    【解决方案2】:

    您的查询返回 0 行,因为有 0 行与您的查询匹配。从 WHERE 子句中删除谓词或将传递的值更改为一个。

    值得注意的是,您没有在bindVars 变量中将任何内容绑定到column3。我也不完全确定你为什么要迭代,cursor.rowcount,因为你有它为你提供了游标已获取的行数。

    一般来说,如果您认为 SELECT 语句没有返回正确的结果,则将其作为我们的代码并直接针对数据库运行它。首先绑定所有变量,以便您可以准确地看到您实际运行的内容。

    【讨论】:

    • 另外,column5 未在查询中列出,但在 bindVars 中。
    • 我不认为这会有所作为@Burhan;删除谓词不会限制返回的行数。
    • 我不确定它是否会触发错误,但它的另一件事(在许多中)应该用 sn-p 修复。
    【解决方案3】:

    将我的头撞到显示器上...您必须执行以下操作来检查,因为一旦您操作光标值就会发生变化:

        result_set = DB_connector.execute(sql)
        result_list = result_set.fetchall()  # assign the return row to a list
        if result_set.rowcount == 0:
            print('DB check failed, no row returned')
            sql_result_set = None
        else:
            for row in result_list:  # use this instead result_set 
                print('row fetched: ' + row[0])
                sql_result_set.append(row[0])
                print('DB test Passed')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多