Oracle Parameter
在实际开发中,经常会需要对数据库进行访问,最常见的开发方法就类似:
string sql = "select * from table1 where name = '" + name + "'";
这种方式有被注入攻击的危险
所以解决方案有2种:
1、改成:string sql = "select * from table1 where name = '" + name.Replace("'","''") + "'"; // 替换一个单引号为两个单引号
2、使用参数化形式,如在Oracle中,用如下方式执行:
string sql = "select * from table1 where name = :vName";
OracleParameter para = new OracleParameter("vName", OracleType.VarChar);
para.Value = name;
OracleConnection con = new OracleConnection (constr);
con.Open();
OracleCommand com = con.CreateCommand();
com.CommandText = sql;
com.Parameters.Add(para);
com.ExecuteReader();
如此看来,使用参数化的形式复杂的许多,用替换的方式简单的多
所以我一直以来都是用替换的方式来处理,昨天发现了用参数的另一个好处
才知道,使用参数化形式还可以提高Oracle的性能(不知道SqlServer有没有类似的好处)
通过分析SQL语句的执行计划优化SQL
共享sql语句
为了不重复解析相同的SQL语句(因为解析操作比较费资源,会导致性能下降),在第一次解析之后,ORACLE将SQL语句及解析后得到的执行计划存放在内存中。这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。因此,当你执行一个SQL语句(有时被称为一个游标)时,如果该语句和之前的执行过的某一语句完全相同,并且之前执行的该语句与其执行计划仍然在内存中存在,则ORACLE就不需要再进行分析,直接得到该语句的执行路径。ORACLE的这个功能大大地提高了SQL的执行性能并大大节省了内存的使用。使用这个功能的关键是将执行过的语句尽可能放到内存中,所以这要求有大的共享池(通过设置shared buffer pool参数值)和尽可能的使用绑定变量的方法执行SQL语句。
当你向ORACLE 提交一个SQL语句,ORACLE会首先在共享内存中查找是否有相同的语句。这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等)。
下面是判断SQL语句是否与共享内存中某一SQL相同的步骤:
1. 对所发出语句的文本串进行hashed。如果hash值与已在共享池中SQL语句的
相关文档:
触发器
q 触发器是当特定事件出现时自动执行的存储过程
q 特定事件可以是执行更新的DML语句和DDL语句
q 触发器不能被显式调用
q 触发器的功能:
q ......
ORACLE数据库对象
——同义词、序列、视图
同义词:同义词是现有对象的别名
简化SQL语句
隐藏对象的名称和所有者
提供对对象的公共访问
同义词分为私有同义词和公有同义词
私有同义词只能在其模式内访问,且不能与当前模式的对象同名。
公有同义词可被所有的数据库用户访问。
以 SYS 用 ......
搞oracle都会经常碰到rowid,本文是笔者根据网上各位的文章,加上自己学习中的体会,总结而成。
一.rowid简介
rowid就是唯一标志记录物理位置的一个id,在oracle 8版本以前,rowid由file#+block#+row#组成,占用6个bytes的空间,10 bit 的 file# ......
大家都知道,用PL/SQL连接Oracle,是需要安装Oracle客户端软件的。有没要想过不安装Oracle客户端直接连接Oracle呢?
其实我一直想这样做,因为这个客户端实在太让人讨厌了!!!不但会安装一个JDK,而且还会把自己放在环境变量的最前面,会造成不小的麻烦。
&n ......