sql >> Databáze >  >> RDS >> Oracle

Odkaz na neinicializovanou kolekci PL/SQL

V proceduře TEST máte v deklarován jako parametr OUT – to znamená, že procedura potřebuje inicializovat výstupní kolekci v proceduře (např. v := T(); ). I když změníte blok volání na inicializaci u_t to nepomůže, protože u_t kolekce není předána do procedury – obdrží pouze to, co procedura předá zpět.

Změňte svůj kód následovně:

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;

Mějte prosím na paměti, že řetězcové konstanty v PL/SQL musí být uzavřeny v jednoduchých, nikoli dvojitých uvozovkách.

Také - použití podobných názvů proměnných, které mají opačný význam v proceduře a volajícím bloku, jen přispívá ke zmatku. Zvykněte si používat smysluplná jména a později si ušetříte spoustu zmatků.

Sdílejte a užívejte si.



  1. Vyloučit horní a dolní n řádky v SQL

  2. Získejte polygonové body mysql

  3. Použijte seskupit podle a vraťte identitu řádku

  4. SELECT / GROUP BY - časové úseky (10 sekund, 30 sekund atd.)