4)重新利用mike为bill分配create table权限
SQL> grant create table to bill;
Grant succeeded.
·241·
5)利用用户bill创建新的数据表bill_test
SQL> create table bill_test(id number);
Table created.
3.利用with grant option选项,为mike分配表system.customer的select权限的同时,允许其将权限传播给用户bill。
1)利用用户system以及with grant option选择为mike分配system.users的select权限
SQL> grant select on customer to mike with grant option;
Grant succeeded.
2)利用用户mike为bill分配表system.customer的select权限
SQL> grant select on system.customer to bill;
Grant succeeded.
3)利用用户bill查询表system.customer
SQL> select * from customer;
CUSTOMER_ID CUSTOMER_NAME CUSTOMER_PHONE CUSTOMER_ADDRESS ------------------------ ----------------------------- ------------------------------- -------------------------------- 5 耐克010-22798156 朝阳路98号 2 阿迪达斯021-3467521 南京路54号 3 特步0755-2278945 彩田路198号 4 安踏020-2278945 工业大道87号
另外,我们需要注意利用with admin option和with grant option的区别。
with admin option用户分配系统权限,而with grant option用户分配对象权限。
系统权限传播出去之后,即使传播者的权限被收回,也不会影响到它已传播出去的权限。 对象权限则不同,传播者的权限被收回之后,它传播出去的权限,也将尽数收回。
第13章 Oracle数据类型
1.在数据库中创建表test_data(idnumber, name varchar(20), “Name” varchar2(20), “name”varchar2(20)),并查询表中数据。
1)利用create table命令创建数据表test_data,并向其中插入测试数据
SQL> create table test_data(id number, name varchar2(20), \
Table created.
SQL> insert into test_data values(1, 'test', 'test', 'test');
精品文档
· 242·
1 row created.
SQL> commit;
Commit complete.
2)尝试利用select * from test_data来查询表中数据
SQL> select * from test_data;
ID NAME Name name ---------- -------------------- -------------------- ------------- 1 test test test
3)从查询结果可以看出,双引号可以作为列名的标识。
2.在表test_data中,增加三列:test_char char(10), test_varchar varchar(10), test_varchar2 varchar2(10),分别向其中插入固定字符串“data”,查看三者的长度。
1)为表test_data增加三列test_char char(10), test_varchar(10)和test_char2(10)
SQL> alter table test_data add(test_char char(10), test_varchar varchar(10), test_varchar2 varchar2(10));
Table altered.
2)向表test_data中插入测试数据
SQL> insert into test_data(id, test_char, test_varchar, test_varchar2) values(2, 'data', 'data', 'data');
1 row created.
3)查看test_char、test_varchar和test_varchar2的长度
SQL> select id, length(test_char), length(test_varchar), length(test_varchar2) from test_data where id = 2;
ID LENGTH(TEST_CHAR) LENGTH(TEST_VARCHAR) LENGTH(TEST_VARCHAR2) ---------- ---------------------------------- ------------------------------------- -------------------------------------- 2 10 4 4
4)分析三列的长度可知,char类型提供的长度是固定的,而varchar类型的实际长度则是可变的。 3.向表test_data插入一条新的记录,要求test_varchar2列的数据为“Tom&Jerry”。 1)尝试向表test_data直接插入“Tom&Jerry”。
SQL> insert into test_data(id, test_varchar2) values (3, 'Tom&Jerry');
2)此时,Oracle将要求我们输入变量Jerry的值
SQL> insert into test_data(id, test_varchar2) values (3, 'Tom&Jerry'); Enter value for jerry:
这是因为,“&”被当做变量的前导符来处理,“Tom&Jerry”被处理为字符串“Tom”和名为“Jerry”的变量。
3)可以首先关闭会话的define选项,然后向数据库插入特殊字符“&”
SQL> set define off;
SQL> insert into test_data(id, test_varchar2) values (3, 'Tomc&Jerry');
1 row created.
SQL> select * from test_data;
ID NAME Name name TEST_CHAR TEST_VARCH TEST_VARCH 精品文档
---------- ---------- ---------- ---------- ------------------- ------------------- ------------------- 3 Tomc&Jerry
·243·
第14章 Oracle中的函数与表达式
1.Rtrim()、ltrim()和trim()函数默认情况下删除空白符,其实,还可以利用它们删除指定字符。其使用语法为:rtrim(originalString, deleteChar)。尝试利用它们分别删除字符串“000123456000”中的“0”。
1)同时使用rtrim()和ltrim()函数,删除字符串“000123456000”中的“0”
SQL> select ltrim(rtrim('000123456000', '0'), '0') result from dual;
RESULT ------ 123456
2)仅利用trim()函数删除字符串“000123456000”中的“0”
SQL> select trim('0' from '000123456000') result from dual;
RESULT ------ 123456
2.创建表sale_summary(id number, product varchar2(50), sale_quantity number, sale_percent varchar2(10))来存储2011年各个厨具厂商的销售情况。查询sale_percent不是以“%”结尾的数据(代表非法数据)
1)创建测试数据表sale_summary
SQL> create table sale_summary(id number, product varchar2(50), sale_quantity number, sale_percent varchar2(10));
Table created.
2)插入测试数据
SQL> insert into sale_summary values (1, '老板烟机', 340000, '12%');
1 row created.
SQL> insert into sale_summary values (2, '华帝烟机', 170000, '6');
1 row created.
SQL> insert into sale_summary values (3, '樱花烟机', 230000, '8.1%');
1 row created.
SQL> commit; 精品文档
· 244·
Commit complete.
3)查询列sale_percent不是以“%”结尾的数据
SQL> select * from sale_summary where sale_percent not like '%\\%' escape '\\';
ID PRODUCT SALE_QUANTITY SALE_PERCE ---------- ------------------ ----------------------------- ------------------- 2 华帝烟机 170000 6
在字符串“%\\%”中,第一个“%”是通配符,代表任意长度的任意字符;随后的“\\%”代表原义字符“%”;escape '\\'则用来指定转义字符“\\”。
3.ntile(n)是另外一个比较常用的分析函数。该函数的作用是将记录以某个标准平均分为n份。利用ntile(4)将表salary中的员工工资按照由高到低的顺序分为四等。
1)利用ntile将表salary中的员工工资水平分为四等
SQL> select employee_name, salary, ntile(4) over(order by salary desc) salry_level from salary;
EMPLOYEE_NAME SALARY SALRY_LEVEL ------------------------------- ------------------------------------- 刘明 5500 1 张小琴 5000 1 周欣欣 4500 1 武铉 3800 1 刘金龙 3500 2 李云 3500 2 张伦 3200 2 李周宇 3000 3 王静 3000 3 刘军 3000 3 陆军 2800 4 张辉 2500 4 张敏 2300 4
13 rows selected.
2)这里的over(order by salary desc)实际是数据表中的所有数据。ntile函数的窗口函数不能使用窗口子句来进一步限制所选的记录。
第15章 Oracle中的控制语句
1.试用case when语句改写以下语句。
if course = '0' then
dbms_output.put_line('数学'); elsif course = '1' then
dbms_output.put_line('语文'); elsif course = '2' then
dbms_output.put_line('英语'); else 精品文档
dbms_output.put_line('其他'); end if;
·245·
改写后的代码如下所示:
case course when '0' then
dbms_output.put_line('数学'); when '1' then
dbms_output.put_line('语文'); when '2' then
dbms_output.put_line('英语'); others
dbms_output.put_line('其他'); end case;
2.试用无条件循环打印表employees的雇员信息(包括雇员ID、雇员姓名)。
可以遵循声明游标、打开游标、处理游标、关闭游标的顺序来循环处理表students中的所有学生信息。无条件循环可以在循环内部利用exitwhen来指定退出循环的条件。
SQL> set serverout on;
SQL> declare cursor cu_student_id_name is 2 select student_id, student_name 3 from students; 4
5 student_id students.student_id%type;
6 student_name students.student_name%type; 7 begin
8 open cu_student_id_name;
9 fetch cu_student_id_name into student_id, student_name; 10
11 loop
12 dbms_output.put_line(student_id || ':' || student_name); 13 fetch cu_student_id_name into student_id, student_name; 14 exit when cu_student_id_name%notfound; 15 end loop; 16
17 close cu_student_id_name; 18 end; 19 / 1:金瑞 2:钟君 3:王山 4:刘迪 5:钟会 6:张玉 7:柳青 8:胡东 9:商乾 11:王蒙 end;
3.利用while循环来完成上题的功能。
精品文档
21天学通Oracle 课后答案(第三版)



