关于ORA-30625: method dispatch on NULL SELF argument is disallowed

文章详细解释了在Oracle中遇到关于UDT方法调用的ORA-30625错误,强调了初始化构造函数的重要性。
摘要由CSDN通过智能技术生成


JOB 频繁出现ORA-30625:method dispatch on NULL SELF argument is disallowed。

这篇文章将对此错误进行重现并分析其原因

1. 创建type

CREATE OR REPLACE TYPE EMPLOYEE_TP AS OBJECT(
     EMPLOYEE_ID NUMBER, 
     IN_DATE DATE, 
     MGR_ID NUMBER(1), 
     DEPT_NO NUMBER(1), 
     member procedure delete_employee_id(n in number) 
     ); 

2. 创建测试表

CREATE TABLE EMPLOYEE OF EMPLOYEE_TP(
    EMPLOYEE_ID PRIMARY KEY 
); 

3. 创建type body

create or replace type body EMPLOYEE_TP as 
    member procedure 
    delete_employee_id(n in number) is 
    begin 
     DELETE FROM EMPLOYEE E 
     WHERE E.EMPLOYEE_ID = n; 
    end; 
end; 

4. insert 测试数据

insert into EMPLOYEE values (EMPLOYEE_TP(1,TO_DATE('12/12/12','DD-MM-YY'),0,0)); 

5. 引用type并执行

declare 
x EMPLOYEE_TP; 
begin 
x.delete_employee_id('1');
end;

输出结果如下:

ORA-30625: method dispatch on NULL SELF argument is disallowed
ORA-06512: at line 4
30625. 00000 -  "method dispatch on NULL SELF argument is disallowed"
*Cause:    A member method of a type is being invoked with a NULL SELF
           argument.
*Action:   Change the method invocation to pass in a valid self argument.

6.原因

User-defined types, just like collections, are atomically null, until you initialize the object by calling the constructor for its object type
用户定义的type,就像集合一样,在原子上是null的,直到通过调用其对象类型的构造函数来初始化该对象

也就是说对于自定义的type,需要使用构造函数进行初始化后才能调用其方法

所以,你需要这样做:

7. 正确的方式

declare 
x employee_tp :=NEW employee_tp(null,null,null,null);  
begin 
x.delete_employee_id('1');
end;

结果输出如下:

已順利完成 PL/SQL 程序.
  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值