这种写法,对于Oracle数据库来说,完全就是两条不同的sql语句, 代码: 0select * from table_name where id = 1. 0select * from table_name where id = 2. 每次查询都要进行sql语句的执行解析,并且每个sql都会分配一个区域来存放sql解析后的二进制可执行代码。试想,要是id不同的10万个sql呢?Oracle就会分配10万个sql区域来分别存放10万个这样的id不同的sql语句。对于一个数据库驱动的Web网站这样情况下,SGA开的再大,也会很快被耗尽share pool的,最后报一个ORA-4031错误。数据库就连接不上了,只好重起。
正确的写法应该是:
代码: $stmt = ociparse($conn,"0select * from table_name where id = :id"). ocibindbyname($stmt,":id",&.$id, 12).
这样Oracle数据库就知道你实际上用的都是同一条sql语句,会以这样的形式: 0select * from table_name where id = :1 解析执行后存放在sql区域里面,当以后再有一样的sql的时候,把参数替换一下,就立刻执行,不需要再解析sql了。既加快了sql执行速度,也不会占有过多SGA的share pool。