Oracle 多租户 - 在另一个容器中执行 PL/SQL,超过 DBMS_SQL

Oracle multitenant - execute PL/SQL, over DBMS_SQL, in another container

文档说

execute immediate 'alter session set container=myPDB'

从 PDB 中禁用(可能从 CDB 根和应用程序容器中禁用),

但它并没有反对 DBMS_SQL.PARSE。 我希望它能够在 DBMS_SQL.PARSE 上从 PDB 在另一个 PDB 中执行 PL/SQL,但出现了错误: ORA-01031: 权限不足

所以,这样看来也是不可能的。 测试如下

我以 SYSDBA 身份登录 CDB Root。

然后我可以执行以下操作:

declare
c1 int;
rowsn integer;
statem varchar2(500);
ctx    varchar2(128);
BEGIN
    c1 := DBMS_SQL.OPEN_CURSOR;
    ctx :='myPDB';
    statem :='  declare
                                var1 varchar2(60);
                                begin
                                select user into var1 from dual;
                                end;';
   DBMS_SQL.PARSE(c => c1 ,
                   statement => statem,
                   language_flag => DBMS_SQL.NATIVE,
                   container => ctx);

  rowsn:=DBMS_SQL.EXECUTE(c=>c1);
  DBMS_SQL.CLOSE_CURSOR(c=>c1);
END;
/

而且有效!

但是一旦我切换到 PDB as

alter session set container=myPDB;

我不能再做以下事情了

alter session set container=myPDB;


declare
c1 int;
rowsn integer;
statem varchar2(500);
ctx    varchar2(128);
BEGIN
    c1 := DBMS_SQL.OPEN_CURSOR;
    ctx :='myPDB2';
    statem :='  declare
                                var1 varchar2(60);
                                begin
                                select user into var1 from dual;
                                end;';
   DBMS_SQL.PARSE(c => c1 ,
                   statement => statem,
                   language_flag => DBMS_SQL.NATIVE,
                   container => ctx);

  rowsn:=DBMS_SQL.EXECUTE(c=>c1);
  DBMS_SQL.CLOSE_CURSOR(c=>c1);
END;
/

是否有可能在另一个 PDB 中通过 DBMS_SQL.PARSE 从 PDB 执行 PL/SQL?

PDB 是有效独立的数据库,具有独立的安全性(用户、角色、权限等)。他们之间没有可见性。您必须将它们视为独立的独立数据库。独立 Oracle 数据库交互的唯一方式是通过数据库链接。