我花了很长时间来处理这个问题:“没有数据-零行获取、选择或处理”。我意识到问题的一部分是不同版本的MySQL(或者可能是Django和Python)会导致不同的行为。我不认为这是Python或Django特有的,但不知道。我不知道它是否与设置的变量有关,而不是不同版本中固有的一些东西。在
这两套版本是:set1:(MySQL:5.5.19),(Python:2.7.1),(Django:1.3.0)
set2:(MySQL:5.0.05),(Python:2.6.8),(Django:1.2.4)
我的工作:
在Python中(通过Django):cursor.execute("select function_1() from dual")
cursor.fetchall()
定义:伪查询是指数据库中保证返回行的任何查询,但在代码逻辑中没有任何用途。在
continue-handler_1329是:为1329声明continue处理程序begin-end
在版本集1中
案例1a:Python调用函数_1,该函数的最后一个查询返回NULL。我们得到了错误。在通过在结尾包含伪查询(或确保最后一个查询不返回null)来修复此问题。在
包含continue_handler_1329没有任何效果,假设函数_1没有游标。见下文。在
案例1b:Python调用函数_1,后者调用function2。没有mysql游标。如果function2的最后一个查询返回null:function2仍然正确求值,并向function1返回正确的值。在无需修复。在
包含continue_handler_(在任何一个函数中)都没有效果(它仍然有效)。在
案例1c:Python调用函数_1,它打开一个调用function2的游标(在游标循环内或在游标选择本身中)。如果function2的最后一个查询返回null:这是错误的。光标立即关闭,函数_1继续,就好像光标已被计算一样。没有警告。在通过在函数2的末尾包含伪查询(或确保其最后一个查询不返回null)修复了此问题
在函数2中包含continue_handler_1329没有效果。在
将continue_handler_1329包含在函数_1中会导致无限循环。当游标用完行时,它不会在自己的处理程序中结束,而是在新的处理程序中结束,而不是设置Done=True。在
关于版本1的总结:将最后一个伪查询添加到从Python调用的函数以及可能从游标调用的任何函数。或者确保这些函数的最后一个查询永远不会返回null。continue_handler_1329不能解决此问题,并且会导致带有游标的函数出现问题(除非continue_handler_1329在它自己的作用域内)。在
在版本集2中
案例2a:Python调用函数_1,其中任何查询都返回NULL。我们得到了错误。在没有虚拟查询可以修复此问题。在
通过包含continue_handler_1329修复,假设函数_1没有任何游标(见下文)。或者确保没有查询返回null。在
案例2b:Python调用函数_1,后者调用函数2。没有mysql游标。如果function2s有任何返回null的查询:我们得到错误。在虚拟查询无法修复此问题。在
通过在函数2中包含continue_handler_1329(或确保没有查询返回null)修复了此问题。在
在function1中包含continue_handler_1329没有效果,除非它有一个游标(见下文)
案例2c:Python调用函数_1,该函数打开一个调用函数2的游标(在游标循环内或
在光标中选择自身)。如果function2有任何返回null的查询:我们得到错误。在没有虚拟查询可以修复此问题。在
通过在函数2中包含continue_handler_1329(或确保没有查询返回null)修复了此问题。在
将continue_handler_1329包含在函数_1中会导致infinite循环。当游标用完行时,它不会在自己的处理程序中结束,而是在新的处理程序中结束,而不是设置Done=True。在
第2版总结将continue_handler_添加到任何可能具有返回null的查询的函数中,带有游标的函数除外。这些不应包含任何返回null的查询,声明的游标本身除外。但是,带有游标的函数可能包含一个单独的begin-end作用域和一个返回null的查询和continue处理程序_1329。在
总之,它在以下两个方面都能发挥作用:将continue_handler_添加到可能包含返回null的查询的所有函数中,并将最后一个伪查询添加到从Python调用的函数以及可以从游标调用的任何函数。带有游标的函数不能包含continue_handler_1329,也不能包含返回null的查询,除非它们位于单独的begin-end作用域中。(游标查询本身可能返回null,这将由游标的continue处理程序处理)。在