plsql_day03
来源:互联网 发布:淘宝立即购买灰色 编辑:程序博客网 时间:2024/03/29 15:40
14.6 n
1+2+3+...+n
设计一个存储过程 传入一个参数代表从
1加到的数 把这个数对应的前n项的和
存入第二个参数中。调用这个存储过程
验证存储过程的功能。
create or replace procedure getNumN
(n number,var_sum out number)
is
begin
var_sum:=0;
for var_i in 1..n loop
var_sum:=var_sum+var_i;
end loop;
end;
/
declare
var_sum number:=0;
begin
getNumN(10,var_sum);
dbms_output.put_line('var_sum='
||var_sum);
end;
/
十五.函数 function
15.1 函数和存储过程的不同
关键字不同 procedure function
函数有返回值类型 和 返回值
过程没有。
调用方式不同 过程可以直接在plsql
中调用,函数必须组成表达式。
15.2 语法
设计一个函数 传入两个整数参数 返回
这两个参数的最大值。
create or replace function funGetMax
(var_x in number,var_y number)
return number
is
begin
if var_x < var_y then
return var_y;
end if;
return var_x;
end;
/
15.3 调用
select text from user_source
where name='FUNGETMAX';
select funGetMax(1,2) from dual;
declare
var_res number:=0;
begin
var_res:=funGetMax(1,123);
dbms_output.put_line(var_res);
end;
/
15.4 设计一个函数 传入两个整数参数
返回两个参数的最大值。并且把两个参数
的和放入第二个参数中。调用这个函数
验证功能。
create or replace function funGetMaxAndSum
(var_x in number,var_y in out number)
return number
is
var_temp number;
begin
var_temp:=var_y;
var_y:=var_x+var_y;
if var_x < var_temp then
return var_temp;
end if;
return var_x;
end;
/
declare
var_y number:=123;
var_res number:=0;
begin
var_res:=funGetMaxAndSum(321,var_y);
dbms_output.put_line(var_y);
dbms_output.put_line(var_res);
end;
/
十六.包 package
16.1 概念
把一组相关的过程 函数 变量 等组织到
一起,然后为这个逻辑结构命名。
16.2 系统提供的包
dbms_output
dbms_output.put_line('hello');
dbms_random
value(low,hig)
select dbms_random.value(1,100)
from dual;
select trunc(
dbms_random.value(1,100))
from dual;
dbms_job 定时调用存储过程
submit(JOB out BINARY_INTEGER
WHAT VARCHAR2
NEXT_DATE DATE
INTERVAL VARCHAR2)
可以把定时调用的任务提交给系统
系统会分配一个任务编号放入job中
what 定时调用的存储过程
第一次程序执行的时间
第二次调用的时间
run(jobno BINARY_INTEGER)
把对应的定时任务执行起来。
建立一张表 对这张表设计一个序列
写一个存储过程 每次可以向表中插入一条
数据。把这个存储过程配置到定时任务中
从而验证存储过程可以周期性调用。
1.create table test1405job(
id number primary key,
name varchar2(30)
);
2.create sequence test1405job_id;
3.create or replace procedure pro1405job
is
begin
insert into test1405job values(
test1405job_id.nextval,
'test'||test1405job_id.currval);
commit;
end;
/
4.写一个匿名块 把任务提交给系统
declare
jobno binary_integer;
begin
dbms_job.submit(jobno,
'pro1405job();',sysdate,
'sysdate+1/(24*60)');
dbms_output.put_line('jobno='||jobno);
dbms_job.run(jobno);
end;
/
5.select * from test1405job;
6.如何取消定时任务
select job from user_jobs;
begin
dbms_job.remove(1645);
end;
/
16.3 自定义包
在使用包中的数据时 在数据前要加包名。
建立一个包 类似于c中的头文件
create or replace package mypack
is
procedure getmax(x number,
y number);
function getmin(x number,
y number)return number;
end;
/
实现包 类似于c中的实现文件
create or replace package body mypack
is
procedure getmax(x number,
y number)
is
begin
if x<y then
dbms_output.put_line(y);
else
dbms_output.put_line(x);
end if;
end;
function getmin(x number,
y number)return number
is
begin
if x<y then
return x;
end if;
return y;
end;
end;
/
begin
mypack.getmax(1,123);
end;
/
十七.触发器 trigger
17.1 dml级触发器
在进行dml操作时 系统可能相应的操作
做出一些响应。
17.2 语法
create or replace trigger 触发器名
before|after DML on 表名
|for each row
declare
begin
end;
/
17.3 举例
create table emp1405bdl as
select id,first_name name,salary
from s_emp;
create or replace trigger emp1405bdl_tri
after update on emp1405bdl
declare
begin
dbms_output.put_line
('you update emp1405bdl');
end;
/
update emp1405bdl set
salary=salary+100 where id=1;
update emp1405bdl set
salary=salary+100 where id<1;
update emp1405bdl set
salary=salary+100 where id>1;
无论sql语句影响多少行 只触发一次
叫语句级触发器。
sql语句影响多少行 就触发多少次
这叫行级触发器。
create or replace trigger emp1405bdl_tri
after update on emp1405bdl
for each row
declare
begin
dbms_output.put_line(:old.id
||':'||:old.salary);
dbms_output.put_line
('you update emp1405bdl');
dbms_output.put_line(:new.id
||':'||:new.salary);
end;
/
update emp1405bdl set
salary=salary+100 where id=1;
update emp1405bdl set
salary=salary+100 where id<1;
update emp1405bdl set
salary=salary+100 where id>1;
update :old :new
delete :old
insert :new
触发器中不能使用事务控制语句
1+2+3+...+n
设计一个存储过程 传入一个参数代表从
1加到的数 把这个数对应的前n项的和
存入第二个参数中。调用这个存储过程
验证存储过程的功能。
create or replace procedure getNumN
(n number,var_sum out number)
is
begin
var_sum:=0;
for var_i in 1..n loop
var_sum:=var_sum+var_i;
end loop;
end;
/
declare
var_sum number:=0;
begin
getNumN(10,var_sum);
dbms_output.put_line('var_sum='
||var_sum);
end;
/
十五.函数 function
15.1 函数和存储过程的不同
关键字不同 procedure function
函数有返回值类型 和 返回值
过程没有。
调用方式不同 过程可以直接在plsql
中调用,函数必须组成表达式。
15.2 语法
设计一个函数 传入两个整数参数 返回
这两个参数的最大值。
create or replace function funGetMax
(var_x in number,var_y number)
return number
is
begin
if var_x < var_y then
return var_y;
end if;
return var_x;
end;
/
15.3 调用
select text from user_source
where name='FUNGETMAX';
select funGetMax(1,2) from dual;
declare
var_res number:=0;
begin
var_res:=funGetMax(1,123);
dbms_output.put_line(var_res);
end;
/
15.4 设计一个函数 传入两个整数参数
返回两个参数的最大值。并且把两个参数
的和放入第二个参数中。调用这个函数
验证功能。
create or replace function funGetMaxAndSum
(var_x in number,var_y in out number)
return number
is
var_temp number;
begin
var_temp:=var_y;
var_y:=var_x+var_y;
if var_x < var_temp then
return var_temp;
end if;
return var_x;
end;
/
declare
var_y number:=123;
var_res number:=0;
begin
var_res:=funGetMaxAndSum(321,var_y);
dbms_output.put_line(var_y);
dbms_output.put_line(var_res);
end;
/
十六.包 package
16.1 概念
把一组相关的过程 函数 变量 等组织到
一起,然后为这个逻辑结构命名。
16.2 系统提供的包
dbms_output
dbms_output.put_line('hello');
dbms_random
value(low,hig)
select dbms_random.value(1,100)
from dual;
select trunc(
dbms_random.value(1,100))
from dual;
dbms_job 定时调用存储过程
submit(JOB out BINARY_INTEGER
WHAT VARCHAR2
NEXT_DATE DATE
INTERVAL VARCHAR2)
可以把定时调用的任务提交给系统
系统会分配一个任务编号放入job中
what 定时调用的存储过程
第一次程序执行的时间
第二次调用的时间
run(jobno BINARY_INTEGER)
把对应的定时任务执行起来。
建立一张表 对这张表设计一个序列
写一个存储过程 每次可以向表中插入一条
数据。把这个存储过程配置到定时任务中
从而验证存储过程可以周期性调用。
1.create table test1405job(
id number primary key,
name varchar2(30)
);
2.create sequence test1405job_id;
3.create or replace procedure pro1405job
is
begin
insert into test1405job values(
test1405job_id.nextval,
'test'||test1405job_id.currval);
commit;
end;
/
4.写一个匿名块 把任务提交给系统
declare
jobno binary_integer;
begin
dbms_job.submit(jobno,
'pro1405job();',sysdate,
'sysdate+1/(24*60)');
dbms_output.put_line('jobno='||jobno);
dbms_job.run(jobno);
end;
/
5.select * from test1405job;
6.如何取消定时任务
select job from user_jobs;
begin
dbms_job.remove(1645);
end;
/
16.3 自定义包
在使用包中的数据时 在数据前要加包名。
建立一个包 类似于c中的头文件
create or replace package mypack
is
procedure getmax(x number,
y number);
function getmin(x number,
y number)return number;
end;
/
实现包 类似于c中的实现文件
create or replace package body mypack
is
procedure getmax(x number,
y number)
is
begin
if x<y then
dbms_output.put_line(y);
else
dbms_output.put_line(x);
end if;
end;
function getmin(x number,
y number)return number
is
begin
if x<y then
return x;
end if;
return y;
end;
end;
/
begin
mypack.getmax(1,123);
end;
/
十七.触发器 trigger
17.1 dml级触发器
在进行dml操作时 系统可能相应的操作
做出一些响应。
17.2 语法
create or replace trigger 触发器名
before|after DML on 表名
|for each row
declare
begin
end;
/
17.3 举例
create table emp1405bdl as
select id,first_name name,salary
from s_emp;
create or replace trigger emp1405bdl_tri
after update on emp1405bdl
declare
begin
dbms_output.put_line
('you update emp1405bdl');
end;
/
update emp1405bdl set
salary=salary+100 where id=1;
update emp1405bdl set
salary=salary+100 where id<1;
update emp1405bdl set
salary=salary+100 where id>1;
无论sql语句影响多少行 只触发一次
叫语句级触发器。
sql语句影响多少行 就触发多少次
这叫行级触发器。
create or replace trigger emp1405bdl_tri
after update on emp1405bdl
for each row
declare
begin
dbms_output.put_line(:old.id
||':'||:old.salary);
dbms_output.put_line
('you update emp1405bdl');
dbms_output.put_line(:new.id
||':'||:new.salary);
end;
/
update emp1405bdl set
salary=salary+100 where id=1;
update emp1405bdl set
salary=salary+100 where id<1;
update emp1405bdl set
salary=salary+100 where id>1;
update :old :new
delete :old
insert :new
触发器中不能使用事务控制语句
0 0