sql >> Databasteknik >  >> RDS >> Oracle

Referens till oinitierad samling PL/SQL

I din TEST-procedur har du v deklareras som en OUT-parameter - detta betyder att proceduren behöver initiera utdatasamlingen i proceduren (t.ex. v := T(); ). Även om du ändrar anropsblocket för att initialisera u_t detta hjälper inte, eftersom u_t samlingen skickas inte in i proceduren - den tar bara emot det som proceduren skickar tillbaka ut.

Ändra din kod enligt följande:

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;

Observera att strängkonstanter i PL/SQL måste omges av enkla citattecken, inte dubbla citattecken.

Dessutom - att använda liknande variabelnamn som har motsatt betydelse i proceduren och anropsblocket ökar bara förvirringen. Ta för vana att använda meningsfulla namn så sparar du dig själv mycket förvirring senare.

Dela och njut.



  1. 3 sätt att returnera en sträng med flera utrymmen i SQL Server

  2. Hur man uppdaterar ID i tabell 2 från tabell 1 i Oracle sql

  3. Var kan jag hitta filen my.ini för Windows mysql-server?

  4. PostgreSQL JOIN med array-typ med array-elements ordning, hur implementerar man?