Oracle PL/SQL/PL SQL/Table of Char

Материал из SQL эксперт
Перейти к: навигация, поиск

Check if next index value exists.

   <source lang="sql">
   

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.



 </source>
   
  


FIRST, LAST, NEXT, and PRIOR.

   <source lang="sql">
 

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>

 </source>
   
  


Loop backwards over the table

   <source lang="sql">
 

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>

 </source>
   
  


Print an indexed element from the array.

   <source lang="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","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.



 </source>
   
  


Use table of char as an array

   <source lang="sql">

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>


 </source>