第11章 过程,函数和触发器
来源:互联网 发布:最强淘宝系统下载 编辑:程序博客网 时间:2024/04/29 11:21
1,建立过程,不带任何参数
create or replace procedure out_teme
is
begin
dbms_output.put_line(systimestamp);
end;
使用execute 调用过程
exec out_time
sql>set serveroutput on
sql>exec out_time
2.为参数传递变量和数据
create or replace procedure add_dept(dno number,dname varchar2 default null loc varchar2 default null) is
begin
insert into dept value(dno,dname,loc);
commit;
exception
when dup_val_on_index then
raise_application_error(-20000,''部门号不能重复');
end;
sql>exec add_dept(50,'sales','new York');
sql>exec add)dept(60);
名称传递
指在调用子程序时指定参数名,并使用关联符号"=>"为其提供相应的数值或变量
sql>exe add_dept(dname=>'salas',dno=>50);
sql>exec add_dept(dno=>60);
组合传递
指在调用子过程时,同时使用位置传递和名称传递
sql>exec add_dept(50,loc=>'new york');
sql>exec add_dept(60,dname=>'sales',loc=>'new york');
函数
返回一个计算结果值的模块,与过程不同,对函数的调用只能是可执行语句的一部分
建立函数,不带任何参数
create or replace function get_user return varchar2 is v_user varchar2(100);
begin
select username into v_user from user_users;
return v_user;
end;
使用变量接收函数返回值
sql>var v1 varchar2(100);
sql>exec:v1:=get_user;
在sql语句中直接调用函数
sql>select get_user from dual;
使用dbms_output调用函数
sql>set serveroutput on
sql>exec dbms_output.put_line('当前数据库用户:'||get_user);
建立函数带有out参数
create or replace function get_info(name varchar2,title out varchar2)return varchar2 as
deptname dept.dname%type;
begin
selecdt A.job,b.dname into title,deptname from emp a,dept b where a.deptno =b.deptno
and upper(a.ename)=upper(name);
return deptname;
exception
when no_data_found then
raise_application_error(-20000,'该雇员不存在');
end;
调用该函数
sql>var job varchar2(20);
sql>var dname varchar2(20);
sql>exec :dname:=get_info('smith',:job);
包
把各种逻辑相关的类型,常量,变量,异常和子程序组合在一起的模式对象
包说明:用于定义包的公用组件,包括常量,变量游标,过程和函数等,定义 的公用组件不仅可以在馆内引用
而且可以由其他子程序引用
包体:包中所有代码的实现,可单独定义私有组件,包括变量,常量过程和函数等,但在印刷体中所定义 的私有组件只能在包体内使用
而不能由其他子程序引用
包初始化
create or replace package body emp_package is
function validate_deptno(v_deptno number) return boolean is v_temp int;
begin
...
end
触发器实例
create trigger trigger_student3
on s
for insert, update,delete
as
begin
raiserror('不得对数据表进行任何修改!',16,10)
end
游标实例
游标用来处理从数据库中检索的多行记录(使用SELECT语句)。利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集。
将在内存中分配一个区域,这就是上下文区。这个区包含了已经处理完的行数、指向被分析语句的指针,整个区是查询语句返回的数据行集。游标就是指向上下文区句柄或指针。
显示游标被用于处理返回多行数据的SELECT 语句,游标名通过CURSOR….IS 语句显示地赋给SELECT 语句。
在PL/SQL中处理显示游标所必需的四个步骤:
1)声明游标;CURSOR cursor_name IS select_statement
2)为查询打开游标;OPEN cursor_name
FETCH cursor_name INTO list_of_variables;
FETCH cursor_name INTO PL/SQL_record;
4)关闭游标。CLOSE cursor_name
注意:在声明游标时,select_statement不能包含INTO子句。当使用显示游标时,INTO子句是FETCH语句的一部分。
1、 显式游标
select语句上 使用显式游标
能明确访问结果集
for循环游标
参数游标
解决多行记录的查询问题
fetch游标
使用隐式游标时,用户无需进行声明、打开及关闭。PL/SQL隐含地打开、处理,然后关掉游标。
…….
SELECT studentNo,studentName
INTO curStudentNo,curStudentName
FROM StudentRecord
WHERE >
上述游标自动打开,并把相关值赋给对应变量,然后关闭。执行完后,PL/SQL变量curStudentNo,curStudentName中已经有了值。
2、 隐式游标
单条sql语句所产生的结果集合
用关键字SQL表示隐式游标
4个属性 %rowcount 影响的记录的行数 整数
%found 影响到了记录 true
%notfound 没有影响到记录 true
%isopen 是否打开 布尔值 永远是false
多条sql语句 隐式游标SQL永远指的是最后一条sql语句的结果
主要使用在update 和 delete语句上
实际操作和例子:
(1)FOR循环游标 (常用的一种游标)
declare
--类型定义
cursor cc is select empno,ename,job,sal
from emp where job = 'MANAGER';
--定义一个游标变量
ccrec cc%rowtype;
begin
--for循环
for ccrec in cc loop
dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);
end loop;
end;
(2) fetch游标
--使用的时候 必须要明确的打开和关闭
declare
--类型定义
cursor cc is select empno,ename,job,sal
from emp where job = 'MANAGER';
--定义一个游标变量
ccrec cc%rowtype;
begin
--打开游标
open cc;
--loop循环
loop
--提取一行数据到ccrec中
fetch cc into ccrec;
--判断是否提取到值,没取到值就退出
--取到值cc%notfound 是false
--取不到值cc%notfound 是true
exit when cc%notfound;
dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);
end loop;
--关闭游标
close cc;
end;
游标的属性4种
%notfound fetch是否提到数据 没有true 提到false
%found fetch是否提到数据 有true 没提到false
%rowcount 已经取出的记录的条数
%isopen 布尔值 游标是否打开
(3)参数游标
按部门编号的顺序输出部门经理的名字
declare
--部门
cursor c1 is select deptno from dept;
--参数游标c2,定义参数的时候
--只能指定类型,不能指定长度
--参数只能出现在select语句=号的右侧
cursor c2(no number,pjob varchar2) is select emp.* from emp
where deptno = no and job=pjob;
c1rec c1%rowtype;
c2rec c2%rowtype;
--定义变量的时候要指定长度
v_job varchar2(20);
begin
--部门
for c1rec in c1 loop
--参数在游标中使用
for c2rec in c2(c1rec.deptno,'MANAGER') loop
dbms_output.put_line(c1rec.deptno||'-'||c2rec.ename);
end loop;
end loop;
end;
(4)引用游标/动态游标
-- select语句是动态的
declare
--定义一个类型(ref cursor)弱类型
type cur is ref cursor;
--强类型(返回的结果集有要求)
type cur1 is ref cursor return emp%rowtype;
--定义一个ref cursor类型的变量
cura cur;
c1rec emp%rowtype;
c2rec dept%rowtype;
begin
DBMS_output.put_line('输出员工') ;
open cura for select * from emp;
loop
fetch cura into c1rec;
exit when cura%notfound;
DBMS_output.put_line(c1rec.ename) ;
end loop ;
DBMS_output.put_line('输出部门') ;
open cura for select * from dept;
loop
fetch cura into c2rec;
exit when cura%notfound;
DBMS_output.put_line(c2rec.dname) ;
- 第11章 过程,函数和触发器
- 第8章 存储过程和触发器
- 存储过程,函数和触发器
- SQLServer_第8章 存储过程和触发器
- 第33章 利用存储过程和触发器进行管理
- 事务、存储过程和触发器和函数
- 存储过程、触发器和用户自定义函数实验2、触发器
- SqlServer触发器、存储过程和函数
- 查看存储过程、函数、视图和触发器
- Mysql 存储过程、函数和触发器
- 触发器、存储过程和函数之拾遗
- mysql中的函数 存储过程和触发器
- 存储过程和函数、视图、触发器
- Oracle中的存储过程,函数和触发器
- Oracle的存储过程、函数和触发器
- 第12章 存储过程和函数
- 过程、函数、程序包、触发器
- 存储过程、函数、触发器
- 关于VC++中FindWindow的学习!
- js格式化插件
- 1021: Fibonacci Again
- Sruts的国际化
- (转载)程序员的十层楼
- 第11章 过程,函数和触发器
- Android横屏竖屏切换
- javascript_获取当前日期以毫秒为单位
- Struts的标签库
- wincc 弹出对话框
- 数据结构-找出距离最短的两点
- STM32的GPIO口的输出:开漏输出和推挽输出
- 二进制与格雷码的转换
- JS获得分辨率