Oracle
 sql >> база данни >  >> RDS >> Oracle

Базиран на курсора тип данни на запис с курсор, връщащ множество стойности в базата данни на Oracle

Вече видяхме в предишния урок как да създадете базирана на курсора променлива на тип запис въз основа на обикновен курсор, която връща един ред данни. Сега възниква въпросът тук е дали можем да използваме една и съща променлива тип данни от един запис с курсора, който връща множество реда данни? За да знаете отговора, прочетете и научете как да обработвате множество стойности, върнати от курсора, като използвате променлива тип данни, базирана на един курсор.

Тъй като имаме работа със записи, базирани на курсора, е необходимо малко познаване на курсора. За опростяване и за да направя тази концепция лесна за разбиране, ще използвам прост изричен курсор за демонстрация.

Стъпка 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] за редовни актуализации.

Благодаря и приятен ден!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Определяне на датите на Великден за всяка година в Oracle PLSQL

  2. SYS_GUID() Функция в Oracle

  3. Как да изпълним процедура вътре в пакет в Oracle

  4. Пример за израз на Oracle FOR LOOP SELECT

  5. 6 начина за избор на дублиращи се редове в Oracle