Triggers 在Oracle 11g中创建触发器时出现问题

Triggers 在Oracle 11g中创建触发器时出现问题,triggers,oracle11g,Triggers,Oracle11g,我在尝试使用SQL Developer在Oracle 11g数据库中创建触发器时遇到了一个奇怪的错误。以下是我所做的: 我的桌子: 创建表国家/地区代码( ID号(19,0)主键不为空, 代码VARCHAR2(2)不为空, 说明VARCHAR2(50), 已创建时间戳默认当前时间戳, 由VARCHAR2(40)默认用户创建, 上次更新的时间戳默认当前时间戳, 上次由VARCHAR2(40)默认用户更新, 存档字符(1)默认值“0”不为空; 顺序如下: CREATE SEQUENCE COUNT

我在尝试使用SQL Developer在Oracle 11g数据库中创建触发器时遇到了一个奇怪的错误。以下是我所做的:

我的桌子:

创建表国家/地区代码(
ID号(19,0)主键不为空,
代码VARCHAR2(2)不为空,
说明VARCHAR2(50),
已创建时间戳默认当前时间戳,
由VARCHAR2(40)默认用户创建,
上次更新的时间戳默认当前时间戳,
上次由VARCHAR2(40)默认用户更新,
存档字符(1)默认值“0”不为空;
顺序如下:

CREATE SEQUENCE COUNTRY_code_ID_SEQ从1开始递增1;
触发因素:

创建或替换触发器国家/地区\u代码\u触发器
在插入国家/地区代码之前
每行
声明
最大识别号;
当前序号;
开始
如果:new.id为空,则
选择国家/地区\代码\ ID\顺序。下一步
输入:new.id
来自双重;
其他的
选择最大值(NVL(最大值(id),0),:new.id)
进入max_id
来自国家/地区代码;
选择国家/地区\代码\ ID\顺序。下一步
进入当前顺序
来自双重;
而cur_seq
创建表和序列效果很好,但当我尝试创建触发器时,会出现以下错误:

Error report:
ORA-00603: ORACLE server session terminated by fatal error
ORA-00600: internal error code, arguments: [kqlidchg0], [], [], [], [], [], [], [], [], [], [], []
ORA-00604: error occurred at recursive SQL level 1
ORA-00001: unique constraint (SYS.I_PLSCOPE_SIG_IDENTIFIER$) violated
00603. 00000 -  "ORACLE server session terminated by fatal error"
*Cause:    An ORACLE server session is in an unrecoverable state.
*Action:   Login to ORACLE again so a new server session will be created
有人知道这个错误吗


谢谢

可能有解决办法

我终于找到了问题的答案:

添加以下内容:

ALTER SESSION SET PLSCOPE_SETTINGS='标识符:无';
或在Oracle SQL Developer中:

  • 转到工具|首选项
  • 选择数据库| PL/SQL编译器
  • 将PLScope标识符从All更改为None
  • 点击Ok
  • 这解决了问题…

    我没有其他解决方案(也没有只发表评论的名声),但这里有一些信息可能有助于让某人在仍然使用PL/Scope的情况下正确地解决这个问题

    我刚刚遇到了一个类似的问题,研究PL/Scope特性有助于我理解问题可能出在哪里。对于我的问题,我试图创建一个触发器,但同样的错误出现了。我更改了触发器的主体,但没有任何效果,但更改名称效果很好

    PL/Scope似乎在删除第一个实例化触发器之前一直保留着它的相关信息。对触发器的查询显示我的触发器肯定被删除了,但对(PL/Scope)标识符(“all_标识符”)的查询显示它仍然存在

    关于PL/范围的一些信息如下:

    第8章(11g文档)提供了更多信息:

    一旦修复了PLScope问题,您将得到一个突变触发器异常。
    COUNTRY\u code
    上的行级触发器不允许查询
    COUNTRY\u code
    表。虽然可以使用额外的语句级触发器来解决此问题,但似乎并不需要在每次插入行时检查序列是否需要重置。似乎更可能的情况是,您只是想将序列设置为一个更大的值,以防在某些罕见的情况下造成这种错误情况。谢谢Tony,我非常感谢@TonyAndrews尽量避免只使用超链接的答案。如果链接断开,这个答案就没用了。您可能希望修改您的答案,发布您所学内容的摘要,然后参考链接。@vapcguy,但由于此答案已有3年历史,并且不是公认的答案,我可能不会@也许是TonyAndrews,如果你的答案不是link only,它会被接受,因为你首先回答了…哦,好吧。。。这是5年前:-)解决了我的问题。但为什么会这样呢?到底是什么问题?