Oracle
 sql >> база данни >  >> RDS >> Oracle

Препратка към неинициализирана колекция PL/SQL

Във вашата TEST процедура имате v деклариран като OUT параметър - това означава, че процедурата трябва да инициализира изходната колекция в процедурата (напр. v := T(); ). Дори ако промените извикващия блок, за да инициализирате u_t това няма да помогне, тъй като u_t колекцията не се предава на процедурата - тя получава само това, което процедурата предава обратно.

Променете кода си, както следва:

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;

Моля, обърнете внимание, че низовите константи в PL/SQL трябва да бъдат затворени в единични, а не в двойни кавички.

Също така - използването на подобни имена на променливи, които имат противоположни значения в процедурата и извикващия блок, само добавя към объркването. Създайте си навик да използвате смислени имена и ще си спестите много объркване по-късно.

Споделяйте и се наслаждавайте.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Проблем при стартиране на Proc - Oracle PL/SQL

  2. Oracle:има ли някаква логическа причина да не се използва паралелно изпълнение с подзаявки в списъка SELECT?

  3. Топ 9 полезни заявки за принтери за приложения на Oracle

  4. Извършване на групови актуализации със съхранени процедури MyBatis и Oracle

  5. Oracle Database12c ORA 01918 и грешка при свързване