7
votes

Comment la table ou la vue de la poignée n'existe pas d'exception?

J'ai un ensemble de noms de table, disons 150. Chaque table a mail_id code> colonne, je souhaite maintenant rechercher un mail_id code> dans tout le tableau. Pour cela, j'ai écrit un bloc Plsql. Lorsque je boucle à travers l'ensemble de la table, certaines tables n'existent pas, il y a une exception. J'ai un bloc de manipulation des exceptions pour gérer cette exception. Maintenant, je veux faire boucle une table entière même s'il s'agit d'une exception? Une idée? En fait, mon bloc n'a pas géré cette exception particulière!

declare
my_mail_id varchar2(50):='xyaksj@jsm.com';
tmp_table varchar2(125);
type varchar_collector is table of varchar2(255);
var varchar_collector;
table_does_not_exist exception;  
PRAGMA EXCEPTION_INIT(table_does_not_exist, -00942);

begin

for cntr in (select table_name from user_tables)
    loop

    tmp_table:=cntr.table_name;
    dbms_output.put_line(tmp_table);
        for mail in (select email_address from tmp_table where lower(email_address) like '%my_mail_id%' )
        loop
            dbms_output.put_line(tmp_table);
        end loop;
    end loop;

    exception 
    when no_data_found then 
        dbms_output.put_line('email address not found');

    WHEN table_does_not_exist then 
         dbms_output.put_line('table dose not exists');

    WHEN OTHERS THEN
    --raise_application_error(-20101, 'Expecting at least 1000 tables');
    IF (SQLCODE = -942) THEN
        --DBMS_Output.Put_Line (SQLERRM);
        DBMS_Output.Put_Line ('in exception');--this exception not handled
    ELSE
        RAISE;
    END IF;
end;


0 commentaires

3 Réponses :


-1
votes
try below code...

DECLARE
   foo  BOOLEAN;
BEGIN
   FOR i IN 1..10 LOOP
      IF foo THEN
         GOTO end_loop;
      END IF;
   <<end_loop>>  -- not allowed unless an executable statement follows
   NULL; -- add NULL statement to avoid error
   END LOOP;  -- raises an error without the previous NULL
END;

3 commentaires

Comment cela répond-il à la question de l'OPS?


Op est voulu supprimer l'exception en boucle


Et où est exactement votre bloc de manipulation d'exception?



1
votes

Si vous sélectionnez à partir d'user_tables et que certains d'entre eux n'existent pas, vous essayez probablement d'interroger des tables dans la corbeille (leurs noms commencent BIN $).

Si oui, changez votre Requête à: xxx

Vous devez remplacer votre deuxième curseur par un appel à exécuter immédiatement aussi, construisant la requête en concaténant dans la table_name non seulement en utilisant une variable comme nom de table, et vous pourriez aussi bien construire la requête comme suit: xxx

de cette façon, vous récupérerez un seul enregistrement qui correspond à 0 ou 1 pour indiquer si l'adresse e-mail a été trouvée et Pas besoin de manipulation des erreurs.


4 commentaires

Aucun mec réellement ce n'était pas user_tables ..... juste j'ai dit un exemple !!! C'est une autre table ..


C'est pourquoi nous aimons voir le code actuel - nous ne perdons donc pas notre temps avec des choses comme celle-ci. Ensuite, je suppose que le problème serait que votre requête indique "Sélectionnez Email_Address à partir de TMP_Table", qui est littéralement à la recherche d'une table appelée TMP_TABLE. Vous devez construire la requête en tant que littéral à chaîne et l'exécuter avec exécuter immédiatement.


U signifie que la variable TMP_TABLE n'est pas remplacée sa valeur tout en exécutant la requête droite?


Correct - La chaîne est reconnue par le moteur PL / SQL en tant que SQL et est transmis au moteur SQL tel qu'il est.



4
votes

Il suffit de gérer vos exceptions dans un bloc anonyme à l'intérieur de la boucle.

DECLARE
  my_mail_id VARCHAR2(50) := 'xyaksj@jsm.com';
  tmp_table  VARCHAR2(125);
  TYPE varchar_collector IS TABLE OF VARCHAR2(255);
  var varchar_collector;
  table_does_not_exist EXCEPTION;
  PRAGMA EXCEPTION_INIT(table_does_not_exist, -00942);

BEGIN

  FOR cntr IN (SELECT table_name FROM user_tables)
  LOOP
    BEGIN
      tmp_table := cntr.table_name;
      dbms_output.put_line(tmp_table);
      FOR mail IN (SELECT email_address
                     FROM tmp_table
                    WHERE lower(email_address) LIKE '%my_mail_id%')
      LOOP
        dbms_output.put_line(tmp_table);
      END LOOP;

    EXCEPTION
      WHEN no_data_found THEN
        dbms_output.put_line('email address not found');

      WHEN table_does_not_exist THEN
        dbms_output.put_line('table dose not exists');

      WHEN OTHERS THEN
        --raise_application_error(-20101, 'Expecting at least 1000 tables');
        IF (SQLCODE = -942)
        THEN
          --DBMS_Output.Put_Line (SQLERRM);
          DBMS_Output.Put_Line('in exception'); --this exception not handled
        ELSE
          RAISE;
        END IF;
    END;
  END LOOP;
END;


0 commentaires