Sei sulla pagina 1di 11

Laborator Varray

1. Tipul Table indexat


2. Tipul TABLE neindexat/nested
3. Tipul VARRAY
Declaratia
Atribuirea
Specificarea
1
TABLE indexate
atribute
Count
Exists
First
Last
Prior
Delete delete(i) delete(i,j)
3
Exercitiul 1
SQL> declare
2 type month_va is varray(13) of VARCHAR2(20);
3 v_month_va month_va;
4 v_count_nr number;
5 begin
6 v_month_va:=month_va('A','B','C','D','E','F','G');
7 DBMS_OUTPUT.put_line('Length:'||v_month_va.count);
8
9 v_month_va.extend;
10 v_month_va(v_month_va.last):='Null';
11 DBMS_OUTPUT.put_line('Length:'||v_month_va.count);
12
13 for i in v_month_va.first..v_month_va.last
14 loop
15 DBMS_OUTPUT.put_line('v_month_va(i): '||v_month_va(i));
16 end loop;
17 end;
18 /
Length:7
Length:8
v_month_va(i): A
v_month_va(i): B
v_month_va(i): C
v_month_va(i): D
v_month_va(i): E
v_month_va(i): F
v_month_va(i): G
v_month_va(i): Null

Exercitiul 2
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> -- 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.

