基本要求:
答:
过程一般用于执行一个指定的操作,可以将常用的特定操作封装成过程
CREATE [OR REPLACE] PROCEDURE procedure_name
(argument1 [mode1] datatype1,
argument2 [mode2] datatype2, ...)
IS [AS]
声明部分
BEGIN
执行部分
EXCEPTION
异常处理部分
END;
-- 创建一个过程
create table dept1 as select * from dept -- 复制 dept 表
select * from dept1
create or replace procedure pro_dept_del -- 创建一个删除的过程
as
begin
delete from dept1 where DEPTNO=10;
end;
call pro_dept_del();
begin
pro_dept_del;
end;
exec pro_dept_del
根据输入的员工编号输出该员工的工资
create or replace procedure
pro_query_emp(v_no in emp.empno%type)
as
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=v_no;
dbms_output.put_line('该员工薪水为:'||v_sal);
exception
when no_data_found then
dbms_output.put_line('找不到该员工!');
end;
create or replace procedure
pro_query_emp(v_no in emp.empno%type, out_sal out number)
as
begin
select sal into out_sal from emp where empno=v_no;
exception
when no_data_found then
dbms_output.put_line('找不到该员工!');
end;
declare
v_no emp.empno%type;
v_sal emp.sal%type;
begin
v_no:=&no;
pro_emp_sal(v_no,v_sal);
dbms_output.put_line('薪水是:'||v_sal);
end;
alter table dept1 add(level1 number(2)); -- 给 dept1 添加一列数据
select * from dept1
-- 创建查询的过程
create or replace procedure pro_dept_query(v_no in dept.deptno%type,v_loc out dept.loc%type)
as
begin
select loc into v_loc from dept where deptno=v_no;
end;
-- 调用过程
declare
v_no dept.deptno%type;--部门编号
v_loc dept.loc%type;--部门的所在地
begin
v_no:=&no;
pro_dept_query(v_no,v_loc);
dbms_output.put_line(v_loc);
end;
-- 定义插入的过程
create or replace procedure
pro_add_dept(v_deptno number,v_dname varchar2, v_loc varchar2)
as
begin
insert into dept values(v_deptno,v_dname,v_loc);
end;
-- 按位置传参
exec pro_add_dept(70,'研发部','北京');
-- 指定参数的名称通过 => 来实现
call pro_dept1_insert(v_deptno=>50,v_loc=>'东京',v_name=>'cc');
-- 混合
call pro_dept1_insert(60,v_loc=>'广东',v_name=>'dd');
call pro_add_emp(v_deptno=>90,v_loc=>'南京',v_dname=>'软件部');
call pro_add_emp(90,v_loc=>'南京',v_dname=>'软件部');
语法:
CREATE [OR REPLACE] FUNCTION function_name
(argument1 [model] datatype1,
argument2 [mode2] datatype2,
...)
RETURN datatype
IS|AS
声明部分
BEGIN
执行部分
EXCEPTION
异常处理部分
END;
-- 创建函数
create or replace function fun_getrandom return number
as
v_num number;--存储返回值
begin
v_num:=floor(dbms_random.value(1,10));--产生随机数
return v_num;--返回随机数
end;
-- 使用函数
declare
num number;
begin
num:=fun_getrandom();
dbms_output.put_line(num);
end;
create function getDept(eno number,deptName out VARCHAR2)
return VARCHAR2
as
v_address VARCHAR2(40);
begin
select dName, loc into deptName, v_address from dept, emp
where dept.deptno= emp.deptno and empno=eno;
return v_address;
end;
declare
address VARCHAR2(30);
deptName VARCHAR2(20);
begin
address:=getDept(7654,deptName);
dbms_output.put_line('部门名称:'||deptName);
dbms_output.put_line('部门地址:'||address);
end;
注意:
语法:
create or replace package dbutil_package is
pi constant number(10,7):=3.1415926; -- 定义常量
function getarea(radius number) return number; -- 定义函数及返回值
procedure print_area;
end dbutil_package;
语法:
CREATE [OR REPLACE] PACKAGE BODY package_name
IS | AS
private type and item declarations
subprogram bodies
END package_name;
使用包体
create or replace package body dbutil_package as
area number(10);
function getarea(radius number) return number is
begin
area:=pi*radius*radius;
return area;
end;
procedure print_area is
begin
dbms_output.put_line('圆的面积是:'||area);
end;
end dbutil_package;
当在其他应用中调用包的公用变量时,必须在公用变量、过程、函数名前添加包名作为前缀
调用包
declare
area number(10,7);
begin
area:=dbutil_package.getarea(3);
dbms_output.put_line('由function返回的面积:'||area);
dbutil_package.print_area;
end;
CREATE [OR REPLACE] PROCEDURE procedure_name
(argument1 [mode1] datatype1, argument2 [mode2] datatype2, ...)
IS [AS]
声明部分
BEGIN
执行部分
EXCEPTION
异常处理部分
END;
CREATE [OR REPLACE] FUNCTION function_name
(argument1 [model] datatype1,
argument2 [mode2] datatype2,
...)
RETURN datatype
IS|AS
声明部分
BEGIN
执行部分
EXCEPTION
异常处理部分
END;
CREATE [OR REPLACE] PACKAGE package_name -- 创建公有的
IS|AS
public type and item declarations
subprogram specifications
END package_name;
CREATE [OR REPLACE] PACKAGE BODY package_name -- 创建私有的
IS | AS
private type and item declarations
subprogram bodies
END package_name;