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;
/