J'aimerais boucler dans une liste de chaînes et exécuter une fonction / procédure avec chaque chaîne comme argument.
Quelle est la meilleure alternative au code générique suivant (car ce n'est pas légal): P>
set serveroutput on; begin FOR r IN ('The', 'Quick', 'brown', 'fox') LOOP dbms_output.put_line( r ); END LOOP; end;
6 Réponses :
Utilisation:
WITH list AS ( SELECT 'The' AS col FROM DUAL UNION ALL SELECT 'Quick' FROM DUAL UNION ALL SELECT 'brown' FROM DUAL UNION ALL SELECT 'fox' FROM DUAL) SELECT package.your_function(x.col) FROM list x
set serveroutput on; begin dbms_output.put_line('The'); dbms_output.put_line('Quick'); dbms_output.put_line('brown'); dbms_output.put_line('fox'); end;
J'ai cela pour le moment. Essayer d'éviter cela: D
Il suffit de faire le point que si vous avez un petit nombre i> nombre de statique i> valeurs et que vous voulez simplement répéter une ligne de code simple i> pour chacun d'eux La solution la plus simple est généralement la meilleure.
J'utilise généralement mon propre type de collection, mais vous pouvez utiliser l'intégré sys.dbms_debug_vc2coll [J'ai mal conditionné Column_name non column_value. Merci pour la correction] p> p>
La réponse ici dépend de l'endroit où les cordes proviennent. Dans une langage de base de données non ", vous obtiendriez probablement les chaînes dans un tableau d'une manière en quelque sorte, puis boucle sur le tableau, comme vous l'avez illustré ci-dessus. La question est que la liste des chaînes codées est codée ou la sélectionnez-vous à partir d'une table de base de données?
La solution Ponies OMG fonctionnera, mais cela implique une sélection éventuellement inutile. Vous serez peut-être mieux en utilisant la table ou Varrays de Plsql - comme je l'ai dit, cela dépend de la manière dont vous avez les chaînes dans votre programme que vous devez traiter. Voici un exemple utilisant les tables PLSQL: P>
declare type myarray is table of varchar2(255) index by binary_integer; v_array myarray; begin v_array(v_array.count + 1) := 'The'; v_array(v_array.count + 1) := 'quick'; v_array(v_array.count + 1) := 'brown'; v_array(v_array.count + 1) := 'fox'; for i in 1..v_array.count loop dbms_output.put_line(v_array(i)); end loop; end; /
Juste pour la complétude, une solution PURE PL / SQL.
SQL> desc sys.dbms_debug_vc2coll sys.dbms_debug_vc2coll TABLE OF VARCHAR2(1000) SQL>
C'est mieux. Désolé poneys :)
DECLARE -- 1. declare a list type TYPE STR_LIST_TYPE IS TABLE OF VARCHAR2(15); -- 2. declare the variable of the list V_STR_VALUES STR_LIST_TYPE; -- 3. optional variable to store single values V_STR_VALUE VARCHAR2(15); BEGIN -- 4. initialize the list of values to be iterated in a for-loop V_STR_VALUES := STR_LIST_TYPE('String 1','String 2'); -- 5. iterating over the values FOR INDX IN V_STR_VALUES.FIRST..V_STR_VALUES.LAST LOOP -- 6. accessing the value itself V_STR_VALUE := V_STR_VALUES(INDX); END LOOP; END;