簡體   English   中英

如何編寫此PL / SQL匿名塊,以便輸出以相反的順序?

[英]How do I write this PL/SQL anonymous block so that the output is in reverse order?

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”值。

如前所述,我對第三項任務有疑問。

感謝您的提前幫助。

使用隱式游標並將記錄分配給關聯數組

聲明一個關聯數組(也稱為按表索引)並分配emp記錄https://docs.oracle.com/database/121/LNPLS/composites.htm#LNPLS99969

當我打10條記錄時,我有一個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.

附錄

-我想我應該使用兩個varray而不是關聯數組(要求2)。 就寫作而言,那本來會更簡單。

-根據評論,我想我可以使用ROWNUM,但我更喜歡行限制子句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM