易截截图软件、单文件、免安装、纯绿色、仅160KB
热门标签: c c# c++ asp asp.net linux php jsp java vb Python Ruby mysql sql access Sqlite sqlserver delphi javascript Oracle ajax wap mssql html css flash flex dreamweaver xml
 最新文章 :

Oracle 创建程序包


从概念到示例—Oracle创建程序包
一、程序包的相关知识
1.定义与说明
  a. 相关对象的封装
  b. 程序包的各部分
    - 程序包规格说明
          声明子程序
   - 程序包主体
          定义子程序
2.使用程序包的优点
  - 模块化
  - 更轻松的应用程序设计
  - 信息隐藏
  - 新增功能
  - 性能更佳
3.公有项和私有项的区别
 公有项:在程序包说明部分定义的变量、过程、函数
 私有项:在程序包主体部分定义的变量、过程、函数
 公有项                          私有项
可以在程序包之外引用         不能在程序包之外引用
是在程序包规格说明中定义的   是在程序包主体中定义的
用于全局目的              &n ......

Oracle 操作函数

函数:
 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用LIMIT实现类似分页

练习了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    ......

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语句的执行计划优 ......

oracle 集合操作符

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执行计划

日常开发活动中,有时候需要对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、执行 ......
总记录数:40319; 总页数:6720; 每页6 条; 首页 上一页 [2777] [2778] [2779] [2780] 2781 [2782] [2783] [2784] [2785] [2786]  下一页 尾页
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号