PL/SQL procedure successfully completed
·231·
3.利用PL/SQL Developer的Debug功能调试存储过程find_student。 1)在PL/SQL Developer的Procedures下,找到存储过程find_student。 2)在右键菜单中选择【Test】
3)在参数栏内填入要传入的参数,并单击Debug按钮或者按下F9。
4)此时,调试步骤按钮栏将变为可用。
从左至右依次为:
Run(继续执行,直至程序结束,或者下一个断点) Step into(进入存储过程/函数内部)
StepOver(执行当前语句,在下一条语句处停止) Step out(跳出当前存储过程/函数)
Run to next exception(执行直至下次抛出异常) 4)利用这5个按钮,即可进行存储过程的调试。
精品文档
· 232·
第9章 游标
1.声明一个游标cu_sutdnet,并向该游标传递参数studentName,来获得所有与参数同名的学生信息。对该游标依次执行打开、获取、关闭的步骤来依次打印获得的学生信息。
1)声明带有参数的游标时,应将参数列表置于小括号内
declare cursor cu_student_id_name(studentName)
2)声明变量临时存取学生姓名和学号
student_id students.student_id%type; student_name students.student_name%type;
3)打开游标时,传入参数studentName
open cu_student_id_name('张三');
4)获取游标数据
fetch cu_student_id_name into student_id, student_name;
5)循环打印学生信息
while cu_student_id_name %found loop dbms_output.put_line(student_id || ':' || student_name); fetch cu_student_id_name into student_id, student_name; end loop;
6)关闭游标
close cu_student_id_name;
7)执行结果如下
SQL> declare cursor cu_sutdnet(studentName in varchar2) is 2 select student_id, student_name
3 from students where student_name=studentName; 4
5 student_id students.student_id%type;
6 student_name students.student_name%type; 7 begin
8 open cu_sutdnet('张三');
9 fetch cu_sutdnet into student_id, student_name; 10
11 while cu_sutdnet%found loop
12 dbms_output.put_line(student_id || ':' || student_name); 13 fetch cu_sutdnet into student_id, student_name; 14 end loop; 15
16 close cu_sutdnet; 17 end; 18 /
17:张三 18:张三 21:张三
PL/SQL procedure successfully completed 精品文档
·233·
2.声明一个名为studentname的变量,然后利用cursorfor游标来实现习题1的功能。通过修改studentname的值,来模拟传入参数功能。
SQL> begin 2 declare
3 studentname varchar2(20); 4 begin
5 studentname := '张三';
6 for student in (select * from students where student_name = studentname) loop 7 dbms_output.put_line(student.student_id || ':' || 8 student.student_name); 9 end loop; 10 end; 11 end; 12 /
17:张三 18:张三 21:张三
通过修改studentname的值,可以查找特定学生名称的所有信息。
3.创建函数get_student_cursor,返回表students中的所有学生信息的集合 1)利用如下SQL语句创建名为get_student_cursor的函数
SQL> create or replace function get_student_cursor 2 return SYS_REFCURSOR 3 is
4 student_cursor sys_refcursor; 5 begin
6 open student_cursor for select * from students; 7 return student_cursor; 8 end; 9 /
Function created
2)利用返回的游标类型,打印所有学生姓名
SQL> begin
2 declare student_cursor sys_refcursor; 3 student students%rowtype; 4 begin
5 student_cursor := get_student_cursor(); 6 loop
7 fetch student_cursor into student;
8 dbms_output.put_line(student.student_name); 9 exit when (student_cursor%notfound); 10 end loop; 11 end; 12 end; 13 / 王松 精品文档
· 234·
金瑞
钟君 王山 刘迪 钟会 张玉 柳青 胡东 商乾 王蒙 周兵 王云 刘兵 胡玉 张洁 张三 张三 王云 张军 张三 张三
PL/SQL procedure successfully completed
第10章 触发器
1.现有一个海量数据表products(product_id number, product_name varchar2(120)),代表产品表。有一个小数据表popular_prodcuts(id, product_id, product_name),代表那些畅销产品。由于products数据表具有海量数据,因此,popular_prodcuts是一个合理的冗余。但是,现在要求表products中的product_name改变之后,表popular_products中的product_name随之改变。创建一个行级触发器tr_product来实现该功能。
1)创建表products,并插入实例数据
SQL> create table products(product_id number, product_name varchar2(120));
Table created
SQL> insert into products values(1, '海尔冰箱');
1 row inserted
SQL> insert into products values(2, '格力空调');
1 row inserted
SQL> insert into products values(3, '戴尔电脑'); 精品文档
1 row inserted
SQL> commit;
Commit complete
SQL> create table popular_products(id number, product_id number, product_name varchar2(120));
Table created
SQL> insert into popular_products values(1, 2, '格里空调');
1 row inserted
SQL> commit;
Commit complete
·235·
2)在表products上创建触发器tr_product,一旦表products中的产品信息发生了改变,那么将同步更新到表popular_products中。
SQL> create or replace trigger tr_product 2 after update
3 on products for each row 4 begin
5 update popular_products set product_name=:new.product_name where product_id=:new.product_id; 6 end; 7 /
Trigger created
其中,after update代表该触发器是在表products的update动作之后触发;update popular_products set product_name=:new.product_name where product_id=:new.product_id则利用更新表products之后的新的product_name来更新表popular_products中的数据。
3)尝试更新products中的“格力空调”为“格力中央空调”。
SQL> update products set product_name = '格力中央空调' where product_id=2;
1 row updated
SQL> commit;
Commit complete
4)验证两个表中的数据是否一致
SQL> select * from products;
PRODUCT_ID PRODUCT_NAME
-------------------- -------------------------------------------------------------------------------- 1 海尔冰箱
2 格力中央空调 3 戴尔电脑 精品文档
21天学通Oracle 课后答案(第三版)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)