您的位置:首页 > 数据库

PL/SQL知识点总结

2017-07-26 21:53 218 查看
一、基本语法1.变量的声明和赋值1)单个或多个变量用分号;隔开。赋值使用select ...into...语句,需要与表中选取的数据一一对应。2)使用record记录类型,定义多个变量,中间用逗号,隔开。变量名定义建议带_record标记下。注意分号的位置。3)可以使用%type动态获取变量的类型v_name  employees.last_name%type;   4)使用%rowtype声明一个记录类型的变量
declare
--声明一个记录类型的变量
v_emp_record employees%rowtype;
begin
--通过 select ... into ... 语句为变量赋值
select * into v_emp_record
from employees
where employee_id = 186;

-- 打印变量的值
dbms_output.put_line(v_emp_record.last_name || ', ' || v_emp_record.email || ', ' ||
v_emp_record.salary || ', ' ||  v_emp_record.job_id  || ', ' ||
v_emp_record.hire_date);
end;
5)通过变量实现insert,delete,update等操作
declare
v_emp_id employees.employee_id%type;

begin
v_emp_id := 109;
delete from employees
where employee_id = v_emp_id;
--commit;
end;
二、流程控制1)条件判断(分支)①if...then...elsif...then  ... end if;②case...when...then...else...end;declarev_sal employees.salary%type;
--定义变量接收case then语句的返回值
v_temp varchar2(20);
begin
select salary into v_sal from employees where employee_id = 150;
v_temp :=
case trunc(v_sal/5000) when 2 then  'salary >= 10000'
when 1 then '5000<= salary < 10000'
else 'salary < 5000' end;
dbms_output.put_line(v_temp);
end;
2)循环①loop  循环体  迭代条件 exit when  循环条件   end loop;②while  循环条件  loop  循环体 迭代条件  end loop;③for 变量 in   循环范围  loop  循环体  end loop;  --1-100的打印for i in 1..100 loopdbms_output.put_line(i);end loop;end;--1-100的质数declarev_i number(10):= 2;v_j number(10):= 2;v_flag number := 1;beginwhile v_i <= 100 loopwhile v_j <= sqrt(v_i) loopif (mod(v_i,v_j) = 0) thenv_flag := 0;end if;v_j := v_j + 1;end loop;if (v_flag = 1) then dbms_output.put_line(v_i);end if;v_flag := 1;v_j := 2;v_i := v_i + 1;end loop;end;
declarev_flag number(1):= 1;beginfor i in 2..100 loopfor j in 2..sqrt(i) loopif(mod(i,j) = 0) then v_flag := 0;end if;end loop;if(v_flag = 1) then dbms_output.put_line(i);end if;v_flag := 1;end loop;end;
也可以使用到 goto ... label 语句
<<label>.
....
三、游标的使用cursor输出多条语句需要使用游标。1)for循环declarecursor sal_cursor is select salary from employees where department_id = 80;beginfor i in sal_cursor loop //这里的i 是个record 存放多个变量dbms_output.put_line('salary '||i.salary);end loop;end;2)while循环声明游标cursor .. is select..from...打开游标open 获取游标fetch..into 某个变量循环遍历%foundwhile()四、异常的处理exception1)预定义异常2)非预定义异常3)自定义异常declare--自定义异常no_result exception;beginupdate employees set salary = salary + 100 where employee_id = 1001;--使用隐式游标, 抛出自定义异常 raiseif sql%notfound thenraise no_result;end if;exception--处理程序抛出的异常when no_result thendbms_output.put_line('更新失败');end;五、存储函数function与存储过程procedure1)存储函数:有返回值return 使用select from dual语句可查询2)存储过程六、触发器triggercreate  trigger...after/before ...update/delete/insert操作等...for each row  行级触发,不写为表级触发create table my_emp as select employee_id id, last_name name, salary sal from employeescreate table my_emp_bak as select employee_id id, last_name name, salary sal from employees where 1 = 2create or replace trigger bak_emp_triggerbefore delete on my_empfor each rowbegininsert into my_emp_bak values(:old.id, :old.name, :old.sal);end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: