sql >> Database >  >> RDS >> Oracle

Voorbeelden voor PLSQL-cursors - expliciete, impliciete en ref-cursors

Een cursor fungeert logisch als een aanwijzer naar een resultaat set. U kunt de cursor door de resultatenset bewegen en elke rij verwerken, totdat u vaststelt dat u aan het einde van de resultatenset bent. Er zijn drie soorten syntaxis die aan cursors zijn gekoppeld:de cursor maken, ophalen met de cursor en de cursor sluiten. Daarnaast zijn er een aantal attributen van een cursor die u kunt gebruiken in uw logische vergelijkingen. Hieronder volgen de typen cursors in Oracle:

Expliciete cursors

Expliciete cursors zijn cursors die u declareert en gebruikt.

Impliciete cursors

Met PL/SQL kunt u SQL-instructies, inclusief SELECT-instructies, als onderdeel van uw code opnemen zonder een cursor te declareren, die een impliciete cursor wordt genoemd.

Ref cursors

Een cursor verwijst naar een resultatenset. Met de REF CURSOR kunt u een cursorreferentie doorgeven van de ene PL/SQL-programma-eenheid naar de andere. Met andere woorden, je kunt een variabele maken die een cursor ontvangt en toegang geeft tot de resultatenset, maar in deze blog geef ik voorbeelden voor alleen expliciete en impliciete cursors, ik zal voorbeelden geven voor ref-cursors en Dynamische cursor in een andere blog .Een voorbeeld van een expliciete cursor:DECLARE nemployeeid NUMBER; dstartdatum DATUM; einddatum DATUM; sjobid VARCHAR2 (20); -- declareer cursor CURSOR curjob IS SELECT employee_id, start_date, end_date, job_id FROM hr.job_history;BEGIN OPEN curjob; LOOP FETCH curjob INTO nemployeeid, dstartdate, denddate, sjobid; VERLATEN WANNEER curjob% NOTFOUND; DBMS_OUTPUT.put_line( 'Werknemer' || nemployeeid || 'baan gehad' || sjobid || ' voor ' || (einddatum - dstartdatum) || ' dagen.'); EINDE LUS; CLOSE curjob;END;/Hetzelfde voorbeeld wordt hieronder gegeven voor expliciete cursor, maar met For Loop zijn de For Loop-cursors slimmer omdat het niet nodig is om variabelen te declareren om waarden erin op te halen en het niet nodig is om te openen of te sluiten of om te controleren of de aanwijzer staat aan het einde van de cursor. Hier is het voorbeeld: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( ''Employee ' || jh_rec.employee_id || jh_rec.employee_id ||j '_ had job ' | .job_id || ' voor ' || ( jh_rec.end_date - jh_rec.start_date || ' dagen.')); END LOOP;END;/Een voorbeeld van een impliciete cursor:DECLARE nempno NUMBER; CURSOR curjob IS SELECT employee_id, start_date, end_date, job_id FROM hr.job_history;BEGIN -- onder sql-query is het type impliciete cursor SELECT COUNT ( * ) INTO nempno FROM hr.job_history; DBMS_OUTPUT.put_line ( 'Er zijn ' || nempno || ' werknemersgeschiedenisrecords.'); FOR jh_rec IN curjob LOOP DBMS_OUTPUT.put_line( ''Employee ' || jh_rec.employee_id || ' had baan ' || jh_rec.job_id || ' for ' || ( jh_rec.end_date - jh_rec.start_date || ' dagen.' )); EINDE LUS;END;/
  1. Herschrijven van mysql select om tijd te besparen en tmp naar schijf te schrijven

  2. Hoe kan ik weten of er een SQL-uitzondering is gegenereerd vanwege een schending van een externe sleutel?

  3. MariaDB ROW_COUNT() uitgelegd

  4. cursor.execute(INSERT INTO im_entry.test (+entrym+) WAARDEN ('+p+');)