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

Примери за PLSQL курсори - явни, неявни и референтни курсори

Курсорът действа логически като указател към набор от резултати. Можете да преместите курсора през набора от резултати, като обработвате всеки ред, докато не определите, че сте в края на набора от резултати. Има три типа синтаксис, свързан с курсорите:създаване на курсора, извличане с курсора и затваряне на курсора. Освен това има редица атрибути на курсора, които можете да използвате във вашите логически сравнения. Следните са видовете курсори в Oracle:

Явни курсори

Явните курсори са курсори, които декларирате и използвате.

Неявни курсори

PL/SQL ви позволява да включвате SQL изрази, включително оператори SELECT, като част от вашия код, без да декларирате курсор, който се нарича имплицитен курсор.

Референтни курсори

Курсорът препраща към набор от резултати. REF CURSOR ви позволява да предавате препратка към курсора от една програмна единица PL/SQL към друга. С други думи, той ви позволява да създадете променлива, която ще получи курсор и ще позволи достъп до нейния набор от резултати, но в този блог давам примери само за явни и неявни курсори, ще дам пример за референтни курсори и Динамичен курсор в друг блог .Пример за изричен курсор:DECLARE nemployeeid NUMBER; dstartdate ДАТА; дендата ДАТА; sjobid VARCHAR2 (20); -- деклариране на курсора CURSOR curjob IS SELECT Employ_id, start_date, end_date, job_id FROM hr.job_history;BEGIN OPEN curjob; LOOP FETCH curjob INTO nemployeeid, dstartdate, denddate, sjobid; ИЗХОД КОГАТО curjob%NOTFOUND; DBMS_OUTPUT.put_line( 'Служител ' || nemployeeid || 'имал работа ' || sjobid || ' за ' || (denddate - dstartdate) || ' дни.'); КРАЙНА ПРИМКА; CLOSE curjob;END;/Същият пример е даден по-долу за изричен курсор, но с For Loop курсорите For Loop са по-интелигентни, тъй като няма нужда да се декларират променливи за извличане на стойности в тях и няма нужда да се отварят или затварят или да се проверява дали показалецът е в края на курсора. Ето примера:DECLARE CURSOR curjob IS SELECT Employee_id, start_date, end_date, job_id FROM hr.job_history;BEGIN FOR jh_rec IN curjob LOOP DBMS_OUTPUT.put_line( ''Служител ' || jh_rec.employee || jh_rec.employee |'| .job_id || ' за ' || ( jh_rec.end_date - jh_rec.start_date || ' дни.')); END LOOP;END;/Пример за неявен курсор:DECLARE nempno NUMBER; CURSOR curjob IS SELECT Employ_id, start_date, end_date, job_id ОТ hr.job_history;BEGIN -- под sql заявката е типът на имплицитния курсор SELECT COUNT ( * ) INTO nempno FROM hr.job_history; DBMS_OUTPUT.put_line ( 'Има ' || nempno || ' записи от историята на служителите.'); FOR jh_rec IN curjob LOOP DBMS_OUTPUT.put_line( ''Служител ' || jh_rec.employee_id || ' имаше работа ' || jh_rec.job_id || ' за ' || ( jh_rec.end_date - jh_da.'|start' дни. )); КРАЙ LOOP;КРАЙ;/
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какъв е правилният синтаксис на JDBC URL, ако се използват портфейли на Oracle?

  2. Предоставяне на права върху Съхранена процедура на друг потребител на Oracle

  3. ORA-00911:невалиден знак

  4. Как да върна ResultSet от съхранена процедура в Oracle?

  5. Oracle Insert чрез Изберете от множество таблици, където една таблица може да няма ред