菜单树的设计与实现实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、问题描述
创建table保存具有层次结构的菜单树信息,记录菜单的ID,名称,描述,父菜单(可为空)和可用性(enable/disable),菜单的深度无限制。
二、实验内容及步骤
1.首先以sysdba身份登录数据库,命令为:conn / as sysdba
2.创建用户表空间menu,数据文件为:d:\menu.dbf,大小20M,相关命令如下:
create tablespace menu
datafile 'd:\menu.dbf' size 20M;
3.创建新用户yjmin,默认表空间为新创建的menu表空间,相关命令如下:
create user yjmin
identified by yjmin
default tablespace menu;
4.为新创建用户yjmin授权connect和resource角色;
5.以新创建的用户yjmin登录数据库,命令为:conn yjmin/yjmin;
6.创建序列,自动生成菜单ID,相关命令如下:
create sequence id_seq
start with 1
increment by 1;
7.创建表menu_tab保存菜单信息:
create table menu_tab
(id number primary key,
name varchar2(50) not null,
description varchar2(200),
parent_menu varchar2(50),
available varchar2(10) not null);
8.向表menu_tab中插入菜单数据,以示例数据插入,并提交插入的数据。
9.打开PL/SQL输出信息,命令为:set serveroutput on;
10.创建函数获取菜单ID:
create or replace function get_menu_id
(v_name varchar2)
return number
as
专业计算机科学与技术(数据库方向)年级班级
课程名称大型数据库实验课程实验项目菜单树的设计与实现
实验类型□验证□设计□综合实验时间 2012年5月11日
实验指导老师实验评分
result_id number;
begin
select id into result_id from menu_tab where name=v_name;
return result_id;
exception
when no_data_found then
return 0;
when too_many_rows then
return -1;
end get_menu_id;
/
11.根据输入的菜单名称,输出菜单ID:
declare
v_input menu_%type;
v_menu menu_%type;
begin
v_input := '&菜单名称';
select name into v_menu from menu_tab where name=v_input;
dbms_output.put_line(chr(10)||'该菜单名称的ID如下:');
dbms_output.put_line(chr(10)||'菜单名称:'||v_menu||' '||'ID:'||get_menu_id(v_menu));
exception
when no_data_found then
dbms_output.put_line(chr(10)||'该菜单名称不存在!');
when others then
dbms_output.put_line(chr(10)||'程序出现异常,已结束!');
end;
/
该语句块的运行结果如下:
专业计算机科学与技术(数据库方向)年级班级
课程名称大型数据库实验课程实验项目菜单树的设计与实现
实验类型□验证□设计□综合实验时间 2012年5月11日
实验指导老师实验评分
12.根据输入的菜单名称,输出祖先菜单结构:
declare
type indextable is table of menu_tab.parent_menu%type index by binary_integer;
v_parents indextable;
v_input menu_tab.parent_menu%type;
v_temp menu_tab.parent_menu%type;
v_counter binary_integer :=1;
begin
v_input := '&菜单名称';
v_parents(v_counter) := v_input;
v_temp := v_input;
while v_temp is not null loop
select parent_menu into v_temp from menu_tab where name=v_parents(v_counter);
v_counter := v_counter+1;
v_parents(v_counter) := v_temp;
end loop;
v_counter := v_counter-1;
dbms_output.put_line(chr(10)||'该菜单名称的祖先菜单结构如下:');
dbms_output.put(chr(10));
loop
if v_counter != 1 then
dbms_output.put(v_parents(v_counter)||' - ');
else
dbms_output.put_line(v_parents(v_counter));
end if;
v_counter := v_counter-1;
exit when v_counter = 0;
end loop;
exception
when no_data_found then
dbms_output.put_line(chr(10)||'该菜单名称不存在!');
when others then
dbms_output.put_line(chr(10)||'程序出现异常,已结束!');
end;
/
该语句块的运行结果如下: