好文档 - 专业文书写作范文服务资料分享网站

21天学通Oracle 课后答案(第三版)

天下 分享 时间: 加入收藏 我要投稿 点赞

· 246·

while循环只是在循环开始就指定了循环条件,我们可以利用while(cu_student_id_name%found)循环处理所有游标记录。

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 while(cu_student_id_name%found) loop

12 dbms_output.put_line(student_id || ':' || student_name); 13 fetch cu_student_id_name into student_id, student_name; 14 end loop; 15

16 close cu_student_id_name; 17 end; 18 19 / 1:金瑞 2:钟君 3:王山 4:刘迪 5:钟会 6:张玉 7:柳青 8:胡东 9:商乾 11:王蒙

4.利用for循环计算1~100之间所有奇数的和。

可以利用for i in 1..100 loop来循环处理1至100的所有整数;利用mod(i, 2)=1来判断一个整数是否为奇数。

SQL> declare summary number; 2 begin

3 summary := 0; 4 for i in 1..100 loop 5 if mod(i,2) = 1 then

6 summary := summary + i; 7 end if; 8 end loop;

9 dbms_output.put_line('summary = ' || summary); 10 end; 11 /

summary = 2500

精品文档

·247·

第16章 SQL查询

1.在表students中,利用group by 字句,获得同名学生的信息:student_name——学生姓名, student_age——学生年龄, student——同名学生数。

要获得同名学生信息,首先要对表students的记录,按照student_name分组,然后利用having子句进一步筛选各个分组。

SQL> select student_name, count(1) 2 from students

3 group by student_name 4 having count(1) > 1;

2.利用左联接从表students与表student_course中获得学生与所选课程的信息(student_name, course)。

1)首先创建测试表studet_course,并插入测试数据

SQL> create table student_course(student_id number, course varchar2(20));

Table created.

SQL> insert into student_course values(1, '英语'); SQL> insert into student_course values(2, '数学'); SQL> insert into student_course values(2, '语文'); SQL> insert into student_course values(3, '数学'); SQL> commit;

2)因为学生并不一定有选定的课程,所以学生表要作为左联接的基表,SQL语句及执行结果如下所示

SQL> select s.student_name, c.course 2 from students s, student_course c 3 where s.student_id = c.student_id(+) 4 /

STUDENT_NAME COURSE ------------------------ -------------------- 金瑞英语 钟君数学 钟君语文 王山数学 钟会 胡东 王蒙 张玉 柳青 刘迪 商乾

3.利用connect by从表market中获得中国市场及以下的所有子市场信息。

欲获得中国市场下的所有子市场,那么start with market_name应该从“中国”开始;获得下一条记

精品文档

· 248·

录的方式为,新记录的parent_market_id等于旧记录的market_id。

SQL> select * from market

2 start with market_name = '中国'

3 connect by prior market_id = parent_market_id 4 /

MARKET_ID MARKET_NAME PARENT_MARKET_ID ------------------ -------------------- ---------------------------------- 5 中国 2 14 北京 5 15 天津 5 16 上海 5

第17章 SQL更新数据

1.创建表owner_table(table_owner varcchar2(50), table_name varchar2(50)),并搜寻数据库中所有表名含有字母“T”的表,将其所有者owner与表名talbe_name信息插入到表owner_table中。 1)利用create table命令创建数据表时,可以直接利用select语句获得的结果集。create table命令与select语句之间利用as关键字关联即可:

SQL> create table owner_table as

2 select owner, table_name from dba_tables 3 where table_name like '%T%' 4 /

Table created.

insert into tmp_students

select (student_seq.nextval, student_name, student_status, student_age);

2)成功创建之后,可以利用desc命令查看新表owner_table的结构

SQL> desc owner_table;

Name Null? Type

----------------------------------------- ---------------- ------------------------- OWNER NOT NULL VARCHAR2(30) TABLE_NAME NOT NULL VARCHAR2(30)

