http://www.itpub.net/thread-1499223-8-1.html76楼 我创建了如下的表并填充数据:
CREATE TABLE plch_tab (item VARCHAR2 (10))
/
BEGIN
INSERT INTO plch_tab
VALUES ('Keyboard');
INSERT INTO plch_tab
VALUES ('Mouse');
COMMIT;
END;
/
然后我创建了这个函数,从游标变量取得一行数据并返回:
CREATE OR REPLACE FUNCTION plch_getitem ( plch_cur IN SYS_REFCURSOR) RETURN plch_tab.item%TYPE IS lvretval plch_tab.item%TYPE; BEGIN FETCH plch_cur INTO lvretval; RETURN lvretval; END plch_getitem; /
现在我需要写一个程序块来获取表里的数据行,并且显示行数和最后一行的项目名称。下面就是这个接近完成的版本:
DECLARE
lvitem plch_tab.item%TYPE;
test_cur SYS_REFCURSOR;
BEGIN
OPEN test_cur FOR
SELECT * FROM plch_tab ORDER BY item;
/*FETCH*/
DBMS_OUTPUT.put_line ('Count = ' || test_cur%ROWCOUNT);
DBMS_OUTPUT.put_line ('Item = ' || NVL (lvitem, 'NOT SET'));
CLOSE test_cur;
END;
/
下列的选项中哪些可用来代替 /*FETCH*/ 从而使得这个块执行之后,屏幕上可以见到如下输出?Count = 2 Item = Mouse (A)
FETCH test_cur INTO lvitem; lvitem := plch_getitem (test_cur);
SQL> DECLARE
2 lvitem plch_tab.item%TYPE;
3 test_cur SYS_REFCURSOR;
4 BEGIN
5 OPEN test_cur FOR
6 SELECT * FROM plch_tab ORDER BY item;
7
8 FETCH test_cur
9 INTO lvitem;
10 lvitem := plch_getitem(test_cur);
11
12 DBMS_OUTPUT.put_line('Count = ' || test_cur%ROWCOUNT);
13 DBMS_OUTPUT.put_line('Item = ' || NVL(lvitem, 'NOT SET'));
14
15 CLOSE test_cur;
16 END;
17 /
Count = 2
Item = Mouse
PL/SQL procedure successfully completed
SQL>
(B)
lvitem := plch_getitem (test_cur); lvitem := plch_getitem (test_cur);
SQL> DECLARE
2 lvitem plch_tab.item%TYPE;
3 test_cur SYS_REFCURSOR;
4 BEGIN
5 OPEN test_cur FOR
6 SELECT * FROM plch_tab ORDER BY item;
7
8 lvitem := plch_getitem(test_cur);
9 lvitem := plch_getitem(test_cur);
10
11 DBMS_OUTPUT.put_line('Count = ' || test_cur%ROWCOUNT);
12 DBMS_OUTPUT.put_line('Item = ' || NVL(lvitem, 'NOT SET'));
13
14 CLOSE test_cur;
15 END;
16 /
Count = 2
Item = Mouse
PL/SQL procedure successfully completed
SQL>
(C)
lvitem := plch_getitem (test_cur); FETCH test_cur INTO lvitem;
SQL> DECLARE
2 lvitem plch_tab.item%TYPE;
3 test_cur SYS_REFCURSOR;
4 BEGIN
5 OPEN test_cur FOR
6 SELECT * FROM plch_tab ORDER BY item;
7
8 lvitem := plch_getitem(test_cur);
9 FETCH test_cur
10 INTO lvitem;
11
12 DBMS_OUTPUT.put_line('Count = ' || test_cur%ROWCOUNT);
13 DBMS_OUTPUT.put_line('Item = ' || NVL(lvitem, 'NOT SET'));
14
15 CLOSE test_cur;
16 END;
17 /
Count = 2
Item = Mouse
PL/SQL procedure successfully completed
SQL>
(D)
lvitem := plch_getitem (test_cur); FETCH plch_cur INTO lvitem;
SQL> DECLARE
2 lvitem plch_tab.item%TYPE;
3 test_cur SYS_REFCURSOR;
4 BEGIN
5 OPEN test_cur FOR
6 SELECT * FROM plch_tab ORDER BY item;
7
8 lvitem := plch_getitem(test_cur);
9 FETCH plch_cur
10 INTO lvitem;
11
12 DBMS_OUTPUT.put_line('Count = ' || test_cur%ROWCOUNT);
13 DBMS_OUTPUT.put_line('Item = ' || NVL(lvitem, 'NOT SET'));
14
15 CLOSE test_cur;
16 END;
17 /
DECLARE
lvitem plch_tab.item%TYPE;
test_cur SYS_REFCURSOR;
BEGIN
OPEN test_cur FOR
SELECT * FROM plch_tab ORDER BY item;
lvitem := plch_getitem(test_cur);
FETCH plch_cur
INTO lvitem;
DBMS_OUTPUT.put_line('Count = ' || test_cur%ROWCOUNT);
DBMS_OUTPUT.put_line('Item = ' || NVL(lvitem, 'NOT SET'));
CLOSE test_cur;
END;
ORA-06550: 第 9 行, 第 9 列:
PLS-00201: 必须声明标识符 'PLCH_CUR'
ORA-06550: 第 9 行, 第 3 列:
PL/SQL: SQL Statement ignored
SQL>
答案ABC答案说明80楼
10-24答案ABC. 答案D错误因为plch_cur这个名称在函数之外是不可见的。 REF CURSOR作为IN参数(不需要定义为IN OUT),在FETCH之后游标仍然会前移,所以你调用之后再FETCH会取到下一行。
