ORA-06531 after Oracle upgrade

前端 未结 1 1947

I upgraded my database from Oracle 10 to 11.2. The problem I face is that my geometry in tables don\'t work any more. My SQL is:



        
1条回答
  •  别那么骄傲
    2021-01-07 08:03

    This error:

    ORA-06531: Reference to uninitialized collection
    

    means that you have a collection that is not initialized before you use it, for example:

    SQL> select banner from v$version;
    
    BANNER
    --------------------------------------------------------------------------------
    Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
    
    SQL> ed
    Wrote file afiedt.buf
    
      1  CREATE OR REPLACE TYPE t_employee AS OBJECT(
      2    id  number,
      3    name VARCHAR2(300),
      4    CONSTRUCTOR FUNCTION t_employee RETURN SELF AS RESULT
      5* )
    SQL> /
    
    Type created.
    
    SQL> ed
    Wrote file afiedt.buf
    
      1* CREATE OR REPLACE TYPE t_employees AS TABLE OF t_employee
    SQL> /
    
    Type created.
    
    SQL> ed
    Wrote file afiedt.buf
    
      1  DECLARE
      2    l_emp t_employee;
      3    l_emps t_employees;
      4  BEGIN
      5    for i in (SELECT employee_id, first_name
      6                FROM employees)
      7    loop
      8      l_emp := t_employee(i.employee_id, i.first_name);
      9      l_emps.extend();
     10      l_emps(l_emps.COUNT) := l_emp;
     11    end loop;
     12    DBMS_OUTPUT.put_line(l_emps(4).name);
     13* END;
    SQL> /
    DECLARE
    *
    ERROR at line 1:
    ORA-06531: Reference to uninitialized collection
    ORA-06512: at line 9
    

    As you can see, I have the ORA-06531 error, that's because I haven't initialized the l_emps variable, I have to add l_emps := t_employees();:

    SQL> ed
    Wrote file afiedt.buf
    
      1  DECLARE
      2    l_emp t_employee;
      3    l_emps t_employees;
      4  BEGIN
      5    l_emps := t_employees();
      6    for i in (SELECT employee_id, first_name
      7                FROM employees)
      8    loop
      9      l_emp := t_employee(i.employee_id, i.first_name);
     10      l_emps.extend();
     11      l_emps(l_emps.COUNT) := l_emp;
     12    end loop;
     13    DBMS_OUTPUT.put_line(l_emps(4).name);
     14* END;
    SQL> /
    David
    
    PL/SQL procedure successfully completed.
    

    So take a look at the sources of all these PL/SQL procedures, the problem is in them.

    0 讨论(0)
提交回复
热议问题