La solution d'Exercice SQL Corrigé :PL / SQL bloc, curseurs, fonctions stockées




1. Écrire un bloc PL / SQL qui comprend une procédure getCleanerDetails qui accepte un certain nombre de propre et renvoie le nom de nettoyants et de salaire. Le bloc principal devrait appeler la procédure avec le numéro propre '113' et la sortie les détails de cette propres, y compris le salaire qui a été augmenté de 10%.


declare

cNum                     Cleaner.cNo%type;
ccName                                Cleaner.cName%type;
ccSalary                Cleaner.cSalary%type;
status                     boolean;


procedure getCleanerDetails (
CleanerNo            in            Cleaner.cNo%type,
CleanerName      out          Cleaner.cName%type,
CleanerSalary      out          Cleaner.cSalary%type,
status                     out          Boolean) is
begin
select cName,cSalary
into CleanerName, CleanerSalary
from Cleaner c
 where c.cNo= CleanerNo;
status :=true;
exception
when no_data_found then
status :=false;
end;
               
begin
--main block
cnum:= '113';
getCleanerDetails(cnum,ccName,ccSalary,status);
if (status) then
      dbms_output.put_line(cNum || '  ' || ccName || '  ' || ccSalary *1.1);
else
      dbms_output.put_line (' Cleaner   ' || cNum ||  '  not  found');
end if;
end;
 

Cette session iSQL * Plus illustre l'exécution:

set serverouput on

113 Vince 3080
PL/SQL procedure successfully completed.
 

Le bloc principal appelle les getCleanerDetails procédure passant cNum '113'. Si le nettoyeur se trouve «statut» est retourné comme vrai et les détails sera affiché sinon faux et un message d'erreur sera affiché. 


2. Maintenant réécrire la question 1) afin que tous les produits de nettoyage dans le tableau Cleaner doivent avoir leur informations affichées avec leurs salaires avec une augmentation de 10%. Le bloc principal comprend désormais un curseur 'cleanerCursor' qui permet le traitement de plusieurs lignes renvoyées par une requête. Exécutez ce bloc de iSQL*Plus . 

Notez que vous ne devez pas utiliser la procédure «getCleanerDetails 'créés dans 1 que cela inclut l'instruction select into. Le cleanerCursor curseur permet le traitement de plusieurs lignes renvoyées par une requête, sélectionnez alors dedans ne peut pas être utilisé pour renvoyer plus d'une ligne. 


declare
cursor cleanerCursor is
select cNo,cName, cSalary
from Cleaner;
cleanerCursor_rec cleanerCursor%rowtype;
                              
begin
open cleanerCursor;
fetch cleanerCursor into cleanerCursor_rec;

while cleanerCursor%found loop
dbms_output.put_line(cleanerCursor_rec.cNo || '  ' || cleanerCursor_rec.cName || '  ' || cleanerCursor_rec.cSalary *1.1);
fetch cleanerCursor into cleanerCursor_rec;
end loop;
close cleanerCursor;
end;


110 John 2805
111 Jean 2750
112 Betty 2640
113 Vince 3080
114 Jay 3300
115 Doug 2200
116 Geeta 4400

PL/SQL procedure successfully completed.
 

3      Stored Function 
 Créez une fonction stockée appelée getCleanersLocation. Cette fonction prend comme le numéro de l'entrée d'un nettoyeur et renvoie l'adresse de dépôt de l'aspirateur. Appel  la fonction dans une instruction SQL pour sélectionner le nom et l'emplacement du nettoyant pour un nettoyant particulier.


Create or replace function getCleanersLocation(cleanerNum in Cleaner.cNo%type)
return Depot.dAddress %type as
dLocation             depot.dAddress %type;
begin
select dAddress
into dLocation
from Cleaner c, Depot d
where cNo= cleanerNum
and d.dNo=c.dNo;
return (dLocation);
end;


Function created.

select cName, getCleanersLocation(cNo)  "Address"
from Cleaner
where cNo='110';

CNAME
Address
John
Camden Road