sql >> Database >  >> RDS >> Oracle

Verwijzing naar niet-geïnitialiseerde collectie PL/SQL

In je TEST-procedure heb je v gedeclareerd als een OUT-parameter - dit betekent dat de procedure de uitvoerverzameling in de procedure moet initialiseren (bijv. v := T(); ). Zelfs als u het aanroepende blok wijzigt om u_t te initialiseren dit zal niet helpen, aangezien de u_t collectie wordt niet doorgegeven aan de procedure - het ontvangt alleen wat de procedure weer uitgeeft.

Wijzig uw code als volgt:

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;

Houd er rekening mee dat stringconstanten in PL/SQL tussen enkele aanhalingstekens moeten staan, niet tussen dubbele aanhalingstekens.

Ook - het gebruik van vergelijkbare variabelenamen die tegengestelde betekenissen hebben in de procedure en het aanroepende blok draagt ​​alleen maar bij aan de verwarring. Maak er een gewoonte van om betekenisvolle namen te gebruiken en u bespaart uzelf later veel verwarring.

Deel en geniet.



  1. NodeJS Hoe om te gaan met gelijktijdige verzoeken aan MySQL

  2. Converteer van mysqli_query naar mysqli voorbereide instructie met behulp van de mysql PASSWORD-functie

  3. PHP:MySQL-query dupliceert update zonder reden

  4. ActionScript Date-object maken van MySQL UTC-tijdstempeltekenreeks