【问题标题】:can any solve what is wrong with this please?请问有什么问题可以解决吗?
【发布时间】:2013-10-25 08:32:18
【问题描述】:
create table account_type
(
acct_type number(3) primary key,
acct_desc Varchar2(30) not null CHECK (acct_desc IN('savings','salary','current','credit')),
acct_wd_limit number(10)
);

create sequence acct_seq;

CREATE OR REPLACE TRIGGER acct_pk
BEFORE INSERT ON account_type 
FOR EACH ROW
WHEN (new.acct_type IS NULL)
BEGIN
  SELECT acct_seq.NEXTVAL
  INTO   :new.acct_type
  FROM   account_type;
END;

在 account_type 上插入之前,我在行上遇到错误。不知道为什么

我也试过了

CREATE OR REPLACE TRIGGER acct_pk
BEFORE INSERT ON account_type 
FOR EACH ROW
WHEN (new.id IS NULL)
BEGIN
  SELECT acct_seq.NEXTVAL
  INTO   :new.id 
  FROM   account_type;
END;

即使这样做也会给我一个错误

create sequence acct_pk
start with 1
increment by 1
max value 999
min value 1
no cycle;

谢谢

【问题讨论】:

  • 您在创建序列中的序列名称应为 acct_seq。
  • 如果您不向我们显示因尝试运行您的语句而导致的错误消息,我们如何回答这个问题?也许你的语法是错误的。也许您没有创建表和序列的正确权限。很多不同的事情都可能是错误的。

标签: oracle oracle10g


【解决方案1】:

由于作者将问题标记为,因此她不能在PL/SQL 中使用sequence_name.nextVal。解决方案:

CREATE OR REPLACE TRIGGER acct_pk
  BEFORE INSERT ON account_type 
  FOR EACH ROW
DECLARE
  v_acct_type NUMBER;
BEGIN
  IF :new.acct_type IS NULL THEN
    SELECT acct_seq.NEXTVAL
      INTO   v_acct_type
    FROM   dual;
    :new.acct_type := v_acct_type;
  END IF;
END;

【讨论】:

  • 嗨,感谢您的解决方案,但声明语句仍然给我一个错误,例如第 5 行的错误:PL/SQL:SQL 语句被忽略3。对于每一行 4. 声明 5. v_acct_type NUMBER; 6. 开始 7. IF :new.acct_type IS NULL THEN
  • 我基本上需要为account_type自动生成主键
  • @carolinepereira 编辑您的原始问题,准确发布您尝试执行的内容并向我们展示您遇到的错误。我在您的问题中看到您有额外的SEQUENCE 称为acct_pk,与您用于触发器的名称相同。试试我的答案,但给触发器一个不同的名称,并更改触发器中序列的名称以匹配您实际使用的触发器的名称。
猜你喜欢
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2023-03-19
相关资源
最近更新 更多