This procedure errors not withstanding is a potential source of SQL Injection attacks. It should be rewritten to avoid building the dynamic query directly from the input values. Instead there should be some form of validation of the input.
Here's one potential way to rewrite the procedure:
create or replace procedure p11(v_sal in number,v_schema varchar2,v_tab varchar2)
is
type tab_t is record( owner ALL_TABLES.OWNER%type
, table_name ALL_TABLES.TABLE_NAME%type);
tab tab_t;
begin
-- Ensure table and schema are valid by selecting from all_tables
select owner, table_name
into tab
from all_tables
where owner = v_schema and table_name = v_tab;
Execute immediate
-- Use the returned values from above in building the query
'update '|| tab.owner||'.'||tab.table_name
-- use a bind for the new salary instead of concatenation
||' set sal=:new_sal where empno= :1' using v_sal, 7839;
end;