Коллекция элементларига қиймат бериш
Коллекциянинг муайян элементига ифодали қийматни бериш учун қуйидаги синтаксисдан фойдаланинг:
Коллекция_номи(индекс) := ифода;
Бу ерда ифода коллекция турини тавсифида элемент учун аниқланган турдаги қийматни қайтаради. Агар индекс null ёки бутун турга айлантирилмайдиган бўлса, PL/SQL олдиндан аниқланган VALUE_ERROR номли мустаснони вужудга келтиради. Агар коллекция атомик null бўлса, PL/SQL COLLECTION_IS_NULL номли мустаснони вужудга келтиради. Бир нечта мисоллар келтирамиз:
DECLARE
TYPE NumList IS TABLE OF INTEGER;
nums NumList := NumList(10,20,30);
ints NumList;
...
BEGIN
...
nums(1) := TRUNC(high/low);
nums(3) := nums(1);
nums(2) := ASCII('B');
nums('A') := 40; --VALUE_ERROR содир бўлади
ints(1) := 15; --COLLECTION_IS_NULL содир бўлади
END;
Коллекцияларни яхлит солиштириш
Ичма-ич жойлашган жадваллар ва массивлар атомик null бўлиши мумкин, шу сабабли уларни null бўлиш шартига текшириш мумкин:
DECLARE
TYPE Staff IS TABLE OF Employee;
members Staff;
BEGIN
...
IF members IS NULL THEN ... – шарт TRUE қайтаради;
END;
Аммо, лекин коллекцияларни тенглик ёки тенгсизликка солишитириб бўлмайди. Масалан, қуйидаги IF шарти нотўғри:
DECLARE
TYPE Clientele IS TABLE OF Customer;
group1 Clientele := Clientele(...);
group2 Clientele := Clientele(...);
BEGIN
...
IF group1 = group2 THEN -- компиляция хатолиги вужудга келади
...
END IF;
END;
Ушбу чегара ошкормас солишитиришлар учун ҳам қўлланилади. Масалан, коллекциялар DISTINCT, GROUP BY, ёки ORDER BY рўйхатида қатнашиши мумкин эмас.
Коллекцияларни бошқариш
PL/SQL-да коллекциялар қатор қулайликлар туғдиради. Жумладан, дастурингиз коллекцияларни хотирада сақлаш учун SQL фойдаланиб билади.
Фараз қиламиз SQL*Plus, Course, объект турини қуйидагича аниқладингиз:
SQL> CREATE TYPE Course AS OBJECT (
2 course_no NUMBER(4),
3 title VARCHAR2(35),
4 credits NUMBER(1));
Сўнг, Course объектларини ўз ичида сақловчи TABLE туридаги CourseList номли турини аниқладингиз:
SQL> CREATE TYPE CourseList AS TABLE OF Course;
Ниҳоят, берилганлар базасидаги CourseList турдаги устун қатнашган department жадвали қуйидагича ташкил этилади:
SQL> CREATE TABLE department (
2 name VARCHAR2(20),
3 director VARCHAR2(20),
4 office VARCHAR2(20),
5 courses CourseList)
6 NESTED TABLE courses STORE AS courses_tab;
courses устунидаги ҳар бир элемент ичма-ич жойлашган жадвал бўлиб, берилган бўлим тақдим этадиган курсларни сақлайди. NESTED TABLE жумласи орқали department жадвали ичма-ич жойлашган устунга эга эканлиги белгиланади. Ушбу жумла ичма-ич жойлашган жадвал ва берилганларни сақловчи тизим томонидан ишлаб чиқувчи жадвал номини аниқлайди.
Энди department жадвалини тўлдиришингиз мумкин:
BEGIN
INSERT INTO department
VALUES('Psychology', 'Irene Friedman', 'Fulton Hall 133',
CourseList(Course(1000, 'General Psychology', 5),
Course(2100, 'Experimental Psychology', 4),
Course(2200, 'Psychological Tests', 3),
Course(2250, 'Behavior Modification', 4),
Course(3540, 'Groups and Organizations', 3),
Course(3552, 'Human Factors in Busines', 4),
Course(4210, 'Theories of Learning', 4),
Course(4320, 'Cognitive Processes', 4),
Course(4410, 'Abnormal Psychology', 4)));
INSERT INTO department
VALUES('History', 'John Whalen', 'Applegate Hall 142',
CourseList(Course(1011, 'History of Europe I', 4),
Course(1012, 'History of Europe II', 4),
Course(1202, 'American History', 5),
Course(2130, 'The Renaissance', 3),
Course(2132, 'The Reformation', 3),
Course(3105, 'History of Ancient Greece', 4),
Course(3321, 'Early Japan', 4),
Course(3601, 'Latin America Since 1825', 4),
Course(3702, 'Medieval Islamic History', 4)));
INSERT INTO department
VALUES('English', 'Lynn Saunders', 'Breakstone Hall 205',
CourseList(Course(1002, 'Expository Writing', 3),
Course(2020, 'Film and Literature', 4),
Course(2418, 'Modern Science Fiction', 3),
Course(2810, 'Discursive Writing', 4),
Course(3010, 'Modern English Grammar', 3),
Course(3720, 'Introduction to Shakespeare', 4),
Course(3760, 'Modern Drama', 4),
Course(3822, 'The Short Story', 4),
Course(3870, 'The American Novel', 5)));
END;
Қуйидаги мисолда, Инглиз бўлими томонидан тақдим этилган курслар янгиланади:
DECLARE
new_courses CourseList :=
CourseList(Course(1002, 'Expository Writing', 3),
Course(2020, 'Film and Literature', 4),
Course(2810, 'Discursive Writing', 4),
Course(3010, 'Modern English Grammar', 3),
Course(3550, 'Realism and Naturalism', 4),
Course(3720, 'Introduction to Shakespeare', 4),
Course(3760, 'Modern Drama', 4),
Course(3822, 'The Short Story', 4),
Course(3870, 'The American Novel', 4),
Course(4210, '20th-Century Poetry', 4),
Course(4725, 'Advanced Workshop in Poetry', 5));
BEGIN
UPDATE department
SET courses = new_courses WHERE name = 'English';
END;
Қуйидаги мисолда Физиология Бўлими тақдам этган курсларни локал ичма-ич жойлашган жадвалга олиш намойиш этилган.
DECLARE
psyc_courses CourseList;
BEGIN
SELECT courses INTO psyc_courses FROM department
WHERE name = 'Psychology';
...
END;
Do'stlaringiz bilan baham: |