Вече видяхме в предишния урок как да създадете базирана на курсора променлива на тип запис въз основа на обикновен курсор, която връща един ред данни. Сега възниква въпросът тук е дали можем да използваме една и съща променлива тип данни от един запис с курсора, който връща множество реда данни? За да знаете отговора, прочетете и научете как да обработвате множество стойности, върнати от курсора, като използвате променлива тип данни, базирана на един курсор.
Тъй като имаме работа със записи, базирани на курсора, е необходимо малко познаване на курсора. За опростяване и за да направя тази концепция лесна за разбиране, ще използвам прост изричен курсор за демонстрация.
Стъпка 1:Декларирайте прост изричен курсор
Базиран на курсор тип данни на запис изисква вече създаден курсор. Този курсор ще стане основна база за нашата променлива тип запис. Всички полета на променливата от типа на записа, която е създадена с помощта на този курсор, ще имат същото име и тип данни като тези на колоните, използвани в SELECT-List на курсора.
SET SERVEROUTPUT ON; DECLARE CURSOR cur_RebellionRider IS SELECT first_name, salary FROM employees WHERE employee_id > 200;
За разлика от курсора от предишния урок, който връща един ред данни, този курсор ще върне няколко реда. Всички тези редове ще се състоят от собствено име и заплата на всички служители с идентификационен номер на служител над 200.
Стъпка 2:Декларирайте променлива на типа данни на базата на курсора на запис
Тъй като създадохме курсора, сега всички сме готови да декларираме нашата променлива на запис, използвайки този курсор.
var_emp cur_RebellionRider%ROWTYPE;
Var_emp е променливата от типа на записа и тъй като се основава на курсора cur_RebellionRider, можем с гордост да я наречем променлива от типа на запис, базирана на курсора. Сега трябва да видим дали тази променлива с един запис е в състояние да задържи всички данни, върнати от основния курсор cur_RebellionRider.
Стъпка 3:Инициализирайте променливата Cursor-Record
Както обсъдихме в урока за PL/SQL 34, инициализацията на променлива на запис е процесът на присвояване на някои стойности към нея. В случай на курсори, операторът FETCH-INTO върши тази работа. Но трябва да сме сигурни, че сме следвали правилно жизнения цикъл на курсора.
Ако не знаете какъв е този жизнен цикъл на курсора и стъпките, включени в създаването на курсор, разгледайте този блог на „Въведение в курсора на базата данни“.
BEGIN OPEN cur_RebellionRider; LOOP FETCH cur_RebellionRider INTO var_emp; EXIT WHEN cur_RebellionRider%NOTFOUND; DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary ); END LOOP;--Simple Loop End CLOSE cur_RebellionRider; END;
Горният раздел за изпълнение на блока PL/SQL, който създаваме тук, е обяснен ред по ред във видео урока в моя канал в YouTube. Проверете това.
Значи това е. Това е всичко, което трябва. Сега нека комбинираме всички тези парчета код, които видяхме в различни стъпки по-горе, в един анонимен PL/SQL блок.
Променлива тип данни на базата на курсора запис в базата данни на Oracle
SET SERVEROUTPUT ON; DECLARE CURSOR cur_RebellionRider IS SELECT first_name, salary FROM employees WHERE employee_id > 200; var_emp cur_RebellionRider%ROWTYPE; BEGIN OPEN cur_RebellionRider; LOOP FETCH cur_RebellionRider INTO var_emp; EXIT WHEN cur_RebellionRider%NOTFOUND; DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary); END LOOP; CLOSE cur_RebellionRider; END;
Когато компилирате и стартирате горния код, вие ще получите всички данни, които операторът FETCH-INTO извлече от курсора cur_RebellionRider и съхрани в базираната на курсора запис променлива var_emp. Това означава, че наистина можем да обработваме множество редове данни, използвайки един запис, базиран на курсор.
В моя видео урок за PL/SQL попитах дали можем да опростим този код или има ли някакъв друг начин за изпълнение на същата задача. Отговорът е да, има множество начини за постигане на един и същ резултат и един от тях е чрез използване на „Cursor For-Loop“. Това е специален вид цикъл, който декларира променливата на записа, както и отваря, извлича и затваря основния курсор имплицитно във фонов режим за вас. Можете да прочетете повече Cursor For-Loop тук.
Справочник за SQL Expert 1z0-047 Партньорска връзка
OCA Oracle Database SQL Certified Expert Expert Guide (Изпит 1Z0-047)
Ето кода, направен с помощта на Cursor For-Loop, който е еквивалентен на горния код. Както можете да видите, той е много по-малко сложен с няколко реда кодове (LOC).
SET SERVEROUTPUT ON; BEGIN FOR var_emp IN (SELECT first_name, salary FROM employees WHERE employee_id >200) LOOP DBMS_OUTPUT.PUT_LINE(var_emp.first_name||' '||var_emp.salary); END LOOP; END;
И двата кода ще върнат същия резултат, тъй като и двата изпълняват една и съща задача.
Надяваме се, че ви е харесал този подробен урок за PL/SQL. Моля, не забравяйте да споделите това в социалните си мрежи и да ме тагнете, тъй като всеки месец раздавам стоките на RebellionRider на произволно избран потребител. Следвайте ме и в моите социални медии [Twitter/Facebook/Instagram] за редовни актуализации.
Благодаря и приятен ден!