Je suis nouveau à PL / SQL. Quelle est la différence entre les deux flux ci-dessous?
commence suivi de si p>
IF flag= 1 THEN BEGIN FOR SOME_REC(id) LOOP END LOOP; END END IF;
si suivi du début p>
BEGIN IF flag= 1 THEN FOR SOME_REC(id) LOOP END LOOP; END IF; END
3 Réponses :
commencements ... fin code> Les mots-clés impliquent le point de départ et le point d'extrémité d'un bloc de code comme
{} code> et compilateur validera les références locales (localité des références) dans le bloc Outre. Toutefois, des résultats inattendus peuvent être arrivés. P>
La façon dont vous le mettez, sans autre explication de quel problème vous essayez de résoudre (le cas échéant), alors il n'y a pas beaucoup de différence dans ces deux morceaux de code. Les deux vont faire ce qu'ils sont censés faire.
Cependant, j'aimerais dire quelque chose à propos de la 3ème cas que vous n'avez jamais mentionné: Quel serait son but? Dans vos deux exemples, si une exception survient dans em> la boucle, le traitement sera arrêté et la procédure se terminera. P> mais, s'il y a un intérieur em > Cela, vous serez en mesure de traiter tous les enregistrements renvoyés par le curseur. Certains d'entre eux peuvent échouer, c'est vrai, mais vous pourrez procéder à l'exécution. P> Voici un exemple basé sur la table code> EMP code> de Scott; Je vais essayer de diviser Begin-Exception-Fin Code> Block dans FORT > La boucle, qui fait la différence. p>
BEGIN-EXCEPTION-END BLOCK CODE>, il vous permet de capturer une erreur dans la boucle, de le gérer comme vous trouverez le plus approprié (s'il n'y a rien de mieux, logez simplement l'erreur) et MOVE) sur strong> au cycle de boucle suivant. P>
sal code> et
nvl (comm, 0) code> qui aboutira à diviser par zéro em> erreur dans certains cas. P >
SQL> declare
2 l_divided number;
3 begin
4 for cur_r in (select ename, sal, nvl(comm, 0) comm
5 from emp
6 where deptno = 30
7 order by ename
8 )
9 loop
10 begin
11 l_divided := round(cur_r.sal / cur_r.comm);
12 dbms_output.put_line(cur_r.ename ||': ' || l_divided);
13 exception
14 when zero_divide then
15 dbms_output.put_line(cur_r.ename ||': COMM is equal to zero');
16 end;
17 end loop;
18 end;
19 /
ALLEN: 5
BLAKE: COMM is equal to zero
JAMES: COMM is equal to zero
MARTIN: 1
TURNER: COMM is equal to zero
WARD: 3
PL/SQL procedure successfully completed.
SQL>
Par sa conception PL / SQL est une langue structurée de bloc avec chaque bloc constitué de 4 composants: @ @ M. Mr.Af indique que chaque bloc définit la portée des variables. De plus, ces blocs peuvent être imbriqués. Donc, une variable déclarée dans un bloc externe est visible dans ce bloc et tous les blocs imbriqués dans. Sous réserve de la règle selon laquelle les victoires de déclaration les plus proches et les éléments déclarés dans un bloc imbriqué ne sont pas visibles dans des blocs extérieurs. Voir Guru99 pour description complète. Essayez ce qui suit. P> pour vos scénarios spécifiques # 1 Le si et la boucle sont exécutés dans un bloc extérieur (ou uniquement). Bien que # 2, le cas échéant est exécuté dans le bloc extérieur pendant que la boucle fonctionne dans un bloc intérieur. Remarque: # 2 doit strong> avoir un début préalable et la fin si doit être suivi d'une fin - sans eux, vous obtiendrez une erreur de syntaxe de compilation. P> p>
En fait, le début et la fin dans le deuxième exemple ne sont pas nécessaires.
Est le premier exemple d'un bloc exécutable complet ou fait-il partie d'une procédure / une méthode / méthode plus importante?