Oracle中错误码收集

 

ORA-22905:无法从非嵌套表项访问行
         说明,该错误可能产生于在使用 table() 函数的时候,传递的参数不是 schema 级别的 table 类型,而是直接在 PL/SQL 块中定义的 table 类型。
ORA-00932:数据类型不一致:应为UDT,但却获得NUMBER
         说明, UDT(User Define Type) 是指用户自定义的类型,如定义了一个 table 或者 Object 。该错误主要产生在将 Oracle 基本类型放入用户自定义的类型而导致的类型不符,产生的错误。如,给一个自定义的类型名 User Object 类型赋值 2 ,就会产生这种错误。如语句: select  a  into n  from  bc_3  where b=1; 其中 n 是用户定义的一个 Object 类型而 a 是一个 number 类型。
ORA-01422:实际返回的行数超出请求的行数
         说明 , 错误意思已经很明显啦,比如语句: select  a  into b from bc_3  where b=1; 条件 b=1 返回了多行,而 b 一次只能存放一个记录字段,所以就会报错。
PLS-00642:SQL语句中不允许使用本地收集类型
        
ORA-06531:引用未初始化的收集
         说明,该错误发生在向一个 UDT table 类型中存放数据时,没有初始化导致。错误示例代码 :

declare
  type numbers is table of number ;
 n numbers;
begin
   n.extend;
   select a   into n( 1 ) from bc_3 where b= 1 ;
 
   for i in 1 .. n.count loop
     dbms_output.put_line(n(i));
   end loop ;
end ;

 
解决办法 1

declare
  type numbers is table of number ;
 n numbers := numbers() ; -- 这一步便对该 table 进行初始化,像 java 吧。
begin
   n.extend;
   select a   into n( 1 ) from bc_3 where b= 1 ;
 
   for i in 1 .. n.count loop
     dbms_output.put_line(n(i));
   end loop ;
end ;

 
解决办法 2 :使用 table 下标自增长添加“ index by binary_integer ”,就不用初始化以及省去每次插入元素都 extend 的苦恼啦!

declare
  type numbers is table of number index by binary_integer ;
 n numbers;
begin
   select a   into n( 1 ) from bc_3 where b= 1 ;
   select a   into n( 2 ) from bc_3 where b= 3 ;
  
   for i in 1 .. n.count loop
     dbms_output.put_line(n(i));
   end loop ;
 
end ;
 

 
ORA-06533:下标超数量
         说明 , 可能产生在像一个 table 类型的变量中插入元素,而没有提前新增一条记录用于存放元素导致。解决办法是用 extend ,新增一行。
         :

declare
  type numbers is table of number ;
 n    numbers := numbers();
begin
    n.extend; -- 这一句加上就不会出错啦
   select into n( 1 ) from bc_3 where b= 1 ;
 
   for i in 1 .. n.count loop
     dbms_output.put_line(n(i));
   end loop ;
end ;

 
 

你可能感兴趣的:(oracle,oracle,职场,收集,错误,休闲)