背景
银行的业务系统里有很多的逻辑是写在 Store Procedure里的。我们公司的用的数据库是 Oracle
我们有大量的 Store Procedure需要实现。昨天我在调试一段已经运行了很久的代码。代码逻辑大概是这样的。在Java代码里,应用会去调一个Store Procedure。这个 Store Procedure是的逻辑很简单,就是去 count一个 table里的数据,然后返回给应用,应用拿到这个数值后,接着做后面的判断。现在的问题是:我本地机器从 Store Procedure,拿到的数据跟实际我在DB里跑这段SQL SCRIPT的结果不一样。我在 SQL Developer里通过 Debug传入相同的参数,跑出来的结果还是不一样。很是无语。
问题跟踪:
要查的表,假设是 Table1, Table1里定义了两个字段, column1, column2,然后要调用的 Store Procedure定义如下:
SP_A当我尝试直接把
SELECT COUN) count1 FROM Table1 WHERE column1= p input AND column2= column1;语句赋值后直接在 SQL Developer里跑的时候,数据是正确的,我插入几条跑出来就是几条。但是在 Debug模式下,同样的参数就是跑不出我想要的结果。 Google了一圈,有的说是DB连的不是同一个,有的说 Debug模式下,传入的参数,可能有长度限制,参数被截之类的。但是我这里参数就只有6位,不太可能被截。反正中文和英文互联网圈都没有找到想要的结果。直道熬到第二天,请教了我司的资深DBA。他稍稍看了一会,很快就发现了问题的根源。就是 where:条件里column2= column1的 SQL Developer Debug模式下,会忽视掉传入的实际参数值,而直接把认为是表字段的自连。我们改了SP之后就得到一样的结果了。
解决方案:
由此可以得出,一个好的书写 Store Procedure的实践是:定义入参的时候,一定要在参数前面加上 P_INPUT这种。这样就可以避免很多不必要的问题。
这个问题我们把 Store Procedure写法改成下面就可以了。
SP_A 修改---EOF---
网友评论