oracle的存储过程
来源:互联网 发布:金丝绒连衣裙新款淘宝 编辑:程序博客网 时间:2024/04/26 15:07
为了方便学习自己整理了下,在里面的案例在oracle数据库中都可以直接运行,分享给大家
存储过程
创建存储过程
优点:存储过程是已经编译好的代码,所以其被调用或者引用的时候执行效率非常高
语法格式如下:
create [orreplace]procedure pro_name[(parameter1[,parameter2]…)]is|as
begin
plsql_sentences;
[exception]
[dowith _sentences;]
end [pro_name];
参数说明:
pro_name :存储过程的名称,如果数据库中已经存在了此名称,则可以指定”or replace”关键字,这样的存储过程将覆盖原来的存储过程
parameter1:存储过程的参数,若是输入参数,则需要在其后指定”in”关键字;若是输出参数,则需要在其后面指定”out”关键字。在int和out关键字的后面是参数的数据类型,但不能指定该类型的长度。
plsql_sentences:PL/SQL语句,它是存储过程功能实现的主体
dowith _ sentences:异常处理语句,也是PL/SQL语句,这是一个可选项
案例:
创建一个存储过程,该存储过程实现向dept表中插入一条记录
createprocedure pro_insertDept is
begin
insert into dept values(77,'市场拓展部','JILIN');
commit;
dbms_output.put_line('插入数据记录成功');
endpro_insertDept;
/
1) SQL:Plus环境中,使用execute执行:
executepro_insertDept;
2) PL/SQL块中调用:
set serverout on
begin
pro_insertDept;
end;
/
存储过程的参数
IN模式参数
案例:创建一个存储过程,并定义3个in模式的变量
create or replace procedure insert_dept(
num_deptno in number,
var_ename in varchar2,
var_loc in varchar2) is
begin
insert into dept values(num_deptno,var_ename,var_loc);
commit;
endinsert_dept;
/
向存储过程中添加参数的方法
1) PL/SQL按指定名称传递
pro_name(parameter1=>value1[,parameter2=>value2]...)
parameter1:参数名称,在传递参数值是,这个参数名称与存储过程中定义的参数顺序无关
value1:参数值,在他的左侧不是常规的赋值符号”=”,而是一种新的赋值符号”=>”,需要注意参数值的类型和与参数定义类型兼容。
begin
insert_dept(var_ename=>'采购部',var_loc=>'成都',num_deptno=>15);
end;
/
2) PL/SQL按位置传递:用户提供的数值顺序必须与存储过程中定义的参数顺序相同
begin
insert_dept(28,'工程部','洛阳');
end;
/
说明:用户可以通过desc命令查看存储过程的定义信息,这些信息包括参数名、参数定义顺序、参数模式等
3) 混奈何方式传递:
exec insert_dept(38,var_loc => '济南',var_ename => '测试部');
说明:使用混合模式传入参数值,需要注意的是:在某个位置使用”指定名称传递”方式传入参数值后,其后面的参数值也要使用”指定名称传递”,因为”指定名称传递”的方式有可能已经破坏了参数原始定义顺序。
out模式参数
create or replace procedure select_dept(
num_deptno in number, --定义in模式变量,要求输入部门编号
var_dname out dept.dname%type, --定义out模式变量,可以存储部门名称并输出
var_locout dept.loc%type) is
begin
selectdname,loc into var_dname,var_loc from dept where deptno=num_deptno;
exception
whenno_data_found then --若无返回记录
dbms_output.put_line('该部门编号不存在');
end select_dept;
/
1) PL/SQL执行:
set serverout on
declare
var_dname dept.dname%type; --声明变量,对应过程中的out模式的var_dname
var_locdept.loc%type; --声明变量,对应过程中的out模式的var_loc
begin
select_dept(77,var_dname,var_loc); --传入部门编号,然后输出名称和位置信息
dbms_output.put_line(var_dname||'位于:'||var_loc); --输出信息
end;
/
2) 使用exec命令执行out模式的存储过程
variable var_dname varchar2(50);
variable var_loc varchar2(50);
exec select_dept(10,:var_dname,:var_loc);
使用select语句检索并输出数据变量var_dname和var_loc的值
select :var_dname,:var_loc;
IN OUT模式参数
在执行那个存储过程时,IN参数不能被修改,它只能被传入的指定值(或者是默认值)为存储过程提供数据,而OUT类型的参数只能等待被赋值,而不能像IN参数那样为存储过程本身提供数据,但是IN OUT参数可以兼顾其他两种参数的特点,在调用存储过程是,可以从外界向该类型的参数传入值,在执行完存储过程之后,可以将该参数的返回值传给外界。
案例:
创建一个存储过程,在其中定义一个"int out"参数,该存储过程用来计算这个参数的平方或者平方根
create orreplace procedure pro_square(
num in out number, --计算它的平方根或者平法,这是一个"inout"参数
flag in boolean) is --计算平方或平方根的表示,这是一个"in"参数
i int :=2 --表示计算平方,这是一个内部变量
begin
if flag then --若为true
num :=power(num,i); --计算平方
else
num :=sqrt(num); --计算平方根
end if;
end;
调用存储过程
declare
var_number number; --存储要进行运算的值和运算后的结构
var_temp number; --存数要进行运算的值
boo_flag boolean; --true代表平方根,false代表立方
begin
var_temp :=3;
var_number :=var_temp;
boo_flag :=true; --true代表调用平方
pro_square(var_number,boo_flag); --调用存储过程
ifboo_flag then
dbms_output.put_line(var_temp||'平方是:'||var_number);--输出计算结果
else
dbms_output.put_line(var_temp||'平方根是:'||var_number);
endif;
end;
/
IN参数默认值
Oracle支持在声明IN参数的同时给其初始化默认值,这样在存储过程调用的时候,如果没有向IN参数中传入值,则存储过程可以使用默认值进行操作。
create or replace procedure insert_dept(
num_deptno in number, --存储部门编号
var_dname in varchar2 default '综合部', --定义存储部门名称的IN参数,并初始化默认值
var_loc in varchar2 default '北京') is
begin
insertinto dept values(num_deptno,var_dname,var_loc);--插入一条数据
end;
/
先添加数据,再运行
declare
row_dept dept%rowtype; --自定义行变量,与dept表的一行类型相同
begin
insert_dept(9,var_loc=>'太原'); --调用存储过过程,传入参数
commit; --提交数据库
select* into row_dept from dept where deptno=57; --重新插入的记录
dbms_output.put_line('部门名称为:'||row_dept.dname);
end;
- Oracle的存储过程。
- Oracle的存储过程
- oracle的存储过程
- oracle的存储过程
- Oracle的存储过程
- oracle的存储过程
- Oracle的存储过程
- oracle的存储过程
- oracle的存储过程
- Oracle的存储过程
- Oracle的存储过程
- oracle的存储过程
- oracle的存储过程
- 简单的ORACLE存储过程
- oracle存储过程的调试
- Oracle存储过程的调用
- oracle分页的存储过程
- Oracle存储过程的经验之谈
- PID理解笔记
- Java IO File 通过递归程序完成删除某个文件夹(包括里面所有文件)
- 消息队列中间件的技术选型分析
- 整数拆分问题 动态规划解法
- 1043. 输出PATest(20)——C语言
- oracle的存储过程
- 141-Linked List Cycle
- netty源码分析(十六)Channel选择器工厂与轮询算法及注册底层实现
- HDU
- 从0开始学Python--0x01. Python安装
- unity-ugui的text字体模糊解决办法
- 最小路径和
- JAVA调用外部程序错误
- Storm之——Kafka+Storm+HDFS整合实战