I have a problem. SET ROLE
does not work as I expected. I have code sample:
DECLARE
ln_ln NUMBER;
ln_1 NUMBER;
BEGIN
ln_ln := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(ln_ln, 'SET ROLE SOME_ROLE IDENTIFIED BY SOME_PASSWORD',DBMS_SQL.NATIVE);
ln_1 := DBMS_SQL.EXECUTE(ln_ln);
DBMS_SQL.CLOSE_CURSOR(ln_ln);
ln_ln := SOME_PACKAGE.SOME_FUNCTION;
END;
The SOME_ROLE
have grant to SOME_PACKAGE
. When I run this block, I get error that package does not exists. When I run this everything is fine:
DECLARE
ln_ln NUMBER;
ln_1 NUMBER;
BEGIN
ln_ln := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(ln_ln, 'SET ROLE SOME_ROLE IDENTIFIED BY SOME_PASSWORD',DBMS_SQL.NATIVE);
ln_1 := DBMS_SQL.EXECUTE(ln_ln);
DBMS_SQL.CLOSE_CURSOR(ln_ln);
END;
/
DECLARE
ln_ln NUMBER;
BEGIN
ln_ln := SOME_PACKAGE.SOME_FUNCTION;
END;
When I run this, everything is good too:
DECLARE
ln_ln NUMBER;
BEGIN
ln_ln := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(ln_ln, 'SET ROLE SOME_ROLE IDENTIFIED BY SOME_PASSWORD',DBMS_SQL.NATIVE);
ln_1 := DBMS_SQL.EXECUTE(ln_ln);
DBMS_SQL.CLOSE_CURSOR(ln_ln);
EXECUTE IMMEDIATE 'BEGIN :x := SOME_PACKAGE.SOME_FUNCTION; END;' USING OUT ln_ln;
END;
I tried EXECUTE IMMDIATE
, DBMS_SESSION.SET_ROLE
and DBMS_UTILITY.exec_ddl_statement
instead of DBMS_SQL.EXECUTE
. Can anyone tell me some workaround or explain why this stuff keeps happening.