oracle第六天

来源:互联网 发布:开源php cms后台 编辑:程序博客网 时间:2024/06/05 22:43
 

plsql的特点:

1、运行在服务器端,消耗服务器资源。消耗服务器端cpu。oracle对plsql的处理非常快,兼容性更好,性能稍好。

2、锁(依赖)

   锁必须放在 oracle内部。

3、有些功能无法替代。如触发器

二、  DECLARE

      dms_output.put_line(‘OK’);

      end;

 set serveroutput on;

代码解释执行,也可以编译执行。编译执行的可移植性不太好。解释执行效率稍低,跨平台性强。

第一个字符必须为字母

不分大小写

不能用’-‘

不能使sql保留字

不要把变量名和表中的字段一样。

char varchar binary_integer 带符号整数,为整数计算优化性能

number(p,s) long,clob,blob

date rowed Boolean

复制表结构用where 0=1;

 

declare

type t_record is record(

t_no emp.empno%type,

t_name emp.ename%type,

t_sale emp.sal%type);

v_emp t_record;

begin select empno,ename,sal into v_emp form emp where emp_no=2222;

dbms_output.put_line(‘v_emp.t_no||v_emp.t_name||to_char(v_emp.t_sal));

end;

这是一种隐式游标。

rec emp%rowtype;  rec 变量emp表 rowtype关键字;取行形式的多个变量,可以存放行值,必须是所有 行

vempno emp.empno%type:=&empno;

oracle里的替换变量,传到oralce前由sqlplus来替换此变量&empno;

select * into rec from test where id=3333;

exception

   when     ///  then  ////  ;

   when ////     then ////;

   when others ……then……;

 

 

 

设置state_number

  如 when // then   state_number:=-1;

  when /// then  state_number:=-3;

来指出问题的所在。或者是执行的结果状态。

添加异常操作可以防止异常的直接退出。

注释   双’-‘  /*   */..

循环

loop 

exit when  expression ;

end loop;

 

 

while 循环

while<Boolean expression> loop

expression;

end loop;

 

for num in 1..10 loop

expression;

end loop;

 

goto label22

创建标号<<label22>>放到任何位置即可,

一般的用法为:if number<1 then goto label22;

<<label22>>后面必须有一条语句。比如空null;空语句

三、pl/sql的调优

1、指标:时间、资源耗用

   资源股耗用:内存锁的获取为准,谁消耗内存锁的少。v$latch:中文:闩,低级内存锁。

给用户查看这个表的权限

grant selec seltct on v_$latch to user2;

  锁的总数做统计:select sum(gets) from  v$latch;获得锁的数目

在程序的两头分别加上这两句,根据差额来看,多运行几次使之稳定

DB CPU :工作时间

DB time:工作+等待时间

 

 

                 游标、

专门针对select语句

显式游标、隐式游标

游标是一个指向上下文的句柄或者指针。

sql 语句      游标

非查询       隐式


 

处理显式游标

1处理四个步骤

定义游标

cursor  cursorname   //// is selectstatement;//静态游标

打开游标

open cursor cursorname;

提取数据

fetch cursorname into///;一般放到循环中

关闭游标

close cursor;

 

declare deptrec dept%rowtype;

      deptname dept.name%type;

     deptloc dept.loc%type;

cursor c1 is select name, loc from dept where deptno<20;

cursor c2 (deptno number default 10)is select dname,loc form dept where deptnum<deptno;

crusor c3(deptno number default 10)is select * from dept where deptnum<deptno;

后面俩个都可以是有参数的。

 

open c1;

loop

fetch c1 into deptname,deptloc;

exit when c1%notfound;

dbms_output.put_line(deptname||’----‘||deptloc);

end loop;

close c1;

 

open c2;

loop

fetch c2 into deptname,deploc;

exit when c2%notfound;

dbms_output.putline(///////);

end loop;

close c2;

 

open c3(deptno>=20);

loop

fetch c3 into deptrec;

exit when c3%notfound;

dbms_output.putline(//////);

end loop ;

close c3;

end;

 

%found %notfound %isopen %rowcount; rowcount当前操作到的次数

静态游标是oracle执行最快的。

游标的for循环

 

for indexvariable in cursorname  loop

 

cusor c is select  * from tt;

 

for c1 in c loop;隐藏了open功能

dbms_output.putline(c1.id||’----‘||c1.name);

end loop;隐藏close功能

这样不需要定义列变量了,这里c1相当于是rowtype变量了

 

%notfoun最后一次抓取的东西,刚开始为空。如果想用的话,先抓取,然后判断。这样避免出现错误。

 

更简单的for c1_rec in(select name id from dept) loop

         dbms_output.putline(…);

         end loop;

静态游标/游标不可以改,但游标的参数的值可以改,参数的列数,条件等不可以修改。】

原创粉丝点击