大型数据库技术实验报告
实验课程: 专业: 姓名: 同组人: 实验 项目 目的 要求 大型数据库技术(Oracle)
班级: 学号: 实验日期:
成绩 实验八 过程、函数和和程序包? ? ? 实验 类型 设计性实验 掌握过程的创建与调用 掌握PL/SQL函数的编写与调用 熟悉程序包的使用 (实验内容及步骤) 【实验步骤】 8.0.实验准备工作:PL/SQL程序文件的编辑与执行 1.使用文档编辑器编辑以下文件,并保存为aa.sql: 2.以scott身份登录,在SQL Plus中执行@aa命令运行程序:
给出运行结果: 8.1.存储过程 1.最简单的存储过程 (1)创建测试表 drop table empl; create table empl( e_id number(5), e_name varchar2(20), e_salary number(8,2) ); (2)创建存储过程 create or replace procedure insert_salary (v_id number,v_name varchar2,v_salary number) is begin insert into empl values (v_id,v_name,v_salary); commit; dbms_output.put_line('数据插入成功'); end; / (3) 执行(调用)存储过程 exec insert_salary(6,'g',2000);
(4)查询执行结果 select * from empl; 给出执行的最后结果: 2.存储过程应用实例:列车购票与退票过程简单模拟 drop table ticket; create table ticket ( trainno varchar2(10), ticketnum varchar2(10), primary key (trainno,ticketnum) ); -- 存储过程声明 create or replace procedure init is begin for i in 1..100 loop insert into ticket values ('1111', to_char(i, '0000')); end loop; for i in 1..100 loop insert into ticket values ('2222', to_char(i, '0000')); end loop; for i in 1..100 loop insert into ticket values ('3333', to_char(i, '0000')); end loop;
commit; end; -- 调用火车的存储过程 begin init(); end; -- 买票的存储过程声明 create or replace procedure sell(trainno varchar2) is t ticket%rowtype; cursor c1(tno varchar2) is select * from ticket where trainno=tno for update; begin if not(trainno = '1111' or trainno = '2222' or trainno = '3333') then DBMS_OUTPUT.PUT_LINE('车次不正确'); return; end if; open c1(trainno); fetch c1 into t; if c1%found then DBMS_OUTPUT.PUT_LINE('您买的是: ' || trainno || '票的' || t.ticketnum || '号票'); delete from ticket where current of c1; commit; else DBMS_OUTPUT.PUT_LINE('没票'); end if; close c1; end; -- 调用买票的存储过程 begin exec sell('1111'); end; --有误,去掉exec -- 创建退票的存储过程 create or replace procedure returnTicket(trainno in varchar2,ticketno in varchar2)
is v_error_code NUMBER; v_error_message VARCHAR2(255); begin if to_number(ticketno)<1 or to_number(ticketno)>100 then DBMS_OUTPUT.PUT_LINE('票号不正确'); return; end if; if not(trainno = '1111' or trainno = '2222' or trainno = '3333') then DBMS_OUTPUT.PUT_LINE('车次不正确'); return; end if; insert into ticket values (trainno, to_char(ticketno,'0000')); commit; DBMS_OUTPUT.PUT_LINE('退票成功,但是要扣除你 的手续费用(嘿嘿嘿嘿...)'); exception when others then v_error_code := SQLCODE; v_error_message := SQLERRM; DBMS_OUTPUT.PUT_LINE('退票失败,失败的原因是:' || v_error_message); end; / set serveroutput on; begin returnTicket ('1111','00001'); end; 给出执行的最后结果: 2.参数的使用:in/out/in out参数 (1) 用两个参数:in ,out 传入一个姓名,输出:某某人你好: create or replace procedure mp(v_in varchar2,v_out out varchar2) is