PL/SQL笔记

(Procedure Language/SQL)
1.输出一个字符串
declare   --说明部分,定义一些变量
begin     --程序
dbms_output.put_line('Hello World!');
end;

set serveroutput on  --对存储过程进行调试,便于输出

2.大数据框架
Hadoop框架-->Java基础
Spark框架-->Scala语言

3.PLSQL定义变量定义,变量名在前,类型在后面
var char(15);
married boolean:=true;
psal number(7,2);
my_name emp.ename%type;引用型变量,引用emp.enmae的类型作为类型
emp_rec emp%rowtype;记录型变量,引用一行的类型作为类型,可以理解为数组

4.PLSQL的赋值
1)使用:=
2)使用into
3)使用=>

5.if语句
if...then...
    elseif... then...;
    elseif... then...;
    elseif... then...;
    else''';
end if;

6.接受键盘输入
accept num prompt '请输入一个数字';
--变量num是一个地址值,在地址值上保存了输入的值
pnum number:=&num
--隐式转换为数字

7.循环,一共有三种
1)while循环,类似于Java中的while循环
   while total <=25000
   loop
   ...
   total:=total+salary;
   end loop;
2)do while循环,类似于Java中的do while循环,易于控制光标
   loop
   exit(when 条件);
   ...
   end loop;
3)for循环,类似于Java中的for循环
   for i in 1...10
   loop
语句序列;
end loop;

8.游标CURSOR代表集合,类似于Java中的ResultSet。
语法:
cursor cursorname [(param datatype,param datatype,...)] 
is select * from user
使用步骤:
1)打开游标:open c1;
2)取一行游标的值:fetch c1 into pjob;
3)关闭游标:close c1;
4)游标结束的方式 exit when c1%notfound
5)上面的pjob必须与user表中的job列类型一致
游标的属性:
1)%isopen是否打开
2)%rowcount影响的行数
3)%found找到了就是true
4)%notfound没找到就是false

9.异常,不要往上抛异常
1)系统定义异常
no_data_found:没有找到数据
too_many_rows:select..into语句匹配多个行
zero_divide:被0除
value_error:算术或转换错误
timeout_on_resource:在等待资源时发生超时
2)自定义异常
declare
  cursor cemp is select ename from enp where deptno=50;
  pename emp.ename%type;
  no_emp_found exception;--自定义异常
begin
  open cemp;
  fetch cemp into pename;--取第一条记录
    if cemp%notfound then
      raise no_emp_found;--抛出异常
    end if;
  --抛出异常,无法关闭游标
  --进程:pmon进程(process minitor),进程失败,该进程会自动启动,清除缓存,释放资源
  close cemp;
end;

10.存储过程:没有返回值,使用out参数也可以有返回值
create or replace procedure procedurename
is(as)--类似于declare
PLSQL subordinate program
begin
end;

11.存储函数:有返回值
create or replace function functionname
return 函数值类型
is(as)--类似于declare
PLSQL subordinate program
begin
end functionname;

12.调用存储过程的方式
1)execute、缩写exec procedurename();
2)begin
     procedurename();
     procedurename();
   end;

13.带参数的存储过程,参数必须注明是输入in还是输出out;
一般不要在存储过程中提交或者是回滚,谁调用存储过程谁提交;

14.过程和函数中的in和out
如果只有一个返回值,就用存储函数,否则用存储过程。

15.使用存储过程可以替代存储函数
向下兼容,老版本数据库存储过程和存储函数存在差异。

16.将对象置为空值,会优先回收。

17.能否通过java代码去干预垃圾回收。
Java的gc不受代码的控制
不能,Java的API有一个System类,有一个gc()方法,请求运行垃圾回收机制。
运行Java:
java -Xms100M -Xmx200M Helloworld
执行Helloworld这个程序所需要的最小堆内存100M,最大200M
垃圾回收什么情况下有意义,没有富裕的内存时才有意义。

18.死锁:线程的互相等待。
JDK:ThreadDump
Oracle:自动处理,自动回滚引起死锁的会话。

19.申明包结构
create or replace package mypackage as
type empcusor is ref cursor;
procedure queryEmpList(dno in number,empList out empcursor)
end mypackage;

20.申明包体,实现包头里面的所有存储过程和存储函数
create or replace package body mypackage as
procedure queryEmpList(dno in number,empList out empcursor)
as
begin
open empList for select * from emp where deptno=dno;
end queryEmpList;
end mypackage;

21.Java中接口可以被实例化,通过匿名内部类。

22.触发器
每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自动的执行触发器中定义的语句序列
create trigger firsttrigger
after insert
on emp
begin
    dbms_output.put_line('成功插入新员工。');
end;

23.触发器可用于
1)数据确认
2)实施复杂的安全性检查
3)做审计,跟踪表上所做的数据操作等,例如:记录日志
4)数据的备份和同步

24.触发器的类型
1)语句级的触发器,针对表
在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行
2)行级触发器,针对行
触发语句作用的每一条记录都被触发。在行级触发器中使用:old和:new伪记录变量,识别值的状态

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章