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;
静态游标/游标不可以改,但游标的参数的值可以改,参数的列数,条件等不可以修改。】