从概念到示例—Oracle创建程序包
一、程序包的相关知识
1.定义与说明
a. 相关对象的封装
b. 程序包的各部分
- 程序包规格说明
声明子程序
- 程序包主体
定义子程序
2.使用程序包的优点
- 模块化
- 更轻松的应用程序设计
- 信息隐藏
- 新增功能
- 性能更佳
3.公有项和私有项的区别
公有项:在程序包说明部分定义的变量、过程、函数
私有项:在程序包主体部分定义的变量、过程、函数
公有项 私有项
可以在程序包之外引用 不能在程序包之外引用
是在程序包规格说明中定义的 是在程序包主体中定义的
用于全局目的 &n ......
函数:
1.使用Create Function 语句创建
2.语
法:
Create or replace Function 函数名[参数列表]
Return 数据类型
IS|AS
局部变量
Begin
可执行语句
end;
3.访问函数
-用两种方式进行访问
使用PL/SQL块
使用SQL语句
-仅接受In参数
示例:
create or replace function
GetName(sNo varchar2)
return varchar Is --不能指定精度
name
varchar(12);
Begin
select ename into name from emp
where empno=sNo;
return name;
Exception
when
Too_many_rows then
&nb ......
练习了ORACLE类似的分页,目的:ORACLE的LIMIT使用
declare
type name_arrary_type is varray(20) of varchar2(10);
name_arrary name_arrary_type;
rowss int:=&输入页记录数;
dpno int:=&输入部门号;
v_count int:=0;
cursor emp_cursor(dpno int) is select ename from emp where deptno=dpno;
begin
open emp_cursor(dpno);
loop
fetch emp_cursor bulk collect into name_arrary limit rowss;
dbms_output.put_line('部门'||dpno||'员工:');
for i in 1..(emp_cursor%rowcount-v_count) loop
dbms_output.put_line(i||' '||name_arrary(i)||' ');
end loop;
dbms_output.put_line('当前页数:'||(v_count/rowss+1));
dbms_output.new_line;
v_count :=emp_cursor%rowcount;
exit when emp_cursor%notfound;
end loop;
dbms_output.put_line('每页['||rowss||']条记录,总页数:['||ceil(emp_cursor%rowcount/rowss)||']');
close emp_cursor;
end;
运行结果:
部门20员工:
1 SMITH
2 JONES
3 SCOTT
4   ......
在实际开发中,经常会需要对数据库进行访问,最常见的开发方法就类似:
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语句的执行计划优 ......
oracle中有一类操作符是对集合进行操作的,我们称之为集合操作符(set operator).
union(all) 是用来将多个select语句的结果集合进行合并处理。其中union会压缩各个结果集中的重复数据,而union all则不会。
intersect 是用来求两个集合的交集。
minus是用来从一个结果集中去除另一个集合中包含的部分。
对与各个集合操作符, 需要注意的地方的如下:
除了union all之外的所有集合操作符号都会进行默认排序和去除重复行,这需要占用一定的资源,只有union all回将数据以原始的方式呈现出来。所以在对oracle中进行性能优化时尽量使用union all 而不是 union。
对于每一个查询中,必须要具有相同的列的数目和列的类型,但没有必要使列名相同。如果类型不一样,可以使用类型转换函数来转换。注意这里oracle不会进行隐式转换,必须进行手动转换,如果列的个数不一样,可以使用替代列的方式来充当。
例如:
select ename,sal from emp where sal > 2000
union all
select to_char(empno),0 from emp where sal >3500;
这里我们使用了类型转换函数来to_char将empno转由数值型换为字符型,并给出了一个填充列0,来凑足和前一个查询的相同的列数。
可以使用order ......
日常开发活动中,有时候需要对oracle执行计划进行监控,以此来调优程序和数据库方面的性能。
常用方法有以下几种:
一、通过PL/SQL Dev工具
1、直接File->New->Explain Plan Window,在窗口中执行sql可以查看计划结果。其中,Cost表示cpu的消耗,单位为n%,Cardinality表示执行的行数,等价Rows。
2、先执行 EXPLAIN PLAN FOR select * from tableA where paraA=1,再 select * from table(DBMS_XPLAN.DISPLAY)便可以看到oracle的执行计划了,看到的结果和1中的一样,所以使用工具的时候推荐使用1方法。
Cost 消耗越小 效率越高.
注意:PL/SQL Dev工具的Command window中不支持set autotrance on的命令。还有使用工具方法查看计划看到的信息不全,有些时候我们需要sqlplus的支持。
二、通过sqlplus
1、一般情况都是本机链接远程服务器,所以命令如下:
sqlplus user/pwd@serviceName
此处的serviceName为tnsnames.ora中定义的命名空间。
2、执行 ......