当天视频
function 函数
函数就是Java中的方法 !
函数与存储过程的区别:
1. 函数的关键字是function ,存储过程的关键字procedure
2. 存储过程没有返回值 , 函数可以通过return返回数据
3. 调用的方式不同
- 存储过程再调用时, 就是pl/sql的一部分
- 函数在调用时, 必须组成表达式 才可以
声明函数语法格式:
create or replace function(参数列表) return 声明的返回值类型
is
/*申明区*/
begin
return 值;
end;
/
查看函数结果
desc 函数名;
删除函数
drop function 函数名;
练习: 创建一个函数, 包含两个参数, 返回最大值 !
create or replace function mymax(var_a number,var_b number) return number
is
begin
if var_a>var_b then
return var_a;
else
return var_b;
end if;
end;
回顾之前调用函数的操作
select min(salary) from s_emp;
调用自己编写的函数
select mymax(100,200) from dual;
在PL/SQL中调用函数
set serveroutput on;
begin
dbms_output.put_line(mymax(200,300));
end;
/
查看函数结果
desc mymax;
练习:
写一个函数, 传入两个数值, 返回其中的最大值, 并将两个参数的和 存储到第二个参数中, 不允许使用第三方变量:
create or replace function haha(var_x number,var_y in out number) return number
is
begin
if var_x<var_y then
var_y := var_x+var_y;
return var_y-var_x;
end if;
var_y :=var_x+var_y;
return var_x;
end;
/
-----------------------
set serveroutput on;
declare
var_max number;
var_x number :=100;
var_y number :=200;
begin
var_max := haha(var_x,var_y);
dbms_output.put_line('最大值为:'||var_max||',和为:'||var_y);
end;
包 package
概念: 把相关的函数, 过程, 类型 等等 放到一起的一个逻辑结构!
dbms_output : 系统输出包
- 函数put_line(): 输出到控制台
dbms_random : 随机数包
- value(参数1,参数2)函数
参数1. 随机数字产生的最小范围 (包含)
参数2. 随机数字产生的最大范围 (不包含)
返回值:number类型的浮点型随机数
-----
使用随机数包. 获取一个1-10000的整数值
-- 因为随机数返回的是浮点型的数字 , 所以我们获取到随机数后,需要截取
select trunc(dbms_random.value(1,10000)) from dual;
dbms_job :定时任务包
有一个我们不怎么使用的包 , 与定时任务包容易混淆 :
dbms_lob: 读取和写入大文本和二进制的
------------------------------------------
函数:
1. submit(参数1,参数2,参数3,参数4) 提交定时任务给数据库管理系统
- 参数1.job(out binary_integer): 提交定时任务时,自动生成的一个任务编号;
- 参数2.what(varchar2):要调用的存储过程的名称 ,注意字符串使用单引号
- 参数3.next_date(date):第一次执行时的时间
- 参数4.interval(varchar2)调用的间隔时间
- 这个字符串应传递date类型的字符串(未来时间) ,并且间隔时间的算法是参数4减去参数3
2. run(任务编号 binary_integer):执行指定编号的定时任务
3. remove(任务编号 binary_integer):把指定编号的定时任务从数据库管理系统中移除 !
定时任务练习
定义一个表格,
在定时任务中, 每隔1分钟, 向这个表格插入一行数据!
步骤:
1. 定义一个表格
drop table person cascade constraints;
create table person(
id number constraint person_id_pk primary key,
name varchar2(100),
age number
);
2. 定义一个存储过程, 存储过程中向person表格插入一行数据
-- 创建一个序列, 用来插入id值
drop sequence person_id_seq;
create sequence person_id_seq;
-- 序列.currval: 取出当前序列值
create or replace procedure xperson
is
begin
insert into person values(person_id_seq.nextval,'kaikai'||person_id_seq.currval,16);
end;
/
3. 在匿名块中创建定时任务 , 并提交给数据库管理系统 , 并执行
set serveroutput on;
declare
myjob binary_integer := 100;
begin
dbms_job.submit(myjob,'xperson();',sysdate,'sysdate+(1/(60*24))');
dbms_output.put_line(myjob);
-- 执行
dbms_job.run(myjob);
end;
/
- 删除定时任务
begin
dbms_job.remove(1);
end;
/
触发器 trigger
概念: 在进行DML操作时 , 我们可以对其今天触发器的添加,
添加完毕后, 当指定的dml操作发生时, 触发器会自动执行
创建触发器的语法格式:
create or replace trigger 自定义触发器名称 before|after insert|update|delete(选择相应的DML操作) on 表名 [for each row]
declare
begin
在这里做触发时执行的代码
end;
练习:
对于person表的插入, 进行触发
create or replace trigger person_insert_trigger after insert on person
declare
begin
dbms_output.put_line('您在向person插数据');
end;
/
set serveroutput on;
insert into person values(10001,'kaikai',18);
将语句级触发器 更改为 行级触发器
语句级触发器与行级触发器的区别:
语句级触发器, 是针对一条语句 触发一次 !
- 语句级触发器, 只要执行语句 ,哪怕执行失败, 也会触发 ,且只触发一次!
行级触发器,触发的次数是 数据库中记录的修改条数!
- 行级触发器,执行的语句如果没有对数据库进行更改,则不会触发
- 如果一条dml语句 , 影响了数据库中10条数据,则会触发10次
create or replace trigger person_update_trigger after update on person for each row
declare
begin
dbms_output.put_line('修改数据');
end;
/
set serveroutput on;
update person set age=28;
在触发器中 获取原数据与新数据
旧数据:old
新数据:new
:old 和 :new 可以看作一个对象, 直接使用.调用数据 即可获取值
DML的三种操作, 可获取的数据不同
insert: 只可获取新数据
update: 可以获取新数据和旧数据
delete: 只可获取旧数据
练习:
create or replace trigger person_update_trigger after update on person for each row
declare
begin
dbms_output.put_line('您在修改person,原name:'||:old.name||',新name:'||:new.name);
end;
/
set serveroutput on;
update person set name='dadoubikaikai';
JDBC
9-27,星期三 14:03:36
什么是JDBC
Java database conactivity
使用Java技术, 连接数据库, 对数据库进行操作的一套api
注意: JDBC中事务是默认自动提交的!
为什么学习数据库?
存储数据
- 内存存储
- 文件存储
JDBC规范由来
sum公司, 为了简化和统一Java语言对于数据库的操作 ,制订了一系列的接口, 由各大数据库厂商进行实现 !
jar文件
两种方式存在:
1. 可执行文件, 在安装了jre的计算机上,可以双击运行
2. class的容器, 存储了一些class , 可以在编写新的代码时,直接引入
引入JDBC的Jar文件 :
在oracle安装目录下, 寻找ojdbc6.jar文件,复制后执行如下步骤:
在Eclipse中,
1. 右击项目 创建文件夹(new-->folder), 命名lib
2. 将jar文件粘贴到lib文件夹中
3. 右键jar文件选择build-path -- > add to build path
数据库连接地址:
本机ip地址:
127.0.0.1
localhost
数据库的地址:
格式: 主协议:子协议//主机地址:端口号/数据库的名称
- oracle数据库的连接地址:
jdbc:oracle:thin:@localhost:1521/xe
- mysql数据库的连接地址:
jdbc:mysql://localhost:3306/数据库名称
开启windows中的OracleXETNSListener
这个服务时oracle数据库 用来侦听1521端口号数据的 .
如果服务关闭, 则无法连接 .
- 关闭的原因:
- 1. 防火墙未关闭
- 2. 杀毒软件优化开机启动项
- 3. 更改过计算机名称
- 4. 手动关闭
- 解决方案:
关闭防火墙 ,卸载杀毒软件,重装数据库!
JDBC连接步骤:
//1. 加载数据库驱动 :oracle.jdbc.driver.OracleDriver
Class.forName("oracle.jdbc.driver.OracleDriver");
//2. 通过数据库驱动管理器(DriverManager类) 获取连接对象
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/xe", "system", "123456");
//3. 通过连接对象, 获取SQL的执行环境
Statement state = conn.createStatement();
//4. 通过Statement执行SQL语句
state.execute("insert into person values(20001,'kaikai',19)");
//5. 释放资源
//- 1. 关闭SQL执行环境
state.close();
//- 2. 关闭JDBC连接对象
conn.close();
数据库连接中使用到的方法与含义
DriverManager类
获取数据库连接:
getConnection(url, user, password)方法:
- 参数1. 数据库的连接地址
- 参数2. 数据库的帐号
- 参数3. 数据库的密码
Connection类
创建SQL执行环境:
createStatement(): 用来执行SQL语句的 环境
Statement类
1. execute(sql):
执行一条SQL语句!
参数: 要执行的SQL语句, String类型 ,可以用来执行所有的SQL语句
return boolean类型, true表示是select语句
2. executeUpdate(SQL):
用来执行DML语句(INSERT|UPDATE|DELETE)
参数: 要执行的DML语句, String类型
return int类型 , 表示当前SQL语句 对数据库中的影响行数!
3. executeQuery(SQL):
用来执行SELECT语句
return : ResultSet(结果集对象)
function 函数
函数就是Java中的方法 !
函数与存储过程的区别:
1. 函数的关键字是function ,存储过程的关键字procedure
2. 存储过程没有返回值 , 函数可以通过return返回数据
3. 调用的方式不同
- 存储过程再调用时, 就是pl/sql的一部分
- 函数在调用时, 必须组成表达式 才可以
声明函数语法格式:
create or replace function(参数列表) return 声明的返回值类型
is
/*申明区*/
begin
return 值;
end;
/
查看函数结果
desc 函数名;
删除函数
drop function 函数名;
练习: 创建一个函数, 包含两个参数, 返回最大值 !
create or replace function mymax(var_a number,var_b number) return number
is
begin
if var_a>var_b then
return var_a;
else
return var_b;
end if;
end;
回顾之前调用函数的操作
select min(salary) from s_emp;
调用自己编写的函数
select mymax(100,200) from dual;
在PL/SQL中调用函数
set serveroutput on;
begin
dbms_output.put_line(mymax(200,300));
end;
/
查看函数结果
desc mymax;
练习:
写一个函数, 传入两个数值, 返回其中的最大值, 并将两个参数的和 存储到第二个参数中, 不允许使用第三方变量:
create or replace function haha(var_x number,var_y in out number) return number
is
begin
if var_x<var_y then
var_y := var_x+var_y;
return var_y-var_x;
end if;
var_y :=var_x+var_y;
return var_x;
end;
/
-----------------------
set serveroutput on;
declare
var_max number;
var_x number :=100;
var_y number :=200;
begin
var_max := haha(var_x,var_y);
dbms_output.put_line('最大值为:'||var_max||',和为:'||var_y);
end;
包 package
概念: 把相关的函数, 过程, 类型 等等 放到一起的一个逻辑结构!
dbms_output : 系统输出包
- 函数put_line(): 输出到控制台
dbms_random : 随机数包
- value(参数1,参数2)函数
参数1. 随机数字产生的最小范围 (包含)
参数2. 随机数字产生的最大范围 (不包含)
返回值:number类型的浮点型随机数
-----
使用随机数包. 获取一个1-10000的整数值
-- 因为随机数返回的是浮点型的数字 , 所以我们获取到随机数后,需要截取
select trunc(dbms_random.value(1,10000)) from dual;
dbms_job :定时任务包
有一个我们不怎么使用的包 , 与定时任务包容易混淆 :
dbms_lob: 读取和写入大文本和二进制的
------------------------------------------
函数:
1. submit(参数1,参数2,参数3,参数4) 提交定时任务给数据库管理系统
- 参数1.job(out binary_integer): 提交定时任务时,自动生成的一个任务编号;
- 参数2.what(varchar2):要调用的存储过程的名称 ,注意字符串使用单引号
- 参数3.next_date(date):第一次执行时的时间
- 参数4.interval(varchar2)调用的间隔时间
- 这个字符串应传递date类型的字符串(未来时间) ,并且间隔时间的算法是参数4减去参数3
2. run(任务编号 binary_integer):执行指定编号的定时任务
3. remove(任务编号 binary_integer):把指定编号的定时任务从数据库管理系统中移除 !
定时任务练习
定义一个表格,
在定时任务中, 每隔1分钟, 向这个表格插入一行数据!
步骤:
1. 定义一个表格
drop table person cascade constraints;
create table person(
id number constraint person_id_pk primary key,
name varchar2(100),
age number
);
2. 定义一个存储过程, 存储过程中向person表格插入一行数据
-- 创建一个序列, 用来插入id值
drop sequence person_id_seq;
create sequence person_id_seq;
-- 序列.currval: 取出当前序列值
create or replace procedure xperson
is
begin
insert into person values(person_id_seq.nextval,'kaikai'||person_id_seq.currval,16);
end;
/
3. 在匿名块中创建定时任务 , 并提交给数据库管理系统 , 并执行
set serveroutput on;
declare
myjob binary_integer := 100;
begin
dbms_job.submit(myjob,'xperson();',sysdate,'sysdate+(1/(60*24))');
dbms_output.put_line(myjob);
-- 执行
dbms_job.run(myjob);
end;
/
- 删除定时任务
begin
dbms_job.remove(1);
end;
/
触发器 trigger
概念: 在进行DML操作时 , 我们可以对其今天触发器的添加,
添加完毕后, 当指定的dml操作发生时, 触发器会自动执行
创建触发器的语法格式:
create or replace trigger 自定义触发器名称 before|after insert|update|delete(选择相应的DML操作) on 表名 [for each row]
declare
begin
在这里做触发时执行的代码
end;
练习:
对于person表的插入, 进行触发
create or replace trigger person_insert_trigger after insert on person
declare
begin
dbms_output.put_line('您在向person插数据');
end;
/
set serveroutput on;
insert into person values(10001,'kaikai',18);
将语句级触发器 更改为 行级触发器
语句级触发器与行级触发器的区别:
语句级触发器, 是针对一条语句 触发一次 !
- 语句级触发器, 只要执行语句 ,哪怕执行失败, 也会触发 ,且只触发一次!
行级触发器,触发的次数是 数据库中记录的修改条数!
- 行级触发器,执行的语句如果没有对数据库进行更改,则不会触发
- 如果一条dml语句 , 影响了数据库中10条数据,则会触发10次
create or replace trigger person_update_trigger after update on person for each row
declare
begin
dbms_output.put_line('修改数据');
end;
/
set serveroutput on;
update person set age=28;
在触发器中 获取原数据与新数据
旧数据:old
新数据:new
:old 和 :new 可以看作一个对象, 直接使用.调用数据 即可获取值
DML的三种操作, 可获取的数据不同
insert: 只可获取新数据
update: 可以获取新数据和旧数据
delete: 只可获取旧数据
练习:
create or replace trigger person_update_trigger after update on person for each row
declare
begin
dbms_output.put_line('您在修改person,原name:'||:old.name||',新name:'||:new.name);
end;
/
set serveroutput on;
update person set name='dadoubikaikai';
JDBC
9-27,星期三 14:03:36
什么是JDBC
Java database conactivity
使用Java技术, 连接数据库, 对数据库进行操作的一套api
注意: JDBC中事务是默认自动提交的!
为什么学习数据库?
存储数据
- 内存存储
- 文件存储
JDBC规范由来
sum公司, 为了简化和统一Java语言对于数据库的操作 ,制订了一系列的接口, 由各大数据库厂商进行实现 !
jar文件
两种方式存在:
1. 可执行文件, 在安装了jre的计算机上,可以双击运行
2. class的容器, 存储了一些class , 可以在编写新的代码时,直接引入
引入JDBC的Jar文件 :
在oracle安装目录下, 寻找ojdbc6.jar文件,复制后执行如下步骤:
在Eclipse中,
1. 右击项目 创建文件夹(new-->folder), 命名lib
2. 将jar文件粘贴到lib文件夹中
3. 右键jar文件选择build-path -- > add to build path
数据库连接地址:
本机ip地址:
127.0.0.1
localhost
数据库的地址:
格式: 主协议:子协议//主机地址:端口号/数据库的名称
- oracle数据库的连接地址:
jdbc:oracle:thin:@localhost:1521/xe
- mysql数据库的连接地址:
jdbc:mysql://localhost:3306/数据库名称
开启windows中的OracleXETNSListener
这个服务时oracle数据库 用来侦听1521端口号数据的 .
如果服务关闭, 则无法连接 .
- 关闭的原因:
- 1. 防火墙未关闭
- 2. 杀毒软件优化开机启动项
- 3. 更改过计算机名称
- 4. 手动关闭
- 解决方案:
关闭防火墙 ,卸载杀毒软件,重装数据库!
JDBC连接步骤:
//1. 加载数据库驱动 :oracle.jdbc.driver.OracleDriver
Class.forName("oracle.jdbc.driver.OracleDriver");
//2. 通过数据库驱动管理器(DriverManager类) 获取连接对象
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/xe", "system", "123456");
//3. 通过连接对象, 获取SQL的执行环境
Statement state = conn.createStatement();
//4. 通过Statement执行SQL语句
state.execute("insert into person values(20001,'kaikai',19)");
//5. 释放资源
//- 1. 关闭SQL执行环境
state.close();
//- 2. 关闭JDBC连接对象
conn.close();
数据库连接中使用到的方法与含义
DriverManager类
获取数据库连接:
getConnection(url, user, password)方法:
- 参数1. 数据库的连接地址
- 参数2. 数据库的帐号
- 参数3. 数据库的密码
Connection类
创建SQL执行环境:
createStatement(): 用来执行SQL语句的 环境
Statement类
1. execute(sql):
执行一条SQL语句!
参数: 要执行的SQL语句, String类型 ,可以用来执行所有的SQL语句
return boolean类型, true表示是select语句
2. executeUpdate(SQL):
用来执行DML语句(INSERT|UPDATE|DELETE)
参数: 要执行的DML语句, String类型
return int类型 , 表示当前SQL语句 对数据库中的影响行数!
3. executeQuery(SQL):
用来执行SELECT语句
return : ResultSet(结果集对象)