Oracle 升级后的 ORA-06531

Posted

技术标签:

【中文标题】Oracle 升级后的 ORA-06531【英文标题】:ORA-06531 after Oracle upgrade 【发布时间】:2014-08-08 09:11:42 【问题描述】:

我将数据库从 Oracle 10 升级到 11.2。我面临的问题是我在表格中的几何图形不再起作用。我的 SQL 是:

Select 
   GEOMETRYID, COORDCOUNT, CREATIONDATE, QUALITYID,       
  SDO_UTIL.TO_WKTGEOMETRY(SDO_CS.TRANSFORM(SDO_UTIL.SIMPLIFY(GEOMETRY, 1, 0.0000005), 27700)) as "WKT" 
FROM 
   NWKGEOMETRY 
WHERE 
   DELETIONDATE IS NULL;  
   AND SDO_GEOMETRY.GET_GTYPE(GEOMETRY)=2 AND SDO_UTIL.GETNUMVERTICES(GEOMETRY)>2;

我得到一个错误:

ORA-06531:对未初始化集合的引用

如果我删除 TRANSFORM 函数,那么一切正常。有什么问题?

【问题讨论】:

向我们展示SDO_UTIL.TO_WKTGEOMETRYSDO_CS.TRANSFORMSDO_UTIL.SIMPLIFY 函数 那些不是我的 oracle 函数 您发布的 SQL 语句在语法上不正确。在deletiondate is null 之后和and 子句之前有一个分号。如果您运行查询,三个函数中的哪一个返回NULL 以及哪些行(或多个函数返回NULL)?你是怎么升级的?我们在谈论就地升级吗?出口和进口?还有什么? 【参考方案1】:

这个错误:

ORA-06531: Reference to uninitialized collection

表示你有一个在使用前没有初始化的集合,例如:

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

如您所见,我有ORA-06531错误,那是因为我没有初始化l_emps变量,我必须添加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.

所以看看所有这些 PL/SQL 过程的来源,问题就出在它们身上。

【讨论】:

我理解您的解释,但这些是 Oracle 软件包。此外,如果我安装 Oracle 11.2,则 sql 工作正常,但在从 Oracle 10 升级到 Oracle 11.2 的数据库上则不能。 可能升级不太好

以上是关于Oracle 升级后的 ORA-06531的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在尝试调用过程时得到 ORA-06531: reference to uninitialized collection?

ORA-06531: 引用未初始化的收集 的问题解决

ORACLE跨版本升级

oracle升级PSU补丁

[ORACE] Oracle trace 之二10046事件

[ORACE] Oracle trace 之二10046事件