大熊最近在给一个MIS系统作数据库优化。这个系统采用的是ASP+IIS+ORACLE架构,主要的优化目标就是用存储过程代替查询缓慢的视图。经过一番坚持不懈的努力,大熊终于把存储过程给搞定,满以为世界即将变得美好的时候,ASP页面报了错,说:ORA-00907: missing right parenthesis. Fiant,明明在SQL Tools里面可以很好运行的,怎么到了ASP里面就始终无法正常工作呢?
在经过无数次的测试与修改都无法解决问题之后,大熊觉得就要绝望和放弃了。突然,峰回路转的时候出现了,大熊在无意间注释了一行SQL的转义语句后,ASP页面竟然正常运作了起来。![](/Editor/FCKeditor/editor/images/smiley/msn/tounge_smile.gif)
What's Wrong?经过一番分析,大熊得出如下的结论:
我们知道在SQL中单撇号(')是用来标识字符串的,如果字符串中出现了单撇号,则必须同时打两个单撇号(''),通过转义的方式来实现单撇号的保存。
这个MIS系统的ASP是采用OLEDB的方式来连接Oracle数据库的,在这种模式下执行存储过程有两种方式,一种是连接对象的直接SQL执行:
conn.Execute("exec proc_get_list('aa','bb');")
可以看到这里面如果出现了单撇号,肯定是要在ASP进行一次转换再执行的:
conn.Execute("exec proc_get_list('aa', '"& Replace("b'b", "'", "''") &"')")
这样,存储过程才可以正常执行。
还有一种方式是使用命令(Command)对象,MIS系统用的就是这种方式:
' sqlList = Replace(sqlList, "'", "''")
set oCmdDisp = Server.CreateObject("Adodb.Command") ' 命令对象
set oCmdDisp.ActiveConnection = conn
oCmdDisp.CommandText = "{call PROC_GET_PHONIST_STATUS_LIST(?,?,?)}"
oCmdDisp.CommandType = adCmdText
oCmdDisp.Parameters.Append oCmdDisp.CreateParameter("condition_string", adVarChar, adParamInput, 500, sqlList)
oCmdDisp.Parameters.Append oCmdDisp.CreateParameter("curr_page", adInteger, adParamInput, 10, Clng(page))
oCmdDisp.Parameters.Append oCmdDisp.CreateParameter("page_size", adInteger, adParamInput, 10, Clng(page_size))
set oRsDisp = oCmdDisp.Execute()
注意看最顶上的那行被注释的转义语句,如果不注释这行语句,ASP页面就会报错,注释后就可以正确执行,所以大熊估计可能是(Command)对象内部就有对单撇号进行转义的能力,因此提前对字符串进行转义倒成了多余之举,汗!![](/Editor/FCKeditor/editor/images/smiley/msn/embaressed_smile.gif)
不过问题也算是得以圆满解决,程序跑得比以前快了很多,功夫总算没白费,不过提醒大家以后要注意下下这些小细节,有的时候,真的真的会弄死人的!![](/Editor/FCKeditor/editor/images/smiley/msn/wink_smile.gif)
在经过无数次的测试与修改都无法解决问题之后,大熊觉得就要绝望和放弃了。突然,峰回路转的时候出现了,大熊在无意间注释了一行SQL的转义语句后,ASP页面竟然正常运作了起来。
![](/Editor/FCKeditor/editor/images/smiley/msn/tounge_smile.gif)
What's Wrong?经过一番分析,大熊得出如下的结论:
我们知道在SQL中单撇号(')是用来标识字符串的,如果字符串中出现了单撇号,则必须同时打两个单撇号(''),通过转义的方式来实现单撇号的保存。
这个MIS系统的ASP是采用OLEDB的方式来连接Oracle数据库的,在这种模式下执行存储过程有两种方式,一种是连接对象的直接SQL执行:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
还有一种方式是使用命令(Command)对象,MIS系统用的就是这种方式:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](/Editor/FCKeditor/editor/images/smiley/msn/embaressed_smile.gif)
不过问题也算是得以圆满解决,程序跑得比以前快了很多,功夫总算没白费,不过提醒大家以后要注意下下这些小细节,有的时候,真的真的会弄死人的!
![](/Editor/FCKeditor/editor/images/smiley/msn/wink_smile.gif)