cx_Oracle查询返回零行

时间:2013-09-28 04:13:18

标签: python sql cx-oracle

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

表单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上运行代码。

3 个答案:

答案 0 :(得分:4)

Oracle CX< {3}}对象具有只读rowcount属性。 Rowcount返回使用fetch *方法返回的行数。

假设查询产生5行,那么交互就像这样

  1. 执行rowcount = 0
  2. fetchone rowcount = 1
  3. fetchone rowcount = 2
  4. fetchall rowcount = 5
  5. Thay方式你不需要手动跟踪它。您的查询问题必须首先解决:)

答案 1 :(得分:1)

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

值得注意的是,您的column3变量中的bindVars没有绑定任何内容。我也不完全确定你为什么要迭代cursor.rowcount,因为它会给你一些光标提取的行数。

通常,如果您认为SELECT语句没有返回正确的结果,那么请将其作为代码并直接针对数据库运行。首先绑定所有变量,这样您就可以看到完全您实际运行的是什么。

答案 2 :(得分: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')