存储过程
CREATE [OR REPLACE] PROCEDURE 存储过程名[(参数[IN|OUT|IN OUT] 数据类型...)]
{AS|IS}
[说明部分]
BEGIN
可执行部分
[EXCEPTION 错误处理部分]
END [过程名];
- 简单例子
create or replace procedure pro_hello
is
begin
dbms_output.put_line('hello world!!');
end;
call pro_hello();
- 带参数
create or replace procedure getEmp(p_empno number, p_emp out emp%rowtype, p_type in out varchar2)
is
begin
select * into p_emp from emp where empno = p_empno;
p_type := p_type || ':查询成功';
exception
when others then
p_type := p_type || ':查询失败';
end;
declare
v_emp emp%rowtype;
v_type varchar2(128) default '执行结果';
begin
getEmp(7369,v_emp,v_type);
dbms_output.put_line(v_type);
dbms_output.put_line(v_emp.ename);
end;
- 默认值参数
create or replace procedure pro_person(p_name varchar2 default 'lisi', p_age number default 18)
is
begin
dbms_output.put_line(p_name||','||p_age);
end;
call pro_person();
call pro_person('zhagnsan');
call pro_person('wangwu', 30);
call pro_person(p_age => 29);
函数
函数 function
定义语法:
CREATE [OR REPLACE] FUNCTION 函数名[(参数[IN] 数据类型...)] --参数是可选的
RETURN 数据类型--return 返回值类型,不可省略
{AS|IS}
[说明部分]
BEGIN
可执行部分
RETURN (表达式)
[EXCEPTION
错误处理部分]
END [函数名];
create or replace function fun_sum(p_start number, p_end number)
return number
is
v_sum number := 0;
begin
for i in p_start..p_end loop
v_sum := v_sum + i;
end loop;
return v_sum;
end;
declare
v_sum number;
begin
v_sum := fun_sum(1, 100);
dbms_output.put_line(v_sum);
end;
select fun_sum(1, 100) from dual;
create or replace function fun_getemp(p_empno number) return sys_refcursor
is
v_emps sys_refcursor;
begin
if p_empno is null then
open v_emps for select * from emp ;
else
open v_emps for select * from emp where empno = p_empno;
end if;
return v_emps;
end;
select fun_getemp(null) from dual;
declare
v_emp emp%rowtype;
v_emps sys_refcursor;
begin
v_emps := fun_getemp(null);
loop
fetch v_emps into v_emp ;
exit when v_emps%notfound;
dbms_output.put_line(v_emp.ename);
end loop;
end;
触发器
触发器 语法:
CREATE [OR REPLACE] TRIGGER 触发器名
{BEFORE|AFTER|INSTEAD OF} 触发事件1 [OR 触发事件2...]
ON 表名
[FOR EACH ROW]
[WHEN ( 触发条件)]
declare
声明部分
BEGIN
主体部分
END;
create or replace trigger tri_dept
before update or delete or insert
on dept
for each row
declare
begin
case
when inserting then
dbms_output.put_line('新增部门'||:new.deptno);
when updating then
dbms_output.put_line('修改部门,新:'||:new.dname||',旧:'||:old.dname);
when deleting then
dbms_output.put_line('删除部门'||:old.deptno);
end case;
end;
create table dept_2 as select * from dept;
select * from dept_1;
truncate table dept_1;
create sequence seq_deptno ;
create or replace trigger tri_dept_1
before insert on dept_1
for each row
declare
begin
if :new.deptno is null then
:new.deptno := seq_deptno.nextval;
end if;
end;
包
create or replace package employee
is
v_emp emp%rowtype;
procedure showdetail;
procedure getemp(p_empno number);
function sum(p_start number,p_end number) return number;
end;
create or replace package body employee
is
v_num number := 0;
procedure showdetail is
begin
if v_emp.empno is not null then
dbms_output.put_line('员工信息如下:');
dbms_output.put_line(v_emp.ename);
dbms_output.put_line(v_emp.empno);
dbms_output.put_line(v_emp.sal);
else
dbms_output.put_line('没有任何员工信息');
end if;
end;
procedure getemp(p_empno number) is
begin
select * into v_emp from emp where empno = p_empno;
exception
when others then
dbms_output.put_line('查询员工失败!');
v_emp := null;
end;
function sum(p_start number,p_end number) return number
is
begin
for i in p_start..p_end loop
v_num := v_num + i;
end loop;
return v_num;
end;
end;
begin
employee.getemp(7369);
employee.showdetail();
dbms_output.put_line(employee.sum(1, 100));
end;