SET SERVEROUTPUT ON
DECLARE
ENAME VARCHAR2(10);
SAL NUMBER(7,2);
CURSOR C1 IS SELECT ENAME, SAL
FROM EMP
WHERE ROWNUM < 11;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO ENAME, SAL;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(ENAME ||' '|| SAL);
END LOOP;
END;
/
这是输出
KING 5000
BLAKE 2850
CLARK 2450
JONES 2975
MARTIN 1250
ALLEN 1600
TURNER 1500
JAMES 950
WARD 1250
FORD 3000
我无法以相反的顺序显示输出。
作为参考,这是向我提出的问题:
编写一个PL / SQL匿名块,用于处理存储在“emp”表中的记录。该程序必须执行以下任务。
声明所需的类型和变量,以存储员工姓名和工资信息。
使用循环检索“emp”表中记录的前10个“ename”和“sal”值,存储在10个元素的两个变量数组中。
使用另一个循环以相反的顺序显示“ename”和“sal”值。
如前所述,我遇到了第三项任务的问题。
提前感谢您的帮助。
答案 0 :(得分:0)
使用隐式游标并将记录分配给关联数组
声明一个关联数组(也就是表中的索引)并分配emp记录 https://docs.oracle.com/database/121/LNPLS/composites.htm#LNPLS99969
当我点击十条记录时,我有一个if then语句,它以相反的顺序打印出这个关联数组的10条记录。
我包括名义错误处理。
SCOTT@dev>DECLARE
2 TYPE emp_rec_typ IS RECORD (
3 ename emp.ename%TYPE,
4 sal emp.sal%TYPE
5 );
6 TYPE emp_tab_typ IS
7 TABLE OF emp_rec_typ INDEX BY BINARY_INTEGER;
8 n BINARY_INTEGER;
9 emp_tab emp_tab_typ;
10 BEGIN
11 n := 0;
12 FOR emp_rec IN (
13 SELECT
14 ename,
15 sal
16 FROM
17 emp
18 FETCH FIRST 10 ROWS ONLY
19 ) LOOP
20 BEGIN
21 n := n + 1;
22 emp_tab(n) := emp_rec;
23 dbms_output.put_line(emp_rec.ename
24 || ' '
25 || TO_CHAR(emp_rec.sal) );
26
27 IF
28 n = 10
29 THEN
30 dbms_output.put_line('-------------');
31 dbms_output.put_line('reverse order');
32 dbms_output.put_line('-------------');
33 FOR n IN REVERSE 1..10 LOOP
34 dbms_output.put_line(emp_tab(n).ename
35 || ' '
36 || TO_CHAR(emp_tab(n).sal) );
37 END LOOP;
38
39 END IF;
40
41 EXCEPTION
42 WHEN OTHERS THEN
43 dbms_output.put(sqlcode || ' ' || sqlerrm);
44 END;
45 END LOOP;
46
47 END;
48 /
SMITH 800
ALLEN 1600
WARD 1250
JONES 2975
MARTIN 1250
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
TURNER 1500
-------------
reverse order
-------------
TURNER 1500
KING 5000
SCOTT 3000
CLARK 2450
BLAKE 2850
MARTIN 1250
JONES 2975
WARD 1250
ALLEN 1600
SMITH 800
PL/SQL procedure successfully completed.
附录
- 我想我应该使用两个varrays而不是关联数组(要求#2)。这在编写方面会更简单。
- 评论,我想我可以使用ROWNUM,但我更喜欢行限制条款。