Benutzer-Wechsel in einem Package

Immer wieder möchte man aus einem PL/SQL-Package heraus einen Befehl absetzen, der nicht unter dem aktuellen sondern unter einem anderen Benutzer abgesetzt wird. Das ist so ohne weiteres nicht möglich, da ein Package einen Reconnect oder Benutzer-Wechsel nicht unterstützt. Hier leistet der Oracle Scheduler wertvolle Hilfe. Man kann mit ihm aus einem Package heraus einen synchronen Job aufrufen, der unter einem beliebigen Benutzer gestartet werden kann.

Hierzu ein Beispiel:

create or replace package my_utilities 
is
--
-- Ausführen eines beliebigen SQL-Statements
procedure exec_with_other_user(p_sql in varchar2);
--
-- Erstellen eines Scheduler Jobs
procedure exec_sql(p_user in varchar2
                  ,p_sql  in varchar2
                  );
/
end my_utilities;
create or replace package_body my_utilities
is
--
-- Ausführen eines beliebigen SQL-Statements
procedure exec_with_other_user(p_sql in varchar2)
is
begin
  execute immediate(p_sql);
end exec_with_other_user;
--
-- Erstellen eines Scheduler Jobs
procedure exec_sql(p_user in varchar2
                  ,p_sql  in varchar2
                  )
is
  c_job_name varchar2(61 char)
    := upper(p_user)||'.EXEC_SQL_'||to_char(sysdate,'DDMMYYYY_HH24MISS');
begin
  dbms_scheduler.create_job
    (job_name            => c_job_name
    ,job_type            => 'STORED_PROCEDURE'
    ,job_action          => 'MY_UTILITIES.EXEC_WITH_OTHER_USER'
    ,number_of_arguments => 1
    );
  dbms_scheduler.set_job_argument_value
    (job_name          => c_job_name
    ,argument_position => 1
    ,argument_value    => p_sql
    );
  dbms_scheduler.run_job
    (job_name            => c_job_name
    ,use_current_session => true
    );
  dbms_scheduler.drop_job
    (job_name => c_job_name);
end exec_sql;
--
end my_utilities;
/
create public synonym my_utilities for my_utilities
/
grant execute on my_utilities to public
/

Benutz werden kann dann der Aufruf folgendermaßen:

create or replace package test_package
is
--
procedure test_user_change;
--
end test_package;
/
create or replace package body test_package
is
--
procedure test_user_change
is
begin
 my_utilities.exec_sql
 (p_user => <beliebiger_user>
 ,p_sql  => <beliebiges_sql_statement>
 );
end test_user_change;
--
end test_package;
/

Das könnte Sie auch interessieren

Bleiben Sie informiert:

its-people hilft Ihnen...

Weitere Blogthemen: