我们有一个巨大的SQL脚本,涉及数十个表,子查询,数百个属性。它在测试数据库中完美运行,但在生产数据库中运行时返回sql subquery returns more than 1 row
错误。这个剧本到目前为止一直运作良好。问题是,我得到的只是上面指定的单行错误,没有任何线索,确切的子查询导致错误,使得它几乎无法调试。问题是,我怎么知道SQL的哪一行导致错误?有没有什么方法可以像在编程语言中那样逐行“调试”它?
我正在使用TOAD和Oracle 11g。
答案 0 :(得分:2)
向脚本添加print
或DBMS_OUTPUT.PUT_LINE
命令以打印邮件。和/或在脚本中使用异常处理程序。可能会添加一些变量来计算或标记您所在的语句,并将其输出到异常处理程序中。
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/errors.htm
找到导致问题的查询后,将其转换为具有相应group by
和having count(*) > 1
的类似查询,以便您可以查看导致问题的数据。例如,如果您有一个相关的子查询,如下所示:
(select name from names where id=foo.id)
然后写一个类似的查询
select id from names group by id having count(*) > 1
识别违规数据。
如果查询中有多个子查询产生错误,您可以暂时将子查询转换为使用临时表,并将它们全部搜索为重复项。