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;
3 Réponses :
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;
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?
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 à: p> 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: p> 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. p> p>
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.
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;