--创建一个函数,用来根据部门编号返回调薪幅度
create or replace function get_ratio_by_dept(deptno varchar2)
return number is
n_salaryratio number(10,2); --调薪比率返回值变量
begin
case deptno
when 10 then
n_salaryratio:=1.09;
when 20 then
n_salaryratio:=1.11;
when 30 then
n_salaryratio:=1.18;
else
n_salaryratio:=0;
end case;
return n_salaryratio;
end; begin
dbms_output.put_line(get_ratio_by_dept(20));
end; --创建一个存储过程,用来实现加薪,它将调用get_ratio_by_dept来获取加薪幅度 create or replace procedure raise_salary(p_empno number)
as
v_deptno number(2);
v_ratio number(10,2); --存储调薪幅度变量
begin
select deptno into v_deptno from emp where empno=p_empno;
v_ratio:=get_ratio_by_dept(v_deptno);
if v_ratio>0
then
update scott.emp
set sal =sal* (1+v_ratio)
where empno = p_empno;
end if;
dbms_output.put_line('加薪成功!');
exception
when no_data_found then
dbms_output.put_line('没有找到该员工的任何信息!');
when others then
dbms_output.put_line('调整薪资时出现了错误!');
end; set serveroutput on;
exec raise_salary(7369); --创建包头
create or replace package emp_sal_pkg as
function get_ratio_by_dept(deptno varchar2) return number;
procedure raise_salary(p_empno number);
end emp_sal_pkg; --创建包体
create or replace package body emp_sal_pkg as
function get_ratio_by_dept(deptno varchar2)
return number
is
n_salaryratio number(10,2);
begin
case deptno
when 10 then
n_salaryratio:=1.09;
when 20 then
n_salaryratio:=1.11;
when 30 then
n_salaryratio:=1.18;
else
n_salaryratio:=1;
end case;
return n_salaryratio;
end get_ratio_by_dept; procedure raise_salary (p_empno number)
as
v_deptno number(2);
v_ratio number(10,2);
begin
select deptno into v_deptno from emp where empno=p_empno;
v_ratio:=get_ratio_by_dept(v_deptno);
if v_ratio>0
then
update scott.emp
set sal =sal* (1+v_ratio)
where empno = p_empno;
end if;
dbms_output.put_line('加薪成功!');
exception
when no_data_found then
dbms_output.put_line('没有找到该员工的任何信息!');
when others then
dbms_output.put_line('调整薪资时出现了错误!');
end raise_salary;
end emp_sal_pkg;
--创建过程添加新员工
create or replace procedure AddNewEmp(p_empno emp.empno%type,
p_ename emp.ename%type,
p_job emp.job%type,
p_sal emp.sal%type,
p_deptno emp.deptno%type:=20)
as
begin
if p_empno<0 then
raise_application_error(-20001,'员工编号必须大于0');
end if;
insert into emp
(empno,ename,job,sal,deptno)
values (p_empno,p_ename,p_job,p_sal,p_deptno);
end AddNewEmp; begin
AddNewEmp(8236,'诸葛亮','策划人员',25000,40);
end; 子程序创建高度可维护,重用的代码
(1)模块化代码(2)简化应用程序(3)提升管理性:需求变更,只要改子程序
(4)可重用性,提高性能
程序调试
C+R 直接运行 C+N单击进入 C+O单步逃过 C+T单步退出
--在过程中使用return语句
create or replace procedure RaiseSalary(
p_empno emp.empno%type) as
v_job emp.job%type;
v_sal emp.sal%type;
begin
select job,sal into v_job,v_sal from emp
where empno=p_empno;
if v_job<>'CLERK' then
return; --如果不是职员则退出
elsif v_sal>3000 then
return ;
else
--否则更新薪资记录
update emp set sal=Round(sal*1.12,2) where
empno=p_empno;
end if;
exception
when no_data_found then
dbms_output.put_line('没有找到员工记录');
end RaiseSalary;
begin
RaiseSalary(7369);
end;
select * from emp where empno=7369;
--查询当前scott方案下的过程和函数列表
select object_name,object_type,created,
last_ddl_time,status,temporary
from user_objects
where object_type in ('PROCEDURE','FUNCTION','TABLE'); --in out 模式参数
create or replace procedure calcRaiseSalary(
p_job in varchar2,
p_salary in out number
) as
v_sal number(10,2);
v_job varchar2(10);
begin
if p_job='CLERK' then
v_sal:=p_salary*1.12; elsif p_job='销售人员' then
v_sal:=p_salary*1.18;
elsif p_job='经理' then
v_sal:=p_salary*1.19;
else
v_sal:=p_salary; end if;
p_salary:=v_sal; ---值传递 end calcRaiseSalary; declare
v_sal number(10,2);
v_job varchar2(10);
begin
select sal,job into v_sal,v_job from emp where
empno=7369;
calcRaiseSalary(v_job,v_sal);
dbms_output.put_line('计算后的调整薪水为:'||v_sal); --||'JOB'||v_jo
end; select * from emp where empno=7369; 引用传递:将实际参数的指针(内存地址)传递给形式参数,
值传递:将实际参数的值赋给形式参数,值拷贝,指向不同的内存地址 如果参数是大型数据结构,比如集合,记录和对象实例, 参数复制会大大降低执行速度,
消耗内存
nocopy 使得out和in out模式的参数按引用进行传递 --编译包规范
alter package emp_pkg_overloading compile specification;
--编译包体
alter package emp_pkg_overloading compile body;
--同时编译包规范和包体
alter package emp_pkg_overloading compile package; --查询包规范和包体信息
select object_name,object_type,created,last_ddl_time from user_objects
where object_type in ('PACKAGE','PACKAGE BODY'); --查看包的源代码
select line,text from user_source where name='EMP_MGMT_PKG_OVERLOADING'
and type='PACKAGE'; --使用returning into 为记录变量赋值
declare
type t_emp is record(
empno emp.empno%type,
ename emp.ename%type,
sal emp.sal%type
);
emp_info t_emp;
old_sal emp.sal%type;
begin
select sal into old_sal
from emp
where empno=7369;
update emp
set sal=sal*1.1
where empno=7369
returning empno,ename,sal into emp_info;
dbms_output.put_line(
emp_info.empno||' '||emp_info.ename ||' '||
old_sal||' '|| emp_info.sal); end;
select sal,ename from emp where empno =7369 --在insert语句中使用记录类型
declare
type t_dept_rec is record(
rec_deptno number,
rec_dname varchar2(14),
rec_loc varchar2(13)
);
rec_dept_1 t_dept_rec;
rec_dept_2 dept%rowtype;
begin
rec_dept_1.rec_deptno:=71;
rec_dept_1.rec_dname:='系统部';
rec_dept_1.rec_loc:='上海';
insert into dept values rec_dept_1;
rec_dept_2.deptno:=72;
rec_dept_2.dname:='开发部';
rec_dept_2.loc:='重庆';
insert into dept values rec_dept_2;
end; select * from dept --在update语句中使用记录类型
declare
rec_dept_2 dept%rowtype;
begin
rec_dept_2.deptno:=20;
rec_dept_2.dname:='系统部';
rec_dept_2.loc:='上海';
update dept set row=rec_dept_2 where deptno=rec_dept_2.deptno;
end; 使用记录类型的限制
(1)记录类型不能出现在select语句的选择列表, where子句,group by 子句
或order by子句中
(2)update语句中Row关键字只能出现在set语句之后,并且不能和子查询连用
(3)不能包含其他的变量和值,不能具有嵌套的记录类型,不支持在
execute immediate 语句中使用记录类型.

