========================================================================================
2016/4/24_第1次修改 ccb_warlock
========================================================================================
今天在调试项目代码是发现存储过程中的查询语句异常报错的问题。
1 SELECT T.SN 2 INTO MY_SN 3 FROM RMES.R_WIP_STATION_T T 4 WHERE T.SN2 = SN2 5 AND T.REWORK_FLAG = '2';
此处的SN2是存储过程的一个输入值,通过外部的SQL查询这段SQL查询只得到一条记录,但是存储过程运行下来捕获到了逻辑错误,调试该存储过程发现是上面的这段查询报异常,于是加存储过程异常信息获取的变量,报“ORA-01422: 实际返回的行数超出请求的行数”,原来是在存储过程中该SQL查询得到了多行结果,故存储一个变量会引发异常。
1 SELECT COUNT(*) 2 INTO MY_TEMP_QTY 3 FROM RMES.R_WIP_STATION_T T 4 WHERE T.SN2 = SN2 5 AND T.REWORK_FLAG = '2';
那么到底是找到多少数据呢,进一步获取查询的记录数量,查询得到有11条记录。
首先想到的就是某个条件可能没作为条件查询,一校验之后发现问题是出在了"T.SN2 = SN2"这个条件下,经过询问同事之后才明白这个条件在存储过程编译器解析时认为是一个SN2 = SN2的永真式,因为在该R_WIP_STATION_T表中有一个字段就是SN2。
换句话说SN2这个变量在存储过程编译器解析时认为是R_WIP_STATION_T表中的一个变量了。
既然明白了来龙去脉,问题就很好解决了,就是在该变量带入SQL查询之前赋值给别的变量(该变量与表内字段相同),然后用这个字段带入查询,例如:
1 SELECT T.SN 2 INTO MY_SN 3 FROM RMES.R_WIP_STATION_T T 4 WHERE T.SN2 = MY_SN2 5 AND T.REWORK_FLAG = '2';
这样就解决了这次的问题。
总结: 以后在写业务代码的时候一定需要注意条件约束判断的变量名一定不能与表字段名一致,否则很可能会出现该问题。