user3108805
user3108805

Reputation: 23

PL/SQL ORA-30625: method dispatch on NULL SELF argument is disallowed

Oracle keeps giving me this error: ORA-30625: method dispatch on NULL SELF argument is disallowed.

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

The code follows:

  CREATE OR REPLACE TYPE PEDIDO_TP AS OBJECT(
        ID_PEDIDO NUMBER,
        DATA_PAGAMENTO DATE,
        CANCELADO NUMBER(1),
        PENDURADO NUMBER(1),
        member procedure cancelapedido(n in number)
        );     

create or replace type body PEDIDO_TP as member procedure cancelapedido(n in number) is begin DELETE FROM PEDIDO p WHERE p.ID_PEDIDO = n; end; end; CREATE TABLE PEDIDO OF PEDIDO_TP( ID_PEDIDO PRIMARY KEY ); insert into PEDIDO values (PEDIDO_TP(1,'12/12/12',0,0)); declare x PEDIDO_TP; begin x.cancelapedido('1'); end;<code>

Upvotes: 2

Views: 51795

Answers (4)

Bassel Kh
Bassel Kh

Reputation: 1977

It is related to oracle ACL (Most probably), at least we could fix this issue by resolving the ACL issue.

Make sure that the port is available for that specific domain

select acl , host , lower_port , upper_port from DBA_NETWORK_ACLS;

And make sure that the user has sufficient privilege

select acl , principal , privilege , is_grant from DBA_NETWORK_ACL_PRIVILEGES;

ACL tutorial is HERE

Upvotes: 0

Naveen
Naveen

Reputation: 21

**--ORA-30625 (A member method of a type is being invoked with a NULL SELF argument.)**

The issue is simulated with the below cases 

Three Cases:-

**1- Invoking a method without initializing the object 
2- Data is not there in the Payload
3- Data is null in the payload**

--Try to execute the below Scripts 

--CREATE TYPE & TYPE BODY

CREATE OR REPLACE TYPE TEST_TYPE AS OBJECT(
        ID  NUMBER,
        DIGIT NUMBER(1),
        member FUNCTION FACT_CAL(n in number) RETURN NUMBER );

create or replace type body TEST_TYPE as
  member FUNCTION FACT_CAL(n in number) RETURN NUMBER is
  begin
    RETURN SELF.ID * SELF.DIGIT * n;
  end;
END;

**--1- Invoking a method without initializing the object** 

--Issue arises here
DECLARE
   r1 TEST_TYPE;
BEGIN
-- R1 := TEST_TYPE(1,2);
   DBMS_OUTPUT.put_line(R1.FACT_CAL(2));
END;

-----NOW EXECUTE BELOW(issue is resolved here)------

**Solution:-**

DECLARE
   r1 TEST_TYPE;
BEGIN
  R1 := TEST_TYPE(1,2);
   DBMS_OUTPUT.put_line(R1.FACT_CAL(2));
END;

**--2- Data is not there in the Payload**

-----EXECUTE BELOW(Issue arises here)------

DECLARE
   r1 TEST_TYPE;
   r2 sys.anydata;
   r3 number;
BEGIN
-- R1 := TEST_TYPE(null,null);
r3:=r2.getObject(r1);
   DBMS_OUTPUT.put_line(DBMS_TYPES.SUCCESS);
END;

---Now Execute below(--issue is resolved here)----

**Solution :-** 

DECLARE
   r1 TEST_TYPE;
   r2 sys.anydata;
   r3 number;
BEGIN
-- R1 := TEST_TYPE(null,null);
r2:= sys.anydata.ConvertObject(r1);
r3:=r2.getObject(r1);
   DBMS_OUTPUT.put_line(DBMS_TYPES.SUCCESS);
END;

**-- 3- Data is null in the payload**

CREATE OR REPLACE TYPE TEST_TYPE1 AS OBJECT(
        ID  NUMBER,
        DIGIT NUMBER(1) );

create table anydata 
(id number,
data sys.anydata);

  insert into anydata values (1, null);

CREATE OR REPLACE FUNCTION GET_OBJ_TYPE(IN_ANYDATA SYS.ANYDATA)
   RETURN TEST_TYPE1 IS

   V_ANYDATA SYS.ANYDATA := IN_ANYDATA;
   V_BE_DATA TEST_TYPE1 ;
   V_RETURN  PLS_INTEGER;
BEGIN
 V_RETURN := SYS.ANYDATA.GETOBJECT(SELF => V_ANYDATA, OBJ => V_BE_DATA);
 RETURN V_BE_DATA;
END GET_OBJ_TYPE;

--EXECUTE THE QUERY(Issue arises here)

select GET_OBJ_TYPE(data) from anydata;

--NOTE :- PROBLEM IS WHEN THE ANYDATA VALUE IS NULL THIS DATA CANT CONVERT THE PAYLOAD TO SPECIFIC OBJECT TYPE .

-**-SOLUTION** :-

(CONVERT THE 'NULL' ENTRY TO SYS.ANYDATA TYPE) --issue is resolved here


CREATE OR REPLACE FUNCTION GET_OBJ_TYPE(IN_ANYDATA SYS.ANYDATA)
   RETURN TEST_TYPE1 IS

   V_ANYDATA SYS.ANYDATA := IN_ANYDATA;
   V_BE_DATA TEST_TYPE1 ;
   V_RETURN  PLS_INTEGER;
BEGIN
   V_ANYDATA:= sys.anydata.ConvertObject(V_BE_DATA);--- ADD THIS LINE WHICH CONVERTS 'NULL' TO THE SYS.ANYDATA TYPE
   V_RETURN := SYS.ANYDATA.GETOBJECT(SELF => V_ANYDATA, OBJ => V_BE_DATA);

   RETURN V_BE_DATA;
END GET_OBJ_TYPE;

 --NOW EXECUTE THE QUERY`enter code here`
select GET_OBJ_TYPE(data) from anydata;


HOPE THIS IS HELPFUL ...

Upvotes: 1

Pablo Riboldi
Pablo Riboldi

Reputation: 1

You need to call the constructor for this object, and you can do this when you declare the variable. For example:

declare x PEDIDO_TP := PEDIDO_TP.CONSTRUCT; --reference to the object and call to constructor.

Upvotes: 0

OldProgrammer
OldProgrammer

Reputation: 12169

Your object is null until you create it with a constructor call. From the Oracle Docs,

User-defined types, just like collections, are atomically null, until you initialize the object by calling the constructor for its object type

So, you need to do this:

declare
x PEDIDO_TP;   --reference to the object

begin
  x := PEDIDO_TP(,,, all your parameters,,,);  --assign created object to the reference.
end;

Link to documentation

Upvotes: 4

Related Questions