oracle第六天

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;

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

你可能感兴趣的:(oracle)