Oracle PL/SQL/PL SQL/Table of Char
Содержание
Check if next index value exists.
SQL>
SQL> DECLARE
2 current VARCHAR2(9 CHAR);
3 element INTEGER;
4
5 TYPE months_varray IS VARRAY(12) OF STRING(9 CHAR);
6 TYPE calendar_table IS TABLE OF VARCHAR2(9 CHAR) INDEX BY VARCHAR2(9 CHAR);
7
8 month MONTHS_VARRAY := months_varray("January","February","March","April");
9
10 calendar CALENDAR_TABLE;
11 BEGIN
12 IF calendar.COUNT = 0 THEN
13 FOR i IN month.FIRST..month.LAST LOOP
14 calendar(month(i)) := TO_CHAR(i);
15 DBMS_OUTPUT.PUT_LINE("Index ["||month(i)||"] is ["||i||"]");
16 END LOOP;
17
18 FOR i IN 1..calendar.COUNT LOOP
19 IF i = 1 THEN
20 current := calendar.FIRST;
21 element := calendar(current);
22 ELSE
23 IF calendar.NEXT(current) IS NOT NULL THEN
24 current := calendar.NEXT(current);
25 element := calendar(current);
26 ELSE
27 EXIT;
28 END IF;
29 END IF;
30
31 DBMS_OUTPUT.PUT_LINE("Index ["||current||"] is ["||element||"]");
32 END LOOP;
33 END IF;
34 END;
35 /
Index [January] is [1]
Index [February] is [2]
Index [March] is [3]
Index [April] is [4]
Index [April] is [4]
Index [February] is [2]
Index [January] is [1]
Index [March] is [3]
PL/SQL procedure successfully completed.
FIRST, LAST, NEXT, and PRIOR.
SQL>
SQL> set serveroutput on
SQL>
SQL> DECLARE
2 TYPE CharTab IS TABLE OF CHAR(1);
3 v_Characters CharTab :=
4 CharTab("M", "a", "d", "a", "m", ",", " ", "I", """", "m", " ", "A", "d", "a", "m");
5
6 v_Index INTEGER;
7 BEGIN
8 v_Index := v_Characters.FIRST;
9 WHILE v_Index <= v_Characters.LAST LOOP
10 DBMS_OUTPUT.PUT(v_Characters(v_Index));
11 v_Index := v_Characters.NEXT(v_Index);
12 END LOOP;
13 DBMS_OUTPUT.NEW_LINE;
14
15 v_Index := v_Characters.LAST;
16 WHILE v_Index >= v_Characters.FIRST LOOP
17 DBMS_OUTPUT.PUT(v_Characters(v_Index));
18 v_Index := v_Characters.PRIOR(v_Index);
19 END LOOP;
20 DBMS_OUTPUT.NEW_LINE;
21 END;
22 /
Madam, I"m Adam
madA m"I ,madaM
PL/SQL procedure successfully completed.
SQL>
SQL>
Loop backwards over the table
SQL>
SQL> set serveroutput on
SQL>
SQL> DECLARE
2 TYPE CharTab IS TABLE OF CHAR(1);
3 v_Characters CharTab :=
4 CharTab("M", "a", "d", "a", "m", ",", " ",
5 "I", """", "m", " ", "A", "d", "a", "m");
6
7 v_Index INTEGER;
8 BEGIN
9 v_Index := v_Characters.LAST;
10 WHILE v_Index >= v_Characters.FIRST LOOP
11 DBMS_OUTPUT.PUT(v_Characters(v_Index));
12 v_Index := v_Characters.PRIOR(v_Index);
13 END LOOP;
14
15 DBMS_OUTPUT.NEW_LINE;
16 END;
17 /
madA m"I ,madaM
PL/SQL procedure successfully completed.
SQL>
SQL>
Print an indexed element from the array.
SQL> DECLARE
2 current VARCHAR2(9 CHAR);
3 element INTEGER;
4
5 TYPE months_varray IS VARRAY(12) OF STRING(9 CHAR);
6 TYPE calendar_table IS TABLE OF VARCHAR2(9 CHAR) INDEX BY VARCHAR2(9 CHAR);
7
8 month MONTHS_VARRAY := months_varray("January","February","March","April","May","June","July","August","September","October","November","December");
9
10 calendar CALENDAR_TABLE;
11 BEGIN
12 IF calendar.COUNT = 0 THEN
13 FOR i IN month.FIRST..month.LAST LOOP
14 calendar(month(i)) := TO_CHAR(i);
15 DBMS_OUTPUT.PUT_LINE("Index ["||month(i)||"] is ["||i||"]");
16 END LOOP;
17
18 FOR i IN 1..calendar.COUNT LOOP
19 IF i = 1 THEN
20 current := calendar.FIRST;
21 element := calendar(current);
22 ELSE
23 IF calendar.NEXT(current) IS NOT NULL THEN
24 current := calendar.NEXT(current);
25 element := calendar(current);
26 ELSE
27 EXIT;
28 END IF;
29 END IF;
30
31 DBMS_OUTPUT.PUT_LINE("Index ["||current||"] is ["||element||"]");
32 END LOOP;
33 END IF;
34 END;
35 /
Index [January] is [1]
Index [February] is [2]
Index [March] is [3]
Index [April] is [4]
Index [May] is [5]
Index [June] is [6]
Index [July] is [7]
Index [August] is [8]
Index [September] is [9]
Index [October] is [10]
Index [November] is [11]
Index [December] is [12]
Index [April] is [4]
Index [August] is [8]
Index [December] is [12]
Index [February] is [2]
Index [January] is [1]
Index [July] is [7]
Index [June] is [6]
Index [March] is [3]
Index [May] is [5]
Index [November] is [11]
Index [October] is [10]
Index [September] is [9]
PL/SQL procedure successfully completed.
Use table of char as an array
SQL>
SQL>
SQL> -- create demo table
SQL> create table Employee(
2 ID VARCHAR2(4 BYTE) NOT NULL,
3 First_Name VARCHAR2(10 BYTE),
4 Last_Name VARCHAR2(10 BYTE),
5 Start_Date DATE,
6 End_Date DATE,
7 Salary Number(8,2),
8 City VARCHAR2(10 BYTE),
9 Description VARCHAR2(15 BYTE)
10 )
11 /
Table created.
SQL>
SQL> -- prepare data
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)
2 values ("01","Jason", "Martin", to_date("19960725","YYYYMMDD"), to_date("20060725","YYYYMMDD"), 1234.56, "Toronto", "Programmer")
3 /
1 row created.
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)
2 values("02","Alison", "Mathews", to_date("19760321","YYYYMMDD"), to_date("19860221","YYYYMMDD"), 6661.78, "Vancouver","Tester")
3 /
1 row created.
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)
2 values("03","James", "Smith", to_date("19781212","YYYYMMDD"), to_date("19900315","YYYYMMDD"), 6544.78, "Vancouver","Tester")
3 /
1 row created.
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)
2 values("04","Celia", "Rice", to_date("19821024","YYYYMMDD"), to_date("19990421","YYYYMMDD"), 2344.78, "Vancouver","Manager")
3 /
1 row created.
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)
2 values("05","Robert", "Black", to_date("19840115","YYYYMMDD"), to_date("19980808","YYYYMMDD"), 2334.78, "Vancouver","Tester")
3 /
1 row created.
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)
2 values("06","Linda", "Green", to_date("19870730","YYYYMMDD"), to_date("19960104","YYYYMMDD"), 4322.78,"New York", "Tester")
3 /
1 row created.
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)
2 values("07","David", "Larry", to_date("19901231","YYYYMMDD"), to_date("19980212","YYYYMMDD"), 7897.78,"New York", "Manager")
3 /
1 row created.
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)
2 values("08","James", "Cat", to_date("19960917","YYYYMMDD"), to_date("20020415","YYYYMMDD"), 1232.78,"Vancouver", "Tester")
3 /
1 row created.
SQL>
SQL>
SQL>
SQL> -- display data in the table
SQL> select * from Employee
2 /
ID FIRST_NAME LAST_NAME START_DAT END_DATE SALARY CITY DESCRIPTION
---- ---------- ---------- --------- --------- ---------- ---------- ---------------
01 Jason Martin 25-JUL-96 25-JUL-06 1234.56 Toronto Programmer
02 Alison Mathews 21-MAR-76 21-FEB-86 6661.78 Vancouver Tester
03 James Smith 12-DEC-78 15-MAR-90 6544.78 Vancouver Tester
04 Celia Rice 24-OCT-82 21-APR-99 2344.78 Vancouver Manager
05 Robert Black 15-JAN-84 08-AUG-98 2334.78 Vancouver Tester
06 Linda Green 30-JUL-87 04-JAN-96 4322.78 New York Tester
07 David Larry 31-DEC-90 12-FEB-98 7897.78 New York Manager
08 James Cat 17-SEP-96 15-APR-02 1232.78 Vancouver Tester
8 rows selected.
SQL>
SQL>
SQL>
SQL> -- Nested loops and labels
SQL>
SQL> DECLARE
2 v_current_month INTEGER := TO_CHAR(SYSDATE,"MM");
3 myNumber INTEGER;
4 TYPE char4list IS TABLE OF CHAR(4);
5 month_list char4list := char4list("Jan","Feb","Mar","Apr","May","June","July","Aug","Sept","Oct","Nov","Dec");
6 day_list char4list := char4list("Sun","Mon","Tues","Wed","Thur","Fri","Sat");
7 BEGIN
8
9 FOR i IN 1..v_current_month LOOP
10 DBMS_OUTPUT.PUT_LINE(month_list(i));
11
12 FOR j IN 1..7 LOOP
13
14 SELECT COUNT(*)
15 INTO myNumber
16 FROM employee
17 WHERE TO_CHAR(Start_Date,"fmYYYYMMD") =
18 TO_CHAR(SYSDATE,"YYYY")||TO_CHAR(i)||TO_CHAR(j);
19
20 DBMS_OUTPUT.PUT_LINE(day_list(j)||" "||myNumber);
21 END LOOP;
22 END LOOP;
23 END;
24 /
Jan
Sun 0
Mon 0
Tues 0
Wed 0
Thur 0
Fri 0
Sat 0
Feb
Sun 0
Mon 0
Tues 0
Wed 0
Thur 0
Fri 0
Sat 0
Mar
Sun 0
Mon 0
Tues 0
Wed 0
Thur 0
Fri 0
Sat 0
Apr
Sun 0
Mon 0
Tues 0
Wed 0
Thur 0
Fri 0
Sat 0
May
Sun 0
Mon 0
Tues 0
Wed 0
Thur 0
Fri 0
Sat 0
June
Sun 0
Mon 0
Tues 0
Wed 0
Thur 0
Fri 0
Sat 0
July
Sun 0
Mon 0
Tues 0
Wed 0
Thur 0
Fri 0
Sat 0
Aug
Sun 0
Mon 0
Tues 0
Wed 0
Thur 0
Fri 0
Sat 0
Sept
Sun 0
Mon 0
Tues 0
Wed 0
Thur 0
Fri 0
Sat 0
PL/SQL procedure successfully completed.
SQL>
SQL>
SQL> -- clean the table
SQL> drop table Employee
2 /
Table dropped.
SQL>
SQL>