为什么以下代码不起作用?它返回零行,即使我有许多匹配搜索条件。
表单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上运行代码。
答案 0 :(得分:4)
Oracle CX< {3}}对象具有只读rowcount
属性。 Rowcount
返回使用fetch *方法返回的行数。
假设查询产生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')