新表owner_table的结构来源于数据源列的名称和数据类型。 3)此时表owner_table中已经成功插入了数据

SQL> select count(*) from owner_table;

COUNT(*) ---------- 1145

2.在PL/SQL Developer中,利用两条update语句更新表test_people的stauts列的内容。两条update语句分别带有和不带where子句,查看PL/SQL Developer所给出的提示有何不同。

1)首先在PL/SQL Developer中利用如下语句更新表test_people的status列

精品文档

update test_people set status = 'CXL'

·249·

PL/SQL Developer将给出如下提示

2)尝试添加where子句,重新更新表test_people的status列

update test_people set status = 'CXL' where id = 1;

此时,PL/SQL Developer将直接更新表的内容,而不进行任何提示。

3)PL/SQL Developer认为,不添加任何where子句,而更新表的所有记录是带有一定风险的操作,因此将给出提示。这也是我们在平时书写update语句与delete语句时尤其需要注意的。

3.首先利用delete语句删除表test_people中的所有数据,接着执行回滚,查看此时表的内容。然后利用truncate语句删除表test_people中的数据,接着执行回滚,查看此时表的内容。比较两次操作的不同。

1)在SQL Plus中删除表test_people中的数据

SQL> delete from test_people;

1 row deleted.

2)执行回滚

SQL> rollback;

Rollback complete.

3)查询此时表中数据 SQL> select * from test_people;

ID NAME STATUS ---------- ---------------- ------------- 1 张三 ACT

4)利用truncate命令删除表中数据

SQL> truncate table test_people;

Table truncated.

5)执行回滚

SQL> rollback;

Rollback complete.

6)查看此时表中数据

SQL> select * from test_people;

no rows selected

7)truncate命令是一个DDL命令,将一次性将表中数据清空。回滚操作对其无效。

第18章 数据库速度优化与数据完整性

精品文档

· 250·

1.利用create index命令在表students的列student_name上创建索引。

SQL> create index idx_student on students(student_name);

Index created.

2.利用create index命令在表students的列student_name和列student_age上创建联合索引。(1)实体完整性

SQL> create index idx_name_age on students(student_name, student_age);

Index created.

3.利用not null关键字为表students的列student_name添加非空约束。 1)将列student_name指定为not null,从而保证其非空

SQL> alter table students modify student_name not null;

Table altered.

2)尝试指定student_name为空

SQL> insert into students(student_id, student_name, student_age) values (100, '', 10); insert into students(student_id, student_name, student_age) values (100, '', 10) * ERROR at line 1:

ORA-01400: cannot insert NULL into (\

由于student_name的非空约束,因此,导致了新增数据操作失败。 4.利用default关键字为表students的列student_age指定默认值0。 1)为列student_age指定默认值0

SQL> alter table students modify student_age default 0;

Table altered..

2)不指定student_age的情况下,向表中插入新的数据

SQL> insert into students(student_id, student_name) values (100, '张三');

1 row created.

3)查看新增数据

SQL> select * from students where student_id = 100;

STUDENT_ID STUDENT_NAMESTUDENT_AGE ----------------- ------------------------ ------------------------- 100 张三 0

第19章 数据一致性与事务管理

1.利用update语句更新表employees中的列salary,为所有员工的工资数目增加100。然后利用rollback回滚,查看此时的工资状况,并体会事务的概念。

1)查看员工目前工资状况

精品文档

21天学通Oracle 课后答案(第三版)

·246·while循环只是在循环开始就指定了循环条件,我们可以利用while(cu_student_id_name%found)循环处理所有游标记录。SQL>declarecursorcu_student_id_nameis2selectstudent_id,student_name3fromstudents;
推荐度:
点击下载文档文档为doc格式
4of240mr4k6x2111f20r4n7xz5ee5l00bj4
领取福利

微信扫码领取福利

微信扫码分享