数据库实验五

实验五要求:

1.创建一个PROFILE文件pTester,设置锁定用户的登录失败次数为3次,会话的总计连接时间60分钟,口令可用天数30天。

2.创建一个新用户Tester,密码为Tester123,缺省表空间是tabspace_????。在tabspace_????表空间中可以使用50M空间,指定环境资源文件为pTester。

3.将角色RESOURCE指派给用户Tester。

4.用EXP和IMP工具将之前创建的major_????表导入到Tester用户下。

5.利用PL/SQL语言,以major_????表为例,编写一个存储过程实现针对单张表的逻辑数据导出功能,要求将给定表的数据转换成SQL语言的Insert语句,表的结构转换成SQL语言的Create Table语句,并保存在文件中。该过程以要导出的表名和保存SQL语句的文件名为参数。


1 创建一个profile文件,限失败三次,连接时间60分钟,口令可用30天

这个把要求已经限制死了,直接创建就好了

1
create profile pTester limit FAILED_LOGIN_ATTEMPTS 3 CONNECT_TIME 60 PASSWORD_LOCK_TIME 30;

2 创建用户并指定资源文件

1
2
select profile, resource_name, limit from dba_profiles order by profile; --查看资源文件和限制
create user Tester identified by Tester123 default tablespace tabspace_J314 quota 50m on tabspace_J314 profile pTester;

3 把角色资源指派给Tester

1
grant resource to Tester;

4用EXP与IMP把之前创建的表导入到Tester下

1
2
3
--先用exp把U_J314下的表导出
exp U_J314/YcYyj1234 tables = (major_J314) file = D:\oracle\test5.dmp
imp Tester/Tester123 file = D:\oracle\test5.dmp tables=(major_J314)

5用PL/SQL写一个单张表输出的过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
![p1](D:\blog\数据库实验五\p1.JPG)create table major_J314 (
MajorNo varchar(20) primary key,
MNAME varchar(50),
loc varchar(20),
mdean varchar(20),
constraint mj_loc
check (loc IN ('主校区', '南校区', '新校区', '铁道校区', '湘雅校区'))
);


create or replace procedure P_table_J314(
tname in char,
fname in char)
is
l_file utl_file.file_type;
v_sql varchar2(100);
v_count number;
begin
l_file := utl_file.fopen('FILEPATH', fname, 'W');
utl_file.put_line(l_file,'create table '||tname);
utl_file.put_line(l_file,'(');
for name in (select column_name, data_type from user_tab_columns where table_name = upper(tname))loop
utl_file.put_line(l_file, ' '||name.column_name||' '||name.data_type||' ');
end loop;
utl_file.put_line(l_file,');');

utl_file.fclose(l_file);
end P_table_J314;
.
/
exec P_table_J314('major_J314', '123.txt')


execute immediate 'select * from '||tname into v_sql
for a in (v_sql)loop
utl_file.put_line(l_file,'insert into '||tname||' values(');

end loop;
v_sql:='select * from ' || tname;
execute immediate v_sql into v_count;
utl_file.put_line(l_file,v_count);
utl_file.put_line(l_file,')');

for a in (select * from major_J314)loop

end loop;


for a in (select * from major_J314)loop
utl_file.put_line(l_file,'insert into '||tname||' values(');
for name in (select column_name from user_tab_columns where table_name = upper(tname))loop
v_sql := name.column_name;
utl_file.put_line(l_file,a.v_sql);
end loop;
utl_file.put_line(l_file,')');
end loop;













utl_file.put_line(l_file,'MajorNo varchar(20) primary key,MNAME varchar(50),loc varchar(20),mdean varchar(20)');
utl_file.put_line(l_file, select 'insert into '||tname||' values('||')');

select dbms_metadata.get_ddl('TABLE','major_J314','Tester') from dual;

utl_file.put_line(l_file, SELECT DBMS_METADATA.GET_DDL('TABLE','DEPT','SCOTT') FROM DUAL;)
select * from cols
WHERE TABLE_name=upper('table_name');