Oracle的存储过程,存储函数,触发器,序列,主键自增

存储过程 存储函数 触发器 主键自增案例

    • 1.存储过程
    • 2:存储函数
    • 3,触发器

1.存储过程

**创建存储过程**
  • create [or replace] procedure 存储过程名
      [(参数1 类型,参数2 out 类型……)]   
      as
        变量名  类型;
      begin
        程序代码体
      end;

示例1:无参无返(使用存储过程打印你好世界,我的名字是张先生)

Create Or Replace Procedure myDemo01
As
Begin 
 dbms_output.put_line('hello word ,my name is MrZhang');
End;

//执行存储过程

Declare
Begin 
 myDemo01;
End;

ps:

or replace代表创建该存储过程时,若存储名存在,则替换原存储过程,重新创建 无参数列表时,不需要写()

示例二: 变量声明 赋值

Create Or Replace Procedure myDemo02
As
Name Varchar(10);--声明变量,注意varchar需要指定长度
age Int;
Begin
   Name:='xiaozhang';--变量赋值
   age:=22;
   dbms_output.put_line('name='||name||', age='||age);--通过||符号达到连接字符串的功能
End;

//执行存储过程

Declare
Begin
 myDemo02;
End;

示例3: 存储过程 带有参数的存储过程

Create Or Replace Procedure myDemo03(Name In Varchar ,age In Int)
As
Begin
     dbms_output.put_line('name='||name||', age='||age);
End;

//执行语句
Begin
     myDemo03('xiaozhang',23);
End;

示例四:有参有返

create or replace procedure myDemo04
(name in varchar2,age int,msg out varchar2)
//参数列表中,声明变量类型时切记不能写大小,只写类型名即可,例如参数列表中的name变量的声明
//参数列表中,输入参数用in表示,输出参数用out表示,不写时默认为输入参数。
//输入参数不能携带值出去,输出参数不能携带值进来,当既想携带值进来,又想携带值出去,可以用in out
as
begin
  msg:='姓名'||name||',年龄'||age;
  //赋值时除了可以使用:=,还可以用into来实现
  //上面子句等价于select '姓名'||name||',年龄'||age into msg from dual;
end;

//执行存储过程
declare
  msg varchar2(100);
begin
  myDemo04('张三',23,msg);  //由于msg是out为输出类型,所以这里可以接受到他的值,类似我们代码中的get 方法
  dbms_output.put_line(msg);
end;

2:存储函数

存储函数的语法(函数与存储过程的结构类似,但是函数必须有一个return子句,用于返回函数值。)

create[or replace] functiion 函数名(参数列表)
return函数值类型
as
begin
PLSQL子程序体;
end;
示例

create or replace function mydemo6
return varchar//必须有返回值,且声明返回值类型时不需要加大小
as
  msg varchar(50);
begin
   msg := 'hello world';
   return msg;
end;

//执行函数
declare
begin 
  dbms_output.put_line(mydemo6());
end;

一句话总结这两个区别
过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据。

3,触发器

–触发器:当用户执行insert |update |delete|这些操作之后,可以触发一系列其他的动作
作用:在动作执行之前或者之后,触发业务逻辑
如插入数据可以做个校验 PS:如员工涨工资之后的工资不能低于涨之前的

语法 Create [Or Replace] Trigger 触发器的名称
Before | After 执行触发前后
insert|update |Delete 执行的操作
On 表名
[For Each Row] 可选参数
Declare
Begin
//执行的逻辑
End;
触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
触发时间:指明触发器何时执行,该值可取:
before:表示在数据库动作之前触发器执行;
after:表示在数据库动作之后触发器执行。
触发事件:指明哪些数据库动作会触发此触发器:
insert:数据库插入会触发此触发器;
update:数据库修改会触发此触发器;
delete:数据库删除会触发此触发器。
表 名:数据库触发器所在的表。
for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。

–练习
–新建员工表

Create Table emp(
       eid Int,
       ename Varchar(20),
       esex Varchar(10)
);

–简单练习新员工加入后打印 欢迎加入新班级

Create Or Replace Trigger trig_test
After
Insert 
On emp
Declare
Begin
dbms_output.put_line('欢迎加入新班级');
End;

Insert Into emp(eid,ename,esex) Values(1,'张','男');
在执行插入后可以看到输出![https://img-blog.csdnimg.cn/20190620095645868.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY2MzI5Ng==,size_16,color_FFFFFF,t_70]

–简单练习星期六不能办理新员工入职
–在新数据插入之前
–判断当前日期是否是周六
–如果是,就不能插入

Create Or Replace Trigger trig_test1
Before
Insert
On emp
Declare
--声明一个变量记录当天时间
cday Varchar(10);
Begin 
 --查询当天时间   trim 去除空格
Select TRIM(to_char(Sysdate,'day')) Into cday  From dual;
If cday = '星期三' Then
dbms_output.put_line('星期三老板不在,不能办理入职');
RAISE_APPLICATION_ERROR(-20001,'老板不在');

End If;
End;
Insert Into emp(eid,ename,esex) Values(3,'李','女');

4:主键自增

–测试员工表
Create Table person(
pid Int primary Key Not Null,
pname Varchar(20)

);

–触发器自增
–1:序列

 Create  Sequence seq_person_id;
 --2:触发器      
 Create Or Replace Trigger tri_add_person_id
 Before
 Insert
 On person
 For Each Row  /*行触发器*/
 Declare
 Begin
      
      --给新记录pid赋值
      Select seq_person_id.Nextval Into :New.pid From dual;
      dbms_output.put_line(:New.pname);
 End;
 
 Insert Into person Values(Null,'zs');
 
 Select * From person;

你可能感兴趣的:(Oracle的存储过程,存储函数,触发器,序列,主键自增)