有奖活动:PL/SQL Challenge 每日一题:2013-3-15 SQL%ROWCOUNT属性

[复制链接]
查看11 | 回复6 | 2008-9-15 01:28:12 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得奥运章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得奥运章一枚。
以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808
http://www.itpub.net/thread-1499223-1-1.html
原始出处:
http://www.plsqlchallenge.com/
作者:Steven Feuerstein
运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品
我创建了这张表:
CREATE TABLE plch_parts
(
partnumINTEGER PRIMARY KEY,
partname VARCHAR2 (100) UNIQUE
)
/
哪些选项在执行之后会显示 "5" ?

(A)
DECLARE
c_insert_count CONSTANT PLS_INTEGER := 5;
BEGIN
FOR indx IN 1 .. c_insert_count
LOOP
INSERT INTO plch_parts
VALUES (indx, 'Part' || indx);
END LOOP;
DBMS_OUTPUT.put_line (SQL%ROWCOUNT);
END;
/

(B)
DECLARE
c_insert_count CONSTANT PLS_INTEGER := 5;
l_counter
PLS_INTEGER := 0;
BEGIN
FOR indx IN 1 .. c_insert_count
LOOP
INSERT INTO plch_parts
VALUES (indx, 'Part' || indx);
l_counter := l_counter + 1;
END LOOP;
DBMS_OUTPUT.put_line (l_counter);
END;
/

(C)
DECLARE
c_insert_count CONSTANT PLS_INTEGER := 5;
l_counter
PLS_INTEGER := 0;
BEGIN
FOR indx IN 1 .. c_insert_count
LOOP
INSERT INTO plch_parts
VALUES (indx, 'Part' || indx);
l_counter := l_counter + SQL%ROWCOUNT;
END LOOP;
DBMS_OUTPUT.put_line (l_counter);
END;
/

(D)
DECLARE
c_insert_count CONSTANT PLS_INTEGER := 5;
BEGIN
FOR indx IN 1 .. c_insert_count
LOOP
INSERT INTO plch_parts
VALUES (indx, 'Part' || indx);
END LOOP;
DBMS_OUTPUT.put_line (c_insert_count);
END;
/


回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
A SQL%ROWCOUNT指的是有多少条受到影响的数据?平时工作中判断SQL是否对数据产生了操作,比如常判断SQL%ROWCOUNT<1那么就INSERT一条进去,或者直接ROLLBACK.在A选项中,INSERT一条数据,明显返回的只是1,所以结果应该是1.
B 第二个变量是一个循环,每次循环+1,经过五次循环之后,输出的是5.
C 第二个变量也是一个循环,只不过这次循环每次加的是SQL%ROWCOUNT,每次插入一条数据之后SQL%ROWCOUNT的值都是1
.因此最后的结果跟B是一样的.
D 直接输出上面定义的常量的值,c_insert_count,所以是5.
答案就是 BCD

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
1楼每天都抢先了啊,不给我们新手表现的机会


回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
......the early bird catch the bug
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案BCD, 2楼得奖。
A: 这个选项显示"1", SQL%ROWCOUNT显示的是最近一次DML的改动行数,不是整个块的改动行数。
B: 逐行插入并且自己做计数器。每次只需增1就好,没必要用SQL%ROWCOUNT。
C: 逐行插入并且自己做计数器。没必要用SQL%ROWCOUNT, 当然用了也没错。
D: 虽然结果正确,但是不推荐,因为写代码的时候通常不知道要循环多少次,而且循环中也可能出现插入失败。

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层



回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行