2

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

表单的简单查询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 上运行。

4

3 回答 3

5

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

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

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

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

于 2016-04-22T07:32:35.287 回答
1

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

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

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

于 2013-09-28T06:15:43.487 回答
0

把我的头撞在这个显示器上......你必须做下面的事情来检查,因为一旦你操作光标值就会改变:

    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')
于 2017-03-31T07:53:16.013 回答