PLSQL函数,存储过程的更多相关文章

  1. mysqldump导出--数据+结构+(函数+存储过程)

    #导出某个数据库--结构+数据shell>mysqldump -h192.168.161.124 -uroot -pxxxxxx --opt db_name |gzip -9 > /db_ ...

  2. plsql调试存储过程卡住的原因以及处理

    用PLSQL调试存储过程的时候,经常会遇到这个的情况,点调试后,继续点单步都是灰色,想停下来,但是取消也要点很多次才能取消掉. 就像下面的情况: 一直以为是个BUG,直到最近有人告诉我了真相. 出现这 ...

  3. Java -- JDBC 学习--调用函数&存储过程

    调用函数&存储过程 /** * 如何使用 JDBC 调用存储在数据库中的函数或存储过程 */ @Test public void testCallableStatment() { Connec ...

  4. PL/SQL轻量版(四)——存储函数/存储过程与触发器

    概述 ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数.过程和函数统称为 PL/SQL 子程序,他们是被命名的 PL/SQL 块,均存储在数 ...

  5. ql 判断 函数 存储过程是否存在的方法

    下面为您介绍sql下用了判断各种资源是否存在的代码,需要的朋友可以参考下,希望对您学习sql的函数及数据库能够有所帮助. 库是否存在 if exists(select * from master..s ...

  6. sql 判断 函数 存储过程是否存在的方法

    下面为您介绍sql下用了判断各种资源是否存在的代码,需要的朋友可以参考下,希望对您学习sql的函数及数据库能够有所帮助.库是否存在if exists(select * from master..sys ...

  7. mysql 查询表,视图,触发器,函数,存储过程

    1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND  TAB ...

  8. MySQL 5.6 主从复制如何处理——触发器,函数,存储过程,调度事件

      截图来自MySQL5.6的pdf版文档. 说明: 1)基于语句的复制时,trigger会在slave上执行,所以slave上也需要有trigger的定义,不然会导致主从数据不一致的: 2)基于行的 ...

  9. 基本开题的感觉是了-MySQL继续继续(自定义函数&存储过程)

    hi 感觉论文开题基本确定了,凯森 1.MySQL -----自定义函数----- ----基本 两个必要条件:参数和返回值(两者没有必然联系,参数不一定有,返回一定有) 函数体:合法的SQL语句:以 ...

随机推荐

  1. 【洛谷】【线段树+位运算】P2574 XOR的艺术

    [题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ...

  2. ceph 分布式存储安装

    [root@localhost ~]# rm -rf /etc/yum.repos.d/*.repo 下载阿里云的base源 [root@localhost ~]# wget -O /etc/yum. ...

  3. 豆瓣电影top250爬取并保存在MongoDB里

    首先回顾一下MongoDB的基本操作: 数据库,集合,文档 db,show dbs,use 数据库名,drop 数据库 db.集合名.insert({}) db.集合名.update({条件},{$s ...

  4. 网页里面出现"$#2342"类似这样 应该怎么转义过来?

    Python2 from HTMLParser import HTMLParser print HTMLParser().unescape('【竞彩足球')

  5. CentOS中配置VNC Server

    环境:CentOS 6.4 1.安装tigervnc-server及相关软件 首先检查系统中是否安装tigervnc-server安装包 rpm -qa tigervnc-server 如果没有就直接 ...

  6. P1877 [HAOI2012]音量调节

    题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面写着每首歌开始之前他想要改变的音量是多少. ...

  7. openstack self-service 实例 连接外网数据表流程

    我的openstack的架构是最简单的controller-compute架构,在provider基础上创建self-service  self-service的实例上外网的流量走向 登陆实例,pin ...

  8. css布局中关于 块状元素和行内元素的区分

    这两天在准备实习的面试和笔试,准备复习一下这些基础的概念,避免自己处于一种仅脑袋理解嘴巴不能表述出来的状态. 块状元素和行内元素的概念是在css页面布局这个地方出现.主要是将html标签按照一定的特性 ...

  9. golang cgo 使用总结

    原文地址 CGO 提供了 golang 和 C 语言相互调用的机制.某些第三方库可能只有 C/C++ 的实现,完全用纯 golang 的实现可能工程浩大,这时候 CGO 就派上用场了.可以通 CGO ...

  10. win10安装OpenSSL及简单的使用

    学习IdentityServer过程中需要使用OpenSSL,OpenSSL是什么东西?百度百科的解释:在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信, ...