【问题标题】:PLS-00357 sequence.nextval not allowedPLS-00357 sequence.nextval 不允许
【发布时间】:2014-04-23 12:29:35
【问题描述】:

我正在尝试创建触发器并收到错误“[Error] PLS-00357: PLS-00357: Table, View Or Sequence reference 'table_data_seq.nextval' not allowed in this context”

我已经阅读了很多关于错误的信息,但找不到人们所说的有效的 PL/SQL 和我的之间的区别。下面是我创建触发器的代码(尽可能保持基本以使其正常工作):

create or replace trigger tr_tabData 
before insert on table_data
for each row
DECLARE
seq_value int;
begin
       select table_data_sq.nextval into seq_value from dual;
end;

Oracle 版本为 10.2.0.5

按照这里的要求,它是序列的脚本:

DROP SEQUENCE DATA_ADMIN.TABLE_DATA_SQ;

CREATE SEQUENCE DATA_ADMIN.TABLE_DATA_SQ
  START WITH 1000
  MAXVALUE 999999999999999999999999999
  MINVALUE 1
  NOCYCLE
  CACHE 20
  NOORDER;

【问题讨论】:

  • 该错误通常意味着您在 PL/SQL 上下文中使用序列。例如,seq_value := table_data_sq.nextval; 在 10g 中不起作用,但在 11g 中起作用。但是您的代码使用的是老式的获取序列的方式,我不确定它为什么会失败。您是否粘贴了错误版本的代码?
  • 这是我的 toad for oracle sql 编辑器屏幕中的语句。我尝试运行它,我得到了上面的错误。
  • 在 SQL*Plus 中运行它时会发生什么?这段代码在 11g 或 12c 上运行良好,但不幸的是我无法访问 10g 实例。
  • @user1567453 请同时显示序列 DDL。
  • 这可能是您的 Toad 窗口中的代码,但如果您已对此进行了多次尝试,它可能仍会尝试重新编译旧版本——此时进行插入。将其更改为 create or replace trigger ... 是否会更改(或消除)错误?

标签: triggers oracle10g sequence


【解决方案1】:

这在 11g 之前是不可能的。您可以在 11g 的常规分配中使用 sequence_name.NEXTVAL 而不是在此之前,并且通过以下方式:

 select TABLE_DATA_SQ.NEXTVAL into :NEW.YourID from   dual;

【讨论】:

    【解决方案2】:

    原来这是 TOAD 版本和我的 Oracle 数据库版本的错误。 SQL*Plus 和 SQL Developer 中的相同代码按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多