8
votes

Obtenir l'index de l'élément dans la collection PL / SQL

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;


0 commentaires

3 Réponses :


-1
votes

En cas de doute, consultez la documentation;) ( Ici ) xxx

résultat: xxx


2 commentaires

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 :)



10
votes

Pas sûr, si cela aide vraiment, ou si vous pensez qu'il est plus élégant: xxx


1 commentaires

Merci René. On dirait qu'il n'y a rien d'intégré, donc je pourrais utiliser votre solution. +1 Mais n'accepte pas encore, puisqu'il ne répond pas vraiment à ma question :)



3
votes

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


0 commentaires