Oracle
 sql >> Base de données >  >> RDS >> Oracle

Référence à la collection non initialisée PL/SQL

Dans votre procédure TEST vous avez v déclaré en tant que paramètre OUT - cela signifie que la procédure doit initialiser la collection de sortie dans la procédure (par exemple, v := T(); ). Même si vous modifiez le bloc d'appel pour initialiser u_t cela n'aidera pas, car le u_t la collection n'est pas transmise à la procédure - elle ne reçoit que ce que la procédure renvoie.

Modifiez votre code comme suit :

CREATE OR REPLACE PROCEDURE TEST ( u IN T, v OUT T) IS
  i NUMBER := u.FIRST;
BEGIN
  v := T();
  v.EXTEND(u.COUNT);

  IF i IS NOT NULL THEN
    LOOP
      v(i) := u(i);
      i := u.NEXT(i);
      EXIT WHEN i IS NULL;
    END LOOP;
  END IF;
END TEST;

DECLARE
  v_t T;
  u_t T;
BEGIN
  v_t := T();
  v_t.EXTEND(2);

  v_t(1) := 'This is test1';
  v_t(2) := 'This is test2';

  TEST(v_t, u_t);

  FOR i IN u_t.FIRST..u_t.LAST LOOP
    DBMS_OUTPUT.PUT_LINE(u_t(i));
  END LOOP;
END;

Veuillez noter que les constantes de chaîne en PL/SQL doivent être placées entre guillemets simples et non entre guillemets doubles.

De plus, l'utilisation de noms de variables similaires qui ont des significations opposées dans la procédure et le bloc d'appel ne fait qu'ajouter à la confusion. Prenez l'habitude d'utiliser des noms significatifs et vous éviterez bien des confusions plus tard.

Partagez et profitez.