如何调试“sql子查询返回超过1行”错误

时间:2013-09-19 19:38:32

标签: sql oracle subquery

我们有一个巨大的SQL脚本,涉及数十个表,子查询,数百个属性。它在测试数据库中完美运行,但在生产数据库中运行时返回sql subquery returns more than 1 row错误。这个剧本到目前为止一直运作良好。问题是,我得到的只是上面指定的单行错误,没有任何线索,确切的子查询导致错误,使得它几乎无法调试。问题是,我怎么知道SQL的哪一行导致错误?有没有什么方法可以像在编程语言中那样逐行“调试”它? 我正在使用TOAD和Oracle 11g。

1 个答案:

答案 0 :(得分:2)

向脚本添加printDBMS_OUTPUT.PUT_LINE命令以打印邮件。和/或在脚本中使用异常处理程序。可能会添加一些变量来计算或标记您所在的语句,并将其输出到异常处理程序中。

http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/errors.htm

找到导致问题的查询后,将其转换为具有相应group byhaving count(*) > 1的类似查询,以便您可以查看导致问题的数据。例如,如果您有一个相关的子查询,如下所示:

(select name from names where id=foo.id)

然后写一个类似的查询

select id from names group by id having count(*) > 1

识别违规数据。

如果查询中有多个子查询产生错误,您可以暂时将子查询转换为使用临时表,并将它们全部搜索为重复项。