mysql存储过程insert和selectinto⼀起写_Oracle存储过程⼊门
(⼀)
概念
将不同的业务处理过程存储起来进⾏复⽤,这些被存起来重复利⽤的sql程序就是存储过程;类似于编程语⾔中的封装之后再调⽤的逻辑。
作⽤
oracle官⽅认为,在数据库能够完成的操作全部留在数据库中,因为在外部程序中运⾏这些操作容易产⽣错误;开发程序时,有些业务逻辑的开发,会向数据库进⾏多次连接,这样连接和关闭很耗费资源,性能⽐较低;如果将常⽤的业务逻辑放到数据库中,在应⽤程序的时候仅仅调⽤其就可以做到连接⼀次数据库,直接实现业务逻辑,可以⼤⼤提⾼效率;
语法
基本结构
CREATE OR REPLACE PROCEDURE 存储过程名字
(
参数1 IN NUMBER,
参数2 IN OUT NUMBER
) AS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN
NULL;
END 存储过程名字;
IN, OUT, IN OUT⽤来修饰参数;
IN 变量必须传⼊到PROCEDURE进⾏处理;
OUT 表⽰PRCEDURE 通过这个变量将值传出;
IN OUT 是这两种的组合。
begin与end之间为程序体;BEGIN关键词表明PL/SQL体的开始,END关键词表明PL/SQL体的结束。
null不能删去,pl/sql体中⾄少要有⼀句;
根据参数的类型,可以分为⽆参数、有输⼊参数in、有输⼊输出(返回值)in out的;
PLSQL中通过可视化界⾯创建存储过程的选项如下所⽰:
语句创建:
create or replace procedure 存储过程名(param1 in type,param2 out type)
as
变量1 类型(值范围); --vs_msg VARCHAR2(4000);
变量2 类型(值范围);
Begin
Select count(*) into 变量1 from 表A where列名=param1;
If (判断条件) then
Select 列名 into 变量2 from 表A where列名=param1;
Dbms_output.Put_line(‘打印信息’);
Elsif (判断条件) then
Dbms_output.Put_line(‘打印信息’);
Else
Raise 异常名(NO_DATA_FOUND);
End if;
Exception
When others then
Rollback;
End;
(param1 in type,param2 out type) 为参数,in/out分别为输⼊和输出参数;
普通常量的赋值:
V_TEST := "常量";
通过SELECT INTO STATEMENT对变量进⾏赋值: 将select查询的结果存⼊到变量中,存⼊⼀个变量:
Select count(*) into 变量1 from 表A where 列名=param1;
同时将多个列存储到多个变量中,查询结果必须是⼀条记录(多于⼀条⽆法写⼊),否则抛出异常(如果没有记录抛出NO_DATA_FOUND) BEGIN SELECT col1,col2 into 变量1,变量2 FROM 表A where 条件; EXCEPTION WHEN NO_DATA_FOUND THEN xxxx; END;
变量
基础的标量类型 (有%TYPE)
标量类型,常⽤的有NUMBER、CHAR 、VARCHAR2 、VARCHAR、NCHAR 、NVARCHAR2 、LONG 、DATE 、TIMESTAMP;
(1)引⽤性变量
另外还有⼀个最常⽤的是 %TYPE ,它利⽤已经存在的数据或者变量的数据类型来定义新数据的数据类型。例如,当定义多个变量或常量时,只要前⾯使⽤过的数据类型,后边的变量就可以利⽤%TYPE 引⽤,最常见的就是把表中的字段类型作为变量或常量的数据类型。
v_sal emptab.salary%TYPE表⽰:⼀个变量v_nb,类型是与表emptab中的字段salary的类型⼀致。
⽐如:
create or replace procedure 存储过程名(v_sal emptab.salary%TYPE,param2 out type)
as
--vs_msg VARCHAR2(4000);
param2 类型(值范围);
Begin
Select count(*) into param2 from 表A where列名=param1;
dbms_output.put_line(param2);
End;
(2)记录类型 (有%ROWTYPE)
如果需要选取的字段过多,⽐如该表⼗五个字段需要全部取⽤,⽤引⽤名称.成员名称和into 的赋值⽅式定义变量会过于⿇烦,所以有记录类型的变量;
通过%ROWTYPE的⽅式获取变量,是提取⾏记录时常⽤的存储数据的⽅式。
可以直接引⽤表中的某⾏作为变量类型;
DECLARE
v_obj ly_ds%rowtype; --ROWTYPE不区分⼤⼩写
BEGIN
--into赋值给v_obj,会按照定义的type顺序赋值
select * into v_obj from emp where id='2';
dbms_output.put_line('第⼀个变量:'||v_obj.ly_nl);
END;
select * into ,只能为 * ,如果要写为具体的列,那就要写全,因为%rowtype是⼀条记录的变量类型;
流程控制
1.条件语句
--只有⼀个if
if ....then
end if;
只有两种
--两种选择
if .....then
else
...
end if;
注意的⼀点就是elsif的写法!! --多种选择
if .... then
oracle游标的使用<
end if;
也可以在判断之后进⾏某些操作 IF V_TEST=1 THEN
BEGIN
do something
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论