Now that we have code that actually runs, I cannot reproduce your issue at all, and given that the example is so so so simple, I have to guess that you are doing something entirely different from what you say you did - since you gave an example that would never compile, this is highly likely (that what you did bears no resemblance to what you actually did)
Please use cut and paste just like I do.
M is the name of the nested table that is created for you, see below, you can describe it, it is a child table:
ops$tkyte%ORA10GR2> CREATE OR REPLACE TYPE emp_details_obj AS OBJECT (address VARCHAR2(100),per_gf VARCHAR2(20))
2 /
Type created.
ops$tkyte%ORA10GR2>
ops$tkyte%ORA10GR2> CREATE OR REPLACE TYPE type_emp_details IS TABLE OF emp_details_obj
2 /
Type created.
ops$tkyte%ORA10GR2>
ops$tkyte%ORA10GR2> CREATE TABLE emp (x INT,b type_emp_details)
2 NESTED TABLE b STORE AS m
3 /
Table created.
ops$tkyte%ORA10GR2>
ops$tkyte%ORA10GR2> INSERT INTO emp VALUES (1,type_emp_details(emp_details_obj('i am','good')));
1 row created.
ops$tkyte%ORA10GR2> select * from emp;
X
----------
B(ADDRESS, PER_GF)
-------------------------------------------------------------------------------
1
TYPE_EMP_DETAILS(EMP_DETAILS_OBJ('i am', 'good'))
ops$tkyte%ORA10GR2> desc m
Name Null? Type
---------------------------------------- -------- ----------------------------
ADDRESS VARCHAR2(100)
PER_GF VARCHAR2(20)