Oracle
 sql >> Database >  >> RDS >> Oracle

Riferimento alla raccolta non inizializzata PL/SQL

Nella tua procedura di TEST hai v dichiarato come parametro OUT - questo significa che la procedura deve inizializzare la raccolta di output nella procedura (es. v := T(); ). Anche se modifichi il blocco chiamante per inizializzare u_t questo non aiuterà, poiché u_t la raccolta non viene trasferita alla procedura:riceve solo ciò che la procedura restituisce.

Modifica il tuo codice come segue:

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;

Tieni presente che le costanti di stringa in PL/SQL devono essere racchiuse tra virgolette singole, non tra virgolette doppie.

Inoltre, l'utilizzo di nomi di variabili simili che hanno significati opposti nella procedura e nel blocco chiamante non fa che aumentare la confusione. Prendi l'abitudine di usare nomi significativi e ti risparmierai molta confusione in seguito.

Condividi e divertiti.