【问题标题】:ROWTYPE declaration throws ORA-16000 error in standby databaseROWTYPE 声明在备用数据库中引发 ORA-16000 错误
【发布时间】:2020-03-27 16:36:57
【问题描述】:

我有以下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 吗?

【问题讨论】:

  • 我没有只读实例来测试这一点,但我相信问题是dbms_output 在内部尝试写入一个不允许读取的缓冲区-只有数据库。
  • 没有。根本原因在于 %ROWTYPE。当我使用tst_col dual.DUMMY%TYPE; 声明时一切正常。
  • 你可以通过显式运行set transaction read only;来摆脱错误
  • 没用。

标签: oracle plsql


【解决方案1】:

最后这个问题得到了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 操作配置自动重定向。

【讨论】:

    猜你喜欢
    • 2019-04-25
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 2020-03-18
    相关资源
    最近更新 更多