12
votes

Pour chaque chaîne, exécutez une fonction / procédure

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;


0 commentaires

6 Réponses :


2
votes

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


0 commentaires

-1
votes
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;

2 commentaires

J'ai cela pour le moment. Essayer d'éviter cela: D


Il suffit de faire le point que si vous avez un petit nombre nombre de statique valeurs et que vous voulez simplement répéter une ligne de code simple pour chacun d'eux La solution la plus simple est généralement la meilleure.



5
votes

J'utilise généralement mon propre type de collection, mais vous pouvez utiliser l'intégré sys.dbms_debug_vc2coll xxx

[J'ai mal conditionné Column_name non column_value. Merci pour la correction]


0 commentaires

3
votes

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


0 commentaires

17
votes

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>


1 commentaires

C'est mieux. Désolé poneys :)



6
votes
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;

0 commentaires