设为首页 加入收藏

TOP

Oracle学习开发PLSQL子程序和包(一)
2014-11-24 02:42:25 来源: 作者: 【 】 浏览:3
Tags:Oracle 学习 开发 PLSQL 子程序

可以用exec或者call调用存储过程
定义变量时要用var,如:var username varchar2(20);
在调用变量时必须在变量名的前面加上双引号,如:exec :username := 'user1';
在调用存储过程时也要在变量名的前面加上双引号,如exec compute(:n1,:n2);
可以使用show error输出当前错误
查看存储过程的源代码:

Sql代码
select text from user_source where name='COMPUTE';

创建带输入、输出参数的存储过程:
在创建存储过程时可以定义in(输入参数,默认),out(输出参数)和in out(输入输出参数)三种参数

Sql代码
create or replace procedure compute(num1 in out number,num2 in out number) is
n1 number(10,2);
n2 number(10,2);
begin
n1 := num1/num2;
n2 := mod(num1,num2);
-- 给要返回的变量赋值
num1 := n1;
num2 := n2;
end;
/

开发函数:
在指定函数的参数类型时,不能指定其长度;Return子句用于指定函数返回值的数据类型
IS或AS用于开始一个PL/SQL块(替代了declare)
在函数头部必须有Return子句,在函数体内至少要包含一个Return子句
在创函数时可以指定in(输入参数,默认),out(输出参数)和in out(输入输出参数)三种参数

Sql代码
-- 创建带输入输出参数的函数
create or replace function get_result(num1 number,num2 in out number)
return number is
n_result number(6);
n_remainder number;
begin
n_result := num1/num2;
n_remainder := mod(num1,num2);
num2 := n_remainder;
return n_result;
end;
/

开发包:
创建包规范,相当于Java中定义接口,在这里定义的变量、函数和子程序都是公有的

Sql代码
create or replace package emp_package is
-- 定义公共变量
n_temp number(10,2) := 888.888;
-- 定义添加员工的存储过程
procedure add_emp(empno number,name varchar2,job varchar2,manager varchar2,hiredate varchar2,salary number,commision varchar2,deptno number);
-- 定义解雇员工的存储过程
procedure fire_emp(n_empno number);
-- 定义获得指定员工编号的员工工资的函数
function get_salary(n_empno number) return number;
end emp_package;
/
-- 创建包体,相当于Java中的接口实现类
create or replace package body emp_package is
-- 定义一个用来验证员工编号是否存在的私有函数
function validate_empno(n_empno number) return boolean is
n_temp employee.empno%type;
begin
select empno into n_temp from employee where empno = n_empno;
return true;
exception
when no_data_found then return false;
when others then return false;
end;
-- 实现添加员工的存储过程
procedure add_emp(empno number,name varchar2,job varchar2,manager varchar2,hiredate varchar2,
salary number,commision varchar2,deptno number) is
begin
if validate_empno(empno) then
raise_application_error(-20001,'编号为' || empno || '的员工已经存在!');
else
insert into employee values(empno,name,job,manager,hiredate,salary,commision,deptno);
commit;
end if;
end;
-- 实现解雇员工的存储过程
procedure fire_emp(n_empno number) is
begin
if validate_empno(n_empno) then
delete from employee where empno = n_empno;
commit;
else
raise_application_error(-20003,'编号为' || n_empno || '的员工不存在!');
end if;
end;
-- 实现获得指定员工编号的员工工资的函数
function get_salary(n_empno number) return number is
n_salary employee.salary%type;
begin
if validate_empno(n_empno) then
select salary into n_salary from employee where empno = n_empno;
return n_salary;
else
raise_application_error(-20004,'编号为' || n_empno || '的员工不存在!');
end if;
end;
end emp_package;
/

测试块:

Sql代码
declare
n_1 number(10,2);
n_2 number(10,2);
begin
-- 测试存储过程compute
n_1 := 20;
n_2 := 8;
-- 位置传递
--compute(n_1,n_2);
-- 名称传递
compute(num1 => n_1,num2 => n_2);
dbms_output.put_line('n_1=' || n_1 || ' n_2=' || n_2);
-- 测试函数get_result
n_1 := 20;
n_2 :

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇监控Oracle数据库的常用shell脚本 下一篇Oracle语法之OVER (PARTITION BY ..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: