The arguments after 'USING' must be of SQL type. 'Record' is a PL/SQL data type, much like a PL/SQL table. So it won't work. You can 'EXECUTE IMMEDIATE' into a record variable, however. If your procedures were created to accept object data type, then it might work out for you. May or may not suit you, but it will look something like this: SQL> desc tyu Name Null? Type ----------------------------------------- -------- ---------------------------- C1 NUMBER(3) C2 VARCHAR2(2) C3 CHAR(1) SQL> create type test_type as object (col1 number(3),col2 varchar2(2), col3 char(1)); 2 / Type created. SQL> create or replace procedure test_proc2 (obj_in test_type) as 2 begin 3 insert into tyu values(obj_in.col1,obj_in.col2,obj_in.col3); 4 end; 5 / Procedure created. SQL> truncate table tyu; Table truncated. SQL> declare 2 x test_type:=test_type(0,'X','X'); 3 y test_type:=test_type(1,'Y','Y'); 4 w test_type; 5 str varchar2(200); 6 i number:=0; 7 begin 8 if i=0 then 9 w:=x; 10 str:='test_proc2'; 11 else 12 w:=y; 13 str:='test_proc'; 14 end if; 15 execute immediate 'begin '||str||'(:a); end;' using w; 16 end; 17 / PL/SQL procedure successfully completed. SQL> select * from tyu; C1 C2 C ---------- -- - 0 X X SQL>