ROWTYPE声明在备用数据库中引发ORA-16000错误

时间:2019-10-29 16:47:41

标签: oracle plsql

我有以下pl / sql:

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> select log_mode, open_mode, database_role from v$database;

LOG_MODE     OPEN_MODE            DATABASE_ROLE
------------ -------------------- ----------------
ARCHIVELOG   READ ONLY WITH APPLY PHYSICAL STANDBY

SQL> DECLARE
  tst_row  dual%ROWTYPE;
BEGIN
  SET TRANSACTION READ ONLY;
END;
/
DECLARE
*
ERROR at line 1:
ORA-16000: database or pluggable database open for read-only access

有人可以解释为什么我在这里得到 ORA-16000 吗?

1 个答案:

答案 0 :(得分:0)

最后,这个问题得到了here的回答。

看起来像个错误。我们尝试编译类型定义并将其临时存储在表中(当然不允许这样做)

同样在18和19中转载。即使使用临时撤消或全局临时表,您仍然会得到它。

我为您提供了更多信息。假设您打算做一些“实际的”工作,例如DML等,那么您可以将匿名块重定向到主要对象,例如:

SQL> DECLARE
  2    tst_row  dual%ROWTYPE;
  3  BEGIN
  4    null;
  5  END;
  6  /
DECLARE
*
ERROR at line 1:
ORA-16000: database or pluggable database open for read-only access

SQL> alter session enable adg_redirect_plsql;

Session altered.

SQL> DECLARE
  2    tst_row  dual%ROWTYPE;
  3  BEGIN
  4    null;
  5  END;
  6  /

PL/SQL procedure successfully completed.

但是不幸的是,ADG_REDIRECT_PLSQL命令仅在Oracle 19c中引入。参见this

10.2.2.2在Active Data Guard备用数据库上运行顶级PL / SQL操作

在Active Data Guard备用数据库上运行的顶级PL / SQL块(如果它们不包含绑定变量)可以重定向到主数据库并在主数据库上运行。

要将备用数据库上运行的顶级PL / SQL操作重定向到主数据库,请在备用数据库上使用以下命令配置自动重定向:

  ALTER SESSION ENABLE ADG_REDIRECT_PLSQL;

您只能在会话级别为顶级PL / SQL操作配置自动重定向。