Oracle小结二
来源:互联网 发布:摇滚莫扎特 知乎 编辑:程序博客网 时间:2024/06/10 17:24
三、存储过程和存储函数
1.定义
存储在数据库中供所有用户程序调用的子程序叫存储过程、存储函数.
存储过程和存储函数中,不要commit,因为commit是需要用户操作的.
2.存储过程
(1)无参存储过程
创建存储过程:
create or replace procedure sayHello
as
begin
dbms_output.put_line('Hello!');
end;
/
调用执行存储过程:
set serveroutput on
execute sayHello();
或者
set serveroutput on
exec sayHello(); //execute的简写
或者
set serveroutput on
begin
sayHello();
end;
/
(2)有参数的存储过程
给指定的员工涨100元工资,并打印涨前和涨后的薪水.
create or replace procedure raiseSalary(eno in number) //这里的in代表是输入参数,也可以省略,因为默认就是in,如果是输出参数就必须指明out
as
psal emp.sal%type;
begin
select sal into psal from emp where empno=eno;
update emp set sal=sal+100 where empno=eno;
dbms_output.put_line('涨前:'||psal||'涨后:'||(psal+100));
end;
/
调用:
set serveroutput on
begin
raiseSalary(7839);
end;
/
3.存储函数
函数为一命名的存储程序,可带参数,并返回一个计算值,函数和过程的结构类似,但必须有一个retur子句,用于返回函数值。
函数说明要指定函数名、结果值的类型、以及参数类型等.
示例:查询某职工年收入
create or replace function queryEmpIncome(eno in number)
return number
as
psal emp.sal%type;
pcomm emp.comm%type;
begin
select sal,comm into psal,pcomm from emp where empno=eno;
return psal*12 + nvl(pcomm,0);
end;
/
调用:
set serveroutput on
declare
v_sal number;
begin
v_sal :=queryEmpIncome(7839);
dbms_output.put_line('salary is:'||v_sal);
end;
/
4.过程和函数中的in和out
* 一般来讲,过程和函数的区别在于函数可以有一个返回值,而过程没有返回值.
* 但过程和函数都可以通过out指定一个或多个输出参数.我们可以利用out参数,在过程和函数中实现返回多个值.
示例:
(1)查询某个员工的姓名,月薪,职位
create or replace
procedure queryEmpInfo(eno in number,
pname out varchar2,
psal out number,
pjob out varchar2)
as
begin
select ename,sal,job into pname,psal,pjob from emp
where empno=eno;
end;
(2)查询某个部门中所有员工的所有信息(out参数中使用光标,必须在包里面)
/*声明包结构,包头只负责声明*/
create or replace
package mypackage as //声明自己的包
type empcursor is ref cursor; //定义自己的光标,ref是参考的缩写.
procedure queryEmpList(dno in number,empList out empcursor);//声明存储过程
end mypackage;
/*包体,只负责实现*/
create or replace
package body mypackage as
procedure queryEmpList(dno in number,empList out empcursor) as
begin
open empList for select * from emp where deptno=dno;//emplist是自己定义的光标类型,因此需要open
end queryEmpList;
end mypackage;
* 什么时候用存储过程/存储函数?
原则(不强制,但都这么干):如果只有一个返回值,用存储函数;否则就用存储过程.
在Oracle可以认为存储过程和存储函数是完全一样的,为了兼容老版本,所以两个都保留.
5.在java语言中调用存储过程、存储函数;以及访问游标类型的out参数
四、触发器
1.概述
* 数据库触发器事一个与表相关联的、存储的PL/SQL程序.每当一个特定的数据操作语句(insert,update,delete)在指定的表上发出时,
Oracle自动执行触发器中定义的语句序列.
* 类型:
语句级触发器:在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行.
行级触发器(for each row):触发语句作用的每一条记录都被触发.在行级触发器中使用old和new伪记录变量, 识别值的状态.
1.定义
存储在数据库中供所有用户程序调用的子程序叫存储过程、存储函数.
存储过程和存储函数中,不要commit,因为commit是需要用户操作的.
2.存储过程
(1)无参存储过程
创建存储过程:
create or replace procedure sayHello
as
begin
dbms_output.put_line('Hello!');
end;
/
调用执行存储过程:
set serveroutput on
execute sayHello();
或者
set serveroutput on
exec sayHello(); //execute的简写
或者
set serveroutput on
begin
sayHello();
end;
/
(2)有参数的存储过程
给指定的员工涨100元工资,并打印涨前和涨后的薪水.
create or replace procedure raiseSalary(eno in number) //这里的in代表是输入参数,也可以省略,因为默认就是in,如果是输出参数就必须指明out
as
psal emp.sal%type;
begin
select sal into psal from emp where empno=eno;
update emp set sal=sal+100 where empno=eno;
dbms_output.put_line('涨前:'||psal||'涨后:'||(psal+100));
end;
/
调用:
set serveroutput on
begin
raiseSalary(7839);
end;
/
3.存储函数
函数为一命名的存储程序,可带参数,并返回一个计算值,函数和过程的结构类似,但必须有一个retur子句,用于返回函数值。
函数说明要指定函数名、结果值的类型、以及参数类型等.
示例:查询某职工年收入
create or replace function queryEmpIncome(eno in number)
return number
as
psal emp.sal%type;
pcomm emp.comm%type;
begin
select sal,comm into psal,pcomm from emp where empno=eno;
return psal*12 + nvl(pcomm,0);
end;
/
调用:
set serveroutput on
declare
v_sal number;
begin
v_sal :=queryEmpIncome(7839);
dbms_output.put_line('salary is:'||v_sal);
end;
/
4.过程和函数中的in和out
* 一般来讲,过程和函数的区别在于函数可以有一个返回值,而过程没有返回值.
* 但过程和函数都可以通过out指定一个或多个输出参数.我们可以利用out参数,在过程和函数中实现返回多个值.
示例:
(1)查询某个员工的姓名,月薪,职位
create or replace
procedure queryEmpInfo(eno in number,
pname out varchar2,
psal out number,
pjob out varchar2)
as
begin
select ename,sal,job into pname,psal,pjob from emp
where empno=eno;
end;
(2)查询某个部门中所有员工的所有信息(out参数中使用光标,必须在包里面)
/*声明包结构,包头只负责声明*/
create or replace
package mypackage as //声明自己的包
type empcursor is ref cursor; //定义自己的光标,ref是参考的缩写.
procedure queryEmpList(dno in number,empList out empcursor);//声明存储过程
end mypackage;
/*包体,只负责实现*/
create or replace
package body mypackage as
procedure queryEmpList(dno in number,empList out empcursor) as
begin
open empList for select * from emp where deptno=dno;//emplist是自己定义的光标类型,因此需要open
end queryEmpList;
end mypackage;
* 什么时候用存储过程/存储函数?
原则(不强制,但都这么干):如果只有一个返回值,用存储函数;否则就用存储过程.
在Oracle可以认为存储过程和存储函数是完全一样的,为了兼容老版本,所以两个都保留.
5.在java语言中调用存储过程、存储函数;以及访问游标类型的out参数
四、触发器
1.概述
* 数据库触发器事一个与表相关联的、存储的PL/SQL程序.每当一个特定的数据操作语句(insert,update,delete)在指定的表上发出时,
Oracle自动执行触发器中定义的语句序列.
* 类型:
语句级触发器:在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行.
行级触发器(for each row):触发语句作用的每一条记录都被触发.在行级触发器中使用old和new伪记录变量, 识别值的状态.
- Oracle小结二
- Oracle数据库学习小结(二)
- oracle常用函数小结(二)
- oracle 10g 备份与还原小结(二)
- 小结二
- Oracle 小结
- Oracle 小结
- Oracle小结
- oracle小结
- Oracle小结
- Oracle小结
- oracle小结
- NHibernate小结之二
- Struts学习小结 二
- Hibernate课堂小结二
- spring小结二
- Java Exception小结(二)
- 【软件工程】小结(二)
- 【mysql】windows下,mysql中root用户忘记密码的解决方案
- jQuery获取Select选择的Text和Value:
- 设置 Apache & hosts 本地开发环境
- Cocos2d开发系列(九)
- jquery,input框实时数据获取及完全改变后获取
- Oracle小结二
- RVDS2.2配置
- 打印Java异常信息
- :/etc/profile
- 转:九月十月百度人搜,阿里巴巴,腾讯华为笔试面试八十题(第331-410题)
- 图灵奖得主John Hopcroft:计算机科学的新方向
- PLSQL小结
- gcc -m64 -fPIC 编译问题
- hdu 1171 多重背包