![](/img/trans.png)
[英]How to automatically display output of all SQL statements inside anonymous PL/SQL block
[英]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”表中的記錄。 該程序必須執行以下任務。
聲明所需的類型和變量以存儲員工姓名和工資信息。
使用循環來檢索“ emp”表中記錄的前10個“ ename”和“ sal”值,並存儲在兩個包含10個元素的變量數組中。
使用另一個循環以相反的順序顯示“ 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.