0
votes

Quelle est la différence entre le début suivie de si et si suivi par commence

Je suis nouveau à PL / SQL. Quelle est la différence entre les deux flux ci-dessous?

  1. commence suivi de si p>

     IF flag= 1  THEN
    BEGIN
          FOR SOME_REC(id)
          LOOP
    
          END LOOP;
    END
    END IF;
    
  2. si suivi du début p>

     BEGIN
     IF flag= 1  THEN
          FOR SOME_REC(id)
          LOOP
    
          END LOOP;
     END IF;
     END
    


2 commentaires

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?


3 Réponses :


1
votes

commencements ... fin Les mots-clés impliquent le point de départ et le point d'extrémité d'un bloc de code comme {} 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.


0 commentaires

1
votes

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é: Begin-Exception-Fin Code> Block dans FORT > La boucle, qui fait la différence. p> xxx pré>

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 > 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>

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 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>


0 commentaires

2
votes

Par sa conception PL / SQL est une langue structurée de bloc avec chaque bloc constitué de 4 composants:

  1. section de déclaration - Facultatif :; Déclarez ou nommé bloc (fonction, procédure, ...)
  2. Section d'exécution - Obligatoire: Commencez
  3. Section d'exception - Facultatif: Exception
  4. Déclaration finale - Obligatoire: Fin

    @ @ 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. xxx

    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 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.


0 commentaires