Q:

update in procedure taking long time

create or replace procedure Proc_1(P_IN_TABLE_NAME VARCHAR2)
AS
CURSOR T_FACT
IS
SELECT T_ID,T_VER,D_T_ID
from O_T_FACT
where  T_ID is not null
and T_VER is not null;

TYPE call_tab IS TABLE OF O_T_FACT%rowtype;

BEGIN
   IF P_IN_TABLE_NAME ='G_FACT' THEN

   OPEN T_FACT;  
   LOOP 

      EXIT WHEN T_FACT%NOTFOUND ;   

            FETCH T_FACT BULK COLLECT INTO call_data_rec LIMIT no_of_rec;                   
            EXIT WHEN call_data_rec.count = 0;

                       FOR j IN 1..call_data_rec. COUNT
                        loop
                        UPDATE  G_FACT GL set
                        GL.T_ID = call_data_rec(j).T_ID, 
                        GL.T_VER =call_data_rec(j).T_VER,
                        GL.TRANS_FLAG='Y'
                        WHERE GL.G_T_ID = call_data_rec(j).D_T_ID
                        AND GL.T_ID IS NULL 
                        AND GL.T_VER IS NULL;             

                        rec_count := rec_count + 1;                       
                        if mod(rec_count,10000) = 0 then
                        commit;
                        end if;               
                        end loop; 

   end loop;
   CLOSE T_FACT;
   END IF;
End;

This particular procedure is taking long time, is there any other way to write this?  Can this be done in a single update statement? 
As suggested below I have tired for all but its giving error as 
PLS-00436: implementation restriction: cannot reference fields of BULK In-BIND table of records
New Code with For all
create or replace procedure Proc_update_T_ID(P_IN_TABLE_NAME VARCHAR2)
AS
no_of_rec number := 1000;
CURSOR T_and_V_FACT
IS
SELECT O_T_FACT.T_ID, O_T_FACT.T_VER, O_T_FACT.Downstream_T_ID, G_FACT.rowid row_id,
From O_T_FACT, G_FACT
WHERE O_T_FACT.T_ID IS NOT NULL AND G_FACT.G_T_ID = O_T_FACT.Downstream_T_ID
AND T_VER is not null
AND G_FACT.T_VER IS NULL;

TYPE call_tab IS TABLE OF T_and_V_FACT%rowtype index by binary_integer;
call_data_rec call_tab;

BEGIN
   IF P_IN_TABLE_NAME ='G_FACT' THEN
        IF T_and_V_FACT%ISOPEN THEN
            CLOSE T_and_V_FACT;
        END IF;    

        open T_and_V_FACT;

        LOOP

            FETCH T_and_V_FACT BULK COLLECT
            INTO call_data_rec LIMIT no_of_rec;

            FORALL j IN call_data_rec. FIRST .. call_data_rec. LAST    
            UPDATE  G_FACT GL set
                        GL.T_ID = call_data_rec(j).T_ID, 
                        GL.T_VER =call_data_rec(j).T_VER,
                        GL.TRANS_FLAG='Y'
            WHERE GL.rowid = call_data_rec(j).row_id;      

            COMMIT;                  
            call_data_rec. DELETE;
        EXIT WHEN T_and_V_FACT%NOTFOUND;      
        END LOOP;

        CLOSE T_and_V_FACT;
   End if;

END Proc_1;

A:

It looks to me like you could rewrite this into a single statement like so:
update G_FACT GL
set    (GL.T_ID, GL.T_VER, GL.TRANS_FLAG) = 
            (select T_ID,T_VER, 'Y'
              from   O_T_FACT F
              where  F.T_ID is not null
              and    F.T_VER is not null
              and    GL.G_T_ID = F.D_T_ID)
where  exists (select null
               from   O_T_FACT F
               where  F.T_ID is not null
               and    F.T_VER is not null
               and    GL.G_T_ID = F.D_T_ID)
and    GL.T_ID is null
and    GL.T_VER is null; 

If this doesn't work, then you should be able to get significant gains by converting your for loop into a forall statement:
 FORALL j IN 1..call_data_rec. COUNT
    UPDATE  G_FACT GL set
    GL.T_ID = call_data_rec(j).T_ID, 
    GL.T_VER =call_data_rec(j).T_VER,
    GL.TRANS_FLAG='Y'
    WHERE GL.G_T_ID = call_data_rec(j).D_T_ID
    AND GL.T_ID IS NULL 
    AND GL.T_VER IS NULL;    

Also, rethink whether you need that commit in the loop.  Including this will:

Slow your processing down
Increase the chance of hitting ORA-1555s
Possibly leave your data in an inconsistent state

