loop循环结构。
looppl/sql
exit when 判断条件;(当判断条件为真时退出)
end loop
例子:用loop输出一年中的每一天;
create table rili
day date
declare
time date;
begintime:=to_date('2014/01/01','yyyy/mm/dd');
loopinsert into rili(day) values(time);
time:=time+1;
exit when time=to_date('2015/01/01','yyyy/mm/dd');
end loop;
commit;
end;2)while_loop循环。
while 条件 loop
sql语句。
end loop;
declare
time date:=to_date('2014/01/01','yyyy/mm/dd');
beginwhile time insert into rili(day) values(time);
commit;
time:=time+1;
end loop;
end;3)数值for_loop循环。
for 计数器 in 低界…高界。
sql语句。
end loop
declare
time date;
num number;
beginfor num in 0..364 loop
time:=to_date('2014/01/01','yyyy/mm/dd')+num;
insert into rili(day) values(time);
commit;
end loop;
end;异常情况处理是用来处理正常执行过程**现为预料的错误事件,使程序遇到错误能够正常运行。
集中常见错误。
no_data_found select into 没有找到数据。
too_many_row select into 返回多行。
zero_divide 试图被清零。
inval id_number 转换一个数字失败。
异常处理结构。
declare
beginsql
exception
when frist_exception then
handle1
when seconde_exception then
handlr2
end; 2.游标。
用游标指代dml sql操作返回的结果集。当对一个数据库的查询结果返回一组结果集时,用游标标注这组结果集以后通过对游标的操作来获取结果集中的数据信息。
游标分为显性游标和**游标。
显性游标有确切的游标声明和操作过程。包括打开游标,取值,关闭游标。
**游标没有明确的游标声明和操作过程。
1. 游标属性(游标名称%属性)
1)%notfound 当最近一次读记录(fetch),成功取到值,此数据为false;以此为结束记录。
2)%found 与notfound相反。
3)%rowfound 显示fetch成功的次数;
2.显性游标的操作过程。
1)有标的定义(cursor 游标名称 is select结果集;)
ps:在制定数据类型时,不能使用长度约束。
2)游标的操作。
open 游标名称;(打开游标)
3)提取游标数据。
fetch 游标名称 into 变量;
4)对该记录进行处理,知道活动集合中没有记录
5)关闭游标。
close 游标名称;
用实现全部输出。
declare
v_empno
v_name
cursor v_emp is select empno,ename from emp;
beginopen v_emp;
loopfetch v_emp into v_empno,v_name;
dbms_'-v_name);
exit when v_emp%notfound;
end loop;
end;删除dept表中dname相同的并且保留deptno最大的。
declare
v_deptno
v_dname
cursor c_dept is select max(deptno),dname from dept group by dname h**ing count(*)1;
beginopen c_dept;
loopfetch c_dept into v_deptno,v_dname;
exit when c_dept%notfound;
delete from dept where dname=v_dname and deptno end loop;
close c_dept;
end;3.隐性游标。
隐性游标:没有使用关键字cursor明确申明的游标。
例如:update emp set ename='new' where empno=7788;
这条sql 更新语句所影响的记录集有一个隐性游标,名称为“sql”。
declare
beginupdate emp set ename='new' where empno=7788;
if sql%notfound then
dbms_'没有找到数据');
elsif sql%found then
dbms_'更新'||sql%rowcount||'条数据');
end if;
end;3.存储过程。
存储过程是一种pl/sql,以命名的数据库对象形式储存数据库中;(将sql和pl/sql命令写成一个存储过程,只需调用存储过程就能得到想要的结果)
ps:1.可以传递参数给存储过程;
2. 存储过程可以有返回值,也可以没有返回值;
3. 存储过程的返回值必须通过参数带回。
1. 创建存储过程的语法。
create [or replace] procedure 《存储过程名称》 [
is|asbegin
exception
end;2. 无参数的存储过程;
例子:在dept表中插入70,‘财务部’,71‘市场部’
1) 创建。
create or replace procedure myproc
asbegin
insert into dept(deptno,dname) values(70,'市场部');
insert into dept(deptno,dname) values(71,'财务部');
commit;
end;2)调用。
在命令窗口输入。
set serveroutput on(输出命令,只需输入一次)
execute myproc()(按enter)
3. 有输入参数的储存过程。
1) in:表示输入参数,用于接收调用程序的值。
2) out:表示输出参数,用于向调用程序返回值。
3) in out:表示既是输入参数,也是输出参数,用于接收调用程序的值,并向调用程序返回值。
若参数没有指定in或out 则默认输入参数。
调用存储过程。
execute 储存过程名称(参数值)
create or replace procedure find_emp(emp_no number)
asempname varchar2(20);
beginselect ename into empname
from emp where empno = emp_no;
dbms_'雇员姓名是'||empname);
exception
when no_data_found then
dbms_ (雇员编号未找到');
end;调用过程。
set serveroutput on
sql> execute find_emp(7788)
4. 有输出参数的存储过程。
create or replace procedure findemp(eno in number, ename out varchar2)
isename_temp varchar2(100);
beginselect ename into ename_temp from emp
where empno = eno;
ename:=ename_temp;
exception
when no_data_found then
dbms_ (雇员未找到');
end;调用过程。
declare
name varchar2(100);
beginfindemp(7788,name);
dbms_end;
高级复习Oracle
数据库 操作练习 高级 oracle 9i 考试时采用 操作方式,后台连接实际的数据库,前台是用网页 的sql plus,因此所创建的数据库对象将保存在数据库中。如果创建已经存在的对象,则会报错,应该先删除该对象再重新创建。要求不使用commit if replace等语句。书写完语句后执行。一般语...
ORACLE高级查询
本章目标 多表查询。联接查询 inner join 内联接 left outer join 左外联接 right outer join 右外联接 full join 全联接 子查询。集合操作。union 联合 union all 联合所有 intersect 交集 minus 减集 一 连接类型。o...
Oracle高级培训纲要
实力成就稳定。技术创造价值4 21 2008 1 oracle 高级培训方案建议书。1.0版 技术顾问 盖国强。实力成就稳定 摘要 本方案为根据用户需求制订的培训方案书,具体内容与用户商定后作为最终培训纲要。用户的学员情况及培训需求 人数大概在30人左右,其中有少半的人具有oracle方面的基础。培...