Y a-t-il une fonction intégrée pour déterminer l'index (premier) d'un élément dans une collection PL / SQL?
quelque chose comme p>
CREATE FUNCTION get_index ( in_test IN t_test, in_value IN VARCHAR2 ) RETURN PLS_INTEGER AS i PLS_INTEGER; BEGIN i := in_test.FIRST; WHILE( i IS NOT NULL ) LOOP IF( in_test(i) = in_value ) THEN RETURN i; END IF; i := in_test.NEXT(i); END LOOP; RETURN NULL; END get_index;
3 Réponses :
En cas de doute, consultez la documentation;) ( Ici ) résultat: p>
Cela donne le premier et dernier index de tous les éléments, et non le premier index d'un élément avec une valeur spécifique. L'OP veut savoir comment trouver l'index correspondant à la première apparition de, disons, 9 de votre exemple, qui devrait renvoyer l'index numéro 3, avant ou après la suppression.
@Alexpoole: Merci, rien ne reste rien à dire :)
Pas sûr, si cela aide vraiment, ou si vous pensez qu'il est plus élégant:
Merci René. On dirait qu'il n'y a rien d'intégré, donc je pourrais utiliser votre solution. +1 CODE> Mais n'accepte pas encore, puisqu'il ne répond pas vraiment à ma question :)
Je ne pense pas qu'il existe une fonction intégrée qui recherche une collection. Cependant, si vous savez que vous aurez besoin de rechercher une collection beaucoup, vous pouvez créer un index. L'ajout de l'élément à la collection sera un peu plus coûteux, mais à la recherche d'un élément sera une opération O (1) (au lieu de O (n) pour une recherche de force brute). Par exemple, vous pouvez utiliser quelque chose comme ceci:
SQL> DECLARE 2 TYPE t_test IS TABLE OF VARCHAR2(1); 3 TYPE t_test_r IS TABLE OF NUMBER INDEX BY VARCHAR2(1); 4 5 v_test t_test; 6 v_test_r t_test_r; 7 8 FUNCTION get_index(p_test_r t_test_r, 9 p_element VARCHAR2) RETURN NUMBER IS 10 BEGIN 11 RETURN p_test_r(p_element); 12 EXCEPTION 13 WHEN no_data_found THEN 14 RETURN NULL; 15 END get_index; 16 17 PROCEDURE add_element(p_test IN OUT t_test, 18 p_test_r IN OUT t_test_r, 19 p_element VARCHAR2) IS 20 BEGIN 21 p_test.extend; 22 p_test(p_test.count) := p_element; 23 p_test_r(p_element) := least(p_test.count, 24 nvl(get_index(p_test_r, p_element), 25 p_test.count)); 26 END add_element; 27 BEGIN 28 v_test := NEW t_test(); 29 add_element(v_test, v_test_r, 'A'); 30 add_element(v_test, v_test_r, 'B'); 31 add_element(v_test, v_test_r, 'A'); 32 dbms_output.put_line('A: ' || get_index(v_test_r, 'A')); 33 dbms_output.put_line('B: ' || get_index(v_test_r, 'B')); 34 dbms_output.put_line('C: ' || get_index(v_test_r, 'C')); 35 END; 36 / A: 1 B: 2 C: PL/SQL procedure successfully completed