1

我正在尝试创建一个触发器,但不知何故我收到了错误,称为错误绑定变量。我在谷歌上搜索了它,但在所有情况下,我都得到了相同的答案,即用户试图用错误的列名创建触发器。这是我的脚本。

CREATE TABLE  "POPSETTING"     
(   "settingid" number primary key,
    "HOSTNAME" VARCHAR2(50),    
    "INCOMINGSERVER" VARCHAR2(100),
    "REQUIREDSSL" VARCHAR2(1),
    "PORT" NUMBER,
    "OUTGOINGSERVER" VARCHAR2(100),
    "REQUIREDTLS" VARCHAR2(1),
    "REQUIREDAUTH" VARCHAR2(1),
    "PORTTLS" NUMBER,
    "PORTSSL" NUMBER
    )

序列:

create sequence auto_inc start with 1 increment by 1 nomaxvalue

扳机:

create or replace trigger popid
   before insert on popsetting
   for each ROW
begin 
   select auto_inc.NEXTVAL
  into :new.settingid from dual 
end;
/

请让我知道我的错误。

4

2 回答 2

4

由于您在创建语句中使用了" "周围settingid,因此您使其区分大小写。
默认情况下,oracle 将列名引用为大写,因此没有:new.settingid(实际上是:new.SETTINGID
您可能想尝试:new."settingid"或删除""create table 语句中的

于 2013-11-10T06:28:10.687 回答
0

对于旧版本的 Oracle,您不希望触发器只是从序列中获取数字;这会导致一些开销。如果您可以控制任何插入表的代码,只需引用插入中的序列:

insert into POPSETTING
  (SETTING_ID,
   HOSTNAME)
values
  (auto_inc.NEXTVAL, 
  'EXAMPLE.COM');

对于较新版本的 Oracle,您不必担心确保程序员引用插入序列;您可以在创建表时使用标识子句,标识列将自动填充:

CREATE TABLE "POPSETTING"
  ( settingid number 
        generated always as identity (cache 200) primary key,
   HOSTNAME       VARCHAR2(50),
   INCOMINGSERVER VARCHAR2(100),
   REQUIREDSSL    VARCHAR2(1),
   PORT           NUMBER,
   OUTGOINGSERVER VARCHAR2(100),
   REQUIREDTLS    VARCHAR2(1),
   REQUIREDAUTH   VARCHAR2(1),
   PORTTLS        NUMBER,
   PORTSSL        NUMBER
   );

一次将CACHE 200抓取 200 个号码;如果你有一张每天有数千个插入的表,那就没问题了CACHE 10000

于 2018-11-08T23:31:50.873 回答