--plsql 编程语言
--用于Oracle编写的
--由三个块组成,声明部分、执行部分、异常处理部分
--DECLARE BEGIN EXCEPTION END;
set serveroutput on --为了有结果
declare
--声明的变量、类型、游标
begin
dbms_output.put_line('hello word!');
--程序的执行部分
--exception
--提供处理机制
--when .... then
end;
--使用循环语句打印 1-100
set serveroutput on
declare
--声明一个变量
v_i number(5) := 1;
begin
loop
dbms_output.put_line(v_i);
exit when v_i >= 100; --当大于等于100结束
v_i := v_i + 1;
end loop;
end;
--使用循环语句打印 1-100
begin
for c reverse in 1..100 loop --加reverse反向
dbms_output.put_line(c);
end loop;
-- while loop; end loop;
--输出1-100间的质数
declare
v_i number(3):=2;
v_j number(3):=2;
v_flag number(1):=1;
begin
while v_i <=100 loop
while v_j <= sqrt(v_i) loop
if mod(v_i,v_j) = 0 then v_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_j :=2;
v_i := v_i + 1;
v_flag :=1;
end loop;
end;
--输出1-100间的质数
declare
v_flag number(1) :=1;
begin
for v_i in 2..100 loop
for vj in 2..sqrt(v_i) loop
if mod(v_i,v_j) = 0 then v_flag := 0;
goto lable; --跳到lable 点 exit 是退出
end if;
end loop;
<<lable>>
if v_flag = 1 then dbms_output.put_line(v_i);
end if;
v_flag := 1;
end loop;
end;
--游标
--游标是一个指向上下文的句柄或指针,通过游标,PL/SQL可以控制上下文区和处理语句时上下文区会发生些什么事情。
--非查询语句 隐士的
--结果是单行的查询语句 隐士的或显示的
--结果是多行的查询语句 显示的
--显示游标处理四个PL/SQL步骤
--1.定义游标
--2.打开游标
--3.提取游标数据
fatch into
-- 4.关闭游标
--打印出80号部门的所有的员工的工作 salary :xxx
declare
v_sal employees.salary%type;
v_empid employees.employee_id%type;
--1.定义游标
cursor emp_sal_cursor is
select salary from employees,employee_id where department_id = 80;
begin
--2.打开游标
open emp_sal_cursor;
--3.提取游标
fetch emp_sal_cursor into v_sal,v_empid; --提取第一个值
while emp_sal_cursor%found loop --found一直到最后一个
dbms_output('salary:'v_sal);
fetch emp_sal_cursor into v_sal,v_empid; --提取下一个值
end loop;
--4,关闭游标
close emp_sal_cursor;
end;
--游标 for in 循环可以自动打开游标、提取游标、关闭游标
--游标可以带参数并且 游标的赋值 sal=>1000
--隐式游标:更新指定员工salary(涨工资10),如果该员工没有找到,则答应 查无此人
begin
update employees
set salary = salary +10
where employee_id = 101;
--隐式游标
if sql%notfound then dbms_output.put_line('查无此人');
end if;
end;
--异常处理
--1.预定义错误 predefined
--2.非预定错误 nopredefined
--3.用户定义错误 User_define
--预定义异常
declare
v_salary employees.salary%type;
begin
select salary into v_salary
from employees
where employee_id > 100;
dbms_output.put_line(v_salary);
exception
when too_many_rows then
dbms_output.put_line('行数太多了啊');
end;
--非预定义异常
declare
e_deleteid_exception exception;--定义异常
PRAGMA exception init(e_deleteid_exception,-2292); --初始化异常 -2292 ORA号
begin
delete from employees where employee_id = 100;
exception
when e_deleteid_exception then
dbms_output.put_line('有外键');
end;
--用户自定义异常
declare
e_too_high_sal exception;
v_sal employees.salary%type;
begin
select salary into v_sal from employees where employee_id = 100;
if v_sal > 100000 then
raise e_too_high_sal; --抛出异常
end if;
exception
when e_too_high_sal then dbms_output.put_line('工资太高了');
end;
--函数
create or replace function func_name(dept_id number,salary number)
return number
is
--定义函数在使用的过程中,需要声明的变量
begin
--函数执行体
exception
--处理函数的异常
end;
-- 数据库当前时间 sysdate
-- OUT参数,因为函数只能有一个返回值,PL/SQL程序可以通过OUT型的参数实现由多个返回值
--函数名后面是一个可选的参数列表,其中包含IN,OUT或IN OUT标记,参数之间用逗号隔开,
--IN参数标记表示传递给函数的值在该函数执行中不改变;OUT标记表示一个值在函数中进行计算并
--通过该参数传递给调用语句;IN OUT标记表示传递给函数的值可以变化并传递给调用语句,如省略标记,则参数
--隐含为IN.
--获取给定部门的工资总和 和该部门的员工总数
create or repalce function get_sal(dept_id number ,total_out out number) --total_out 返回值
return number
is
v_sumsal number(10) := 0;
cursor
salary_cursor is
select salary from employees where department_id = dept_id;
begin
total_count := 0; --返回值
for c in salary_cursor loop
v_sumsal := v_sumsal + c.salary;
total_count := total_count +1;
end loop;
return v_sumsal;
end;
--调用函数
declare
v_num number(5);
begin
dbms_output.put_line(get_sal(80,v_num));
dbms_output.put_line(v_num); --把v_num也带了出来
end;
--储存过程
set serveroutput on --开启储存过程
create or repalce procedure sum_procedure
is
begin
end;
--输出当前的错误信息
show errors;
--触发器
--在Oracle 中触发器类似与储存过程和函数,都有声明,执行和异常处理过程的PL/SQL块。
--触发器组成:
--1.触发时间:After BEfore
--2.触发事件:TRIGGER insert update delete
--3.触发频率:触发器内定义的动作被执行的次数,即语句级(STATEMENT)触发器和行级(ROW)触发器。
-- a.语句级触发器:是指当某触发事件发生时,该触发器只执行一次。
-- b.行级(ROW)触发器:是指当某触发事件发生时,多收到该操作影响的每一行数据,触发器都单独执行一次。
--4.触发器本身:即该Trigger被触发后的目的和意图,正是触发器本身要做的事情,例如PL/SQL块;
--创建触发器
create or replace trigger update_emp_trriger
after
update on emp
for each row --行级(ROW)触发器 默认的是STATEMENT 语句块的
begin
dbms_output.putline('喝咯欧文 ');
end;
--old 和 new 的使用 可以显示更新以前和更新以后的数据
create or replace trigger update_emp_trriger
after
update on emp
for each row --行级(ROW)触发器
begin
dbms_output.putline('old:salary'||:old.salary || ',' || 'new salary:':new.salary);
end;
--编写一个触发器,在对My_emp删除的时候,在my_emp_bak表中备份对应的记录
create or replace trigger delete_emp_trigger
before
delete on my_emp
for each row
begin
insert into my_emp_bak
values(:old.emplyee_id,:old.salary);
end;
来自CSDN用户 nothing 地址http://blog.csdn.net/u011687186