如何编写此PL / SQL匿名块以使输出顺序相反?

时间:2017-06-23 16:24:52

标签: sql oracle plsql

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”表中的记录。该程序必须执行以下任务。

  1. 声明所需的类型和变量,以存储员工姓名和工资信息。

  2. 使用循环检索“emp”表中记录的前10个“ename”和“sal”值,存储在10个元素的两个变量数组中。

  3. 使用另一个循环以相反的顺序显示“ename”和“sal”值。

  4. 如前所述,我遇到了第三项任务的问题。

    提前感谢您的帮助。

1 个答案:

答案 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,但我更喜欢行限制条款。