**创建存储过程**
示例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;
存储函数的语法(函数与存储过程的结构类似,但是函数必须有一个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;
一句话总结这两个区别
过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据。
–触发器:当用户执行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;