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

Reference til uinitialiseret samling PL/SQL

I din TEST-procedure har du v erklæret som en OUT-parameter - dette betyder, at proceduren skal initialisere outputsamlingen i proceduren (f.eks. v := T(); ). Selv hvis du ændrer opkaldsblokken for at initialisere u_t dette hjælper ikke, da u_t Indsamlingen sendes ikke ind i proceduren - den modtager kun det, som proceduren overfører igen.

Skift din kode som følger:

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;

Bemærk venligst, at strengkonstanter i PL/SQL skal være omgivet af enkelte anførselstegn, ikke dobbelte anførselstegn.

Også - at bruge lignende variabelnavne, som har modsatte betydninger i proceduren, og den kaldende blok øger blot forvirringen. Få for vane at bruge meningsfulde navne, og du sparer dig selv for en masse forvirring senere.

Del og nyd.



  1. Hvordan tilføjer jeg en klynge på en sammensat nøgle?

  2. Stop forespørgsel via pdo

  3. Sådan sletter du poster i DB med mySQL ved hjælp af group by

  4. Skift fra en input-dialogboks til en anden input-dialogboks?