sql >> Base de Datos >  >> RDS >> Oracle

Referencia a la colección no inicializada PL/SQL

En su procedimiento de PRUEBA tiene v declarado como un parámetro OUT - esto significa que el procedimiento necesita inicializar la colección de salida en el procedimiento (por ejemplo, v := T(); ). Incluso si cambia el bloque de llamada para inicializar u_t esto no ayudará, ya que u_t la colección no se pasa al procedimiento; solo recibe lo que el procedimiento devuelve.

Cambie su código de la siguiente manera:

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;

Tenga en cuenta que las constantes de cadena en PL/SQL deben estar entre comillas simples, no entre comillas dobles.

Además, el uso de nombres de variables similares que tienen significados opuestos en el procedimiento y el bloque de llamada solo aumenta la confusión. Adquiera el hábito de usar nombres significativos y se ahorrará mucha confusión más adelante.

Comparte y disfruta.