In addition to the previous answer, there are significant differences in the scope of the declaration.
When you declare a type in PL/SQL, such as the record type in your example, it is only usable from PL/SQL. If it is declared locally to a procedure or function, then it can only be used within that subprogram; if it is declared in a package body it can only be used within that package; if it is declared in a package header it can be used by any PL/SQL code that has execute access to the package. In no way can it be referenced in SQL statements, even ones embedded in the PL/SQL code.
When you create an object type, or other schema-level type definitions such as nested tables, it is usable within both SQL and PL/SQL. As a very simple example, you can base a table definition on the object definition:
SQL> CREATE OR REPLACE TYPE "TYPE_NAME1" AS OBJECT
2 (
3 temp_trans_id number(10),
4 trans_id number(10),
5 resion_id number(10)
6 )
7 /
Type created.
SQL> create table type_name1_tab of type_name1;
Table created.
SQL> desc type_name1_tab
Name Null? Type
----------------------------------------- -------- ----------------------------
TEMP_TRANS_ID NUMBER(10)
TRANS_ID NUMBER(10)
RESION_ID NUMBER(10)
See here for documentation on the CREATE TYPE statement and references to further documentation on the various uses of object types.