Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Verweis auf nicht initialisierte Sammlung PL/SQL

In Ihrem TEST-Verfahren haben Sie v als OUT-Parameter deklariert - dies bedeutet, dass die Prozedur die Ausgabesammlung in der Prozedur initialisieren muss (z. B. v := T(); ). Auch wenn Sie den aufrufenden Block ändern, um u_t zu initialisieren das wird nicht helfen, da u_t -Sammlung wird nicht an die Prozedur übergeben – sie erhält nur das, was die Prozedur zurückgibt.

Ändern Sie Ihren Code wie folgt:

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;

Bitte beachten Sie, dass String-Konstanten in PL/SQL in einfache Anführungszeichen eingeschlossen werden müssen, nicht in doppelte Anführungszeichen.

Außerdem - die Verwendung ähnlicher Variablennamen, die in der Prozedur und dem aufrufenden Block entgegengesetzte Bedeutungen haben, trägt nur zur Verwirrung bei. Gewöhnen Sie sich an aussagekräftige Namen und ersparen Sie sich später viel Verwirrung.

Teilen und genießen.