Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Referência à coleção não inicializada PL/SQL


Em seu procedimento TEST você tem v declarado como um parâmetro OUT - isso significa que o procedimento precisa inicializar a coleção de saída no procedimento (por exemplo, v := T(); ). Mesmo se você alterar o bloco de chamada para inicializar u_t isso não ajudará, pois o u_t coleção não é passada para o procedimento - ela apenas recebe o que o procedimento passa de volta.

Altere seu código da seguinte forma:
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;

Observe que as constantes de string em PL/SQL devem ser colocadas entre aspas simples, não aspas duplas.

Além disso - usar nomes de variáveis ​​semelhantes que têm significados opostos no procedimento e no bloco de chamada apenas aumenta a confusão. Adquira o hábito de usar nomes significativos e você evitará muita confusão mais tarde.

Compartilhe e curta.