Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Odniesienie do niezainicjowanej kolekcji PL/SQL

W Twojej procedurze TEST masz v zadeklarowany jako parametr OUT - oznacza to, że procedura musi zainicjować zbiór danych wyjściowych w procedurze (np. v := T(); ). Nawet jeśli zmienisz blok wywołujący, aby zainicjować u_t to nie pomoże, ponieważ u_t kolekcja nie jest przekazywana do procedury - otrzymuje tylko to, co z powrotem przekazuje procedura.

Zmień swój kod w następujący sposób:

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;

Zwróć uwagę, że stałe łańcuchowe w PL/SQL muszą być ujęte w pojedyncze cudzysłowy, a nie podwójne cudzysłowy.

Również - używanie podobnych nazw zmiennych, które mają przeciwne znaczenia w procedurze i bloku wywołującym tylko zwiększa zamieszanie. Nabierz nawyku używania znaczących nazw, a oszczędzisz sobie później wielu nieporozumień.

Dziel się i ciesz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tworzenie ramki danych pandas z zapytania do bazy danych, które używa zmiennych bind

  2. jak przyspieszyć wybieranie losowych wierszy w Oracle dzięki tabeli z milionami wierszy

  3. Jak uruchomić plik .sql w narzędziu deweloperskim Oracle SQL, aby zaimportować bazę danych?

  4. Poprawka:„wiodąca precyzja interwału jest zbyt mała” w Oracle Database

  5. Słowo kluczowe Oracle „Partition By” i „Row_Number”