Exercitiul 3
SQL>
SQL>
SQL> declare
2 type month_va is varray(13) of VARCHAR2(20);
3 v_month_va month_va;
4 v_count_nr number;
5 begin
6
v_month_va:=month_va('January','February','March','April','May','June','July','August','Septem
ber','October','November','December');
7 DBMS_OUTPUT.put_line('Length:'||v_month_va.count);
8 v_month_va.extend;
10 v_month_va(v_month_va.last):='Null';
11 DBMS_OUTPUT.put_line('Length:'||v_month_va.count);
13 for i in v_month_va.first..v_month_va.last
14 loop
15 select count(*) into v_count_nr from employee
16 where nvl(replace(to_char(start_date,'Month'),' '), 'Null')=v_month_va(i);
17
18 DBMS_OUTPUT.put_line(v_month_va(i)||': '||v_count_nr);
19 end loop;
20 end;
21 /
Length:12
Length:13
January: 1
February: 0
March: 1
April: 0
May: 0
June: 0
July: 2
August: 0
September: 1
October: 1
November: 0
December: 2
Null: 0

PL/SQL procedure successfully completed.

SQL>
SQL>
SQL>
SQL> -- clean the table
SQL> drop table Employee
2 /

Table dropped.

Exercitiul 4
SQL> declare
2 type month_va is varray(13) of VARCHAR2(20);
3 v_month_va month_va;
4 v_count_nr number;
5 begin
6 v_month_va:=month_va('A','B','C','D','E','F','G');
7 DBMS_OUTPUT.put_line('Length:'||v_month_va.count);
8
9 for i in v_month_va.first..v_month_va.last
10 loop
11 DBMS_OUTPUT.put_line('v_month_va(i): '||v_month_va(i));
12 end loop;
13 end;
14 /
Length:7
v_month_va(i): A
v_month_va(i): B
v_month_va(i): C
v_month_va(i): D
v_month_va(i): E
v_month_va(i): F
v_month_va(i): G

count exists
exemplu 5

The COUNT function returns the number of members in a VARRAY.

SQL>
SQL>
SQL> CREATE OR REPLACE TYPE mem_type IS VARRAY(10) of VARCHAR2(15)
2 /

Type created.

SQL>
SQL>
SQL> CREATE TABLE club (Name VARCHAR2(10),
2 Address VARCHAR2(20),
3 City VARCHAR2(20),
4 Phone VARCHAR2(8),
5 Members mem_type)
6 /

Table created.

SQL>
SQL>
SQL>
SQL> INSERT INTO club VALUES ('AL','111 First St.','Mobile',
2 '222-2222', mem_type('Brenda','Richard'));

1 row created.

SQL>
SQL> INSERT INTO club VALUES ('FL','222 Second St.','Orlando',
2 '333-3333', mem_type('Gen','John','Steph','JJ'));

1 row created.

SQL>
SQL>
SQL>
SQL> CREATE OR REPLACE PROCEDURE vartest IS
2 CURSOR fcur IS
3 SELECT city, members FROM club;
4 BEGIN
5 FOR j IN fcur LOOP
6 IF j.members.exists(1) THEN
7 dbms_output.put_line(j.City||' has '|| j.members.count||' members');
8
9 END IF;
10 END LOOP; /* end for j in fcur loop */
11 END vartest;
12 /

Procedure created.

SQL> exec vartest;


Mobile has 2 members
Orlando has 4 members

PL/SQL procedure successfully completed.


SQL>
SQL>
SQL>
SQL> drop table club;

Table dropped.

SQL> drop type mem_type;

Type dropped.

SQL>

Exemplu 6
Exist last

EXISTS returns a Boolean that acknowledges the presence (T) or absence (F) of a
member of a VARRAY.

SQL>
SQL>
SQL> CREATE OR REPLACE TYPE mem_type IS VARRAY(10) of VARCHAR2(15)
2 /

Type created.

SQL>
SQL>
SQL> CREATE TABLE club (Name VARCHAR2(10),
2 Address VARCHAR2(20),
3 City VARCHAR2(20),
4 Phone VARCHAR2(8),
5 Members mem_type)
6 /

Table created.

SQL>
SQL>
SQL>
SQL> INSERT INTO club VALUES ('AL','111 First St.','Mobile',
2 '222-2222', mem_type('Brenda','Richard'));

1 row created.

SQL>
SQL> INSERT INTO club VALUES ('FL','222 Second St.','Orlando',
2 '333-3333', mem_type('Gen','John','Steph','JJ'));

1 row created.
SQL>
SQL>
SQL>
SQL> INSERT INTO club values ('NY','55 Fifth Ave.','NYC',
2 '999-9999',null)
3 SELECT *
4 FROM club
5
SQL>
SQL> CREATE OR REPLACE FUNCTION vs (vlist club.members%type, sub integer)
2 RETURN VARCHAR2
3 IS
4 BEGIN
5 IF vlist.exists(1) THEN
6 IF sub <= vlist.last THEN
7 RETURN vlist(sub);
8 ELSE
9 RETURN 'Less than '||sub||' members';
10 END IF;
11 ELSE
12 RETURN 'No members';
13 END IF;
14 END vs;
15 /

Function created.

SQL> ---The EXISTS function requires an argument to tell which element of the VARRAY is
referred to. In the above function we are saying in the coded if-statement that if there is no
first element, then return "No members." If a first member of the array is present, then the
array is not null and we can look for whichever member is sought (per the value of sub). If
the value of sub is less than the value of the last subscript, then the return of "'Less than '||
sub||' members'" is effected.
SQL>
SQL> SELECT c.name, vs(members,3) member_name
2 FROM club c;

NAME
----------
MEMBER_NAME
------------------------
AL
Less than 3 members

FL
Steph

SQL>
SQL> drop table club;

Table dropped.

SQL> drop type mem_type;


Type dropped.

Exemplu 8
Procedura pentru accesarea elementelor tabloului
SQL> CREATE OR REPLACE TYPE mem_type IS VARRAY(10) of VARCHAR2(15)
2 /

Type created.

SQL>
SQL>
SQL> CREATE TABLE club (Name VARCHAR2(10),
2 Address VARCHAR2(20),
3 City VARCHAR2(20),
4 Phone VARCHAR2(8),
5 Members mem_type)
6 /

Table created.

SQL>
SQL>
SQL>
SQL> INSERT INTO club VALUES ('AL','111 First St.','Mobile',
2 '222-2222', mem_type('Brenda','Richard'));

1 row created.

SQL>
SQL> INSERT INTO club VALUES ('FL','222 Second St.','Orlando',
2 '333-3333', mem_type('Gen','John','Steph','JJ'));

1 row created.

SQL>
SQL>
SQL> CREATE OR REPLACE FUNCTION vs (vlist club.members%type, sub integer)
2 RETURN VARCHAR2
3 IS
4 BEGIN
5 IF sub <= vlist.last THEN
6 RETURN vlist(sub);
7 END IF;
8 RETURN NULL;
9 END vs;
10 /

Function created.

SQL>
SQL> SELECT vs(members,2)
2 FROM club
3 /

VS(MEMBERS,2)
-----------------
Richard
John

SQL> SELECT DECODE(vs(members,3),null,'No members',vs(members,3))


2 FROM club
3 WHERE name IN ('FL', 'MD')
4 /

DECODE(VS(MEMBERS,3),NULL,'NOMEMBERS',VS(MEMBERS,3))
----------------------------------------------------
Steph

SQL>
SQL>
SQL> drop table club;

Table dropped.

SQL> drop type mem_type;

Type dropped.

SQL>

Potrebbero piacerti anche