2009-10-02 7 views
2

Je travaille dans une grande équipe de développement séparée. Le projet sur lequel je travaille actuellement dispose d'une équipe Oracle DB qui développe les procédures stockées et d'autres composants connexes auxquels notre plate-forme Web J2EE s'adresse.Curseurs fermés - SQL Best Practice

Une chose qui est née du développement est le concept d'un curseur fermé lorsque les résultats ne sont pas trouvés. D'après mon expérience, les curseurs fermés signifient une circonstance exceptionnelle; une erreur de programmation qui n'est pas nécessairement liée aux données. Dans le contexte actuel, cela signifie qu'aucune donnée n'a été trouvée, lorsqu'un vide ensemble de résultats/curseur aurait plus de sens pour moi.

Avec quoi les gens pensent-ils ou ont-ils de l'expérience? N'importe quel développeur SQL Oracle ici qui pourrait faire la lumière devrait-il être faux d'un point de vue conventionnel?

Meilleures pratiques?

À la votre!

Répondre

6

Je suis avec vous. Retourner un jeu de résultats vide me semble le plus logique.

Tout est question de séparation des préoccupations. La récupération de données est un service. Considérant que la gestion des exceptions NO_DATA_FOUND appartient à l'application appelante.

modifier

j'attendre à trouver cursor%NOTFOUND dans une procédure PL/SQL qui processus un curseur ref. Par exemple, une routine PAYROLL peut utiliser une fonction dans le sous-système SALES qui renvoie un curseur de référence de tous les ordres pris par les vendeurs (dans un département donné, pour un trimestre donné, peu importe).

Je m'attendrais à ce que la routine PAYROLL fasse défiler l'ensemble de résultats renvoyé et vérifie cursor%NOTFOUND. Je ne m'attendrais pas à ce que la fonction VENTES le fasse et renvoie un curseur vide s'il n'y a pas de vendeur correspondant. En plus de violer le Principe de Least Surprise, cela signifie aussi que la fonction de récupération fait plus de travail (ouvrir le curseur ref deux fois) ou retourne le mauvais résultat.

SQL> create function get_emps(dno number) return sys_refcursor is 
    2 rc sys_refcursor; 
    3 begin 
    4 open rc for select * from emp where deptno = dno; 
    5 return rc; 
    6 end; 
    7/

Function created. 

SQL> var rc refcursor 
SQL> 
SQL> exec :rc := get_emps(10) 

PL/SQL procedure successfully completed. 

SQL> print rc 

EMPNO ENAME  JOB    MGR HIREDATE SAL COMM DEPTNO 
----- ---------- --------- ---------- ---------- ---- ---- ------ 
7782 BOEHMER  MANAGER   7839 09-06-1981 2450   10 
7839 SCHNEIDER PRESIDENT   17-11-1981 5000   10 
7934 KISHORE  CLERK   7782 23-01-1982 1300   10 

SQL> 
SQL> create or replace function get_emps(dno number) return sys_refcursor is 
    2 rc sys_refcursor; 
    3 lrow emp%rowtype; 
    4 begin 
    5 open rc for select * from emp where deptno = dno; 
    6 fetch rc into lrow; 
    7 if rc%notfound then 
    8  close rc; 
    9 end if; 
10 return rc; 
11 end; 
12/

Function created. 

SQL> exec :rc := get_emps(15) 

PL/SQL procedure successfully completed. 

SQL> print rc 
ERROR: 
ORA-24338: statement handle not executed 


SP2-0625: Error printing variable "rc" 
SQL> exec :rc := get_emps(10) 

PL/SQL procedure successfully completed. 

SQL> print rc 

EMPNO ENAME  JOB    MGR HIREDATE SAL COMM DEPTNO 
----- ---------- --------- ---------- ---------- ---- ---- ------ 
7839 SCHNEIDER PRESIDENT   17-11-1981 5000   10 
7934 KISHORE CLERK   7782 23-01-1982 1300   10 

SQL> 
+0

Merci. Pouvez-vous penser à un exemple où Cursor non trouvé pourrait être approprié? –