oracle中的错误绑定变量

时间:2013-11-10 05:31:43

标签: sql oracle triggers sequence

我正在尝试创建一个触发器,但不知怎的,我得到了一个名为bad bind variable的错误。 我在google上搜索了它,但在所有情况下我都得到了相同的答案,用户试图用错误的列名创建触发器。这是我的剧本。

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;
/

请让我知道我的错误。

2 个答案:

答案 0 :(得分:4)

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

中的""

答案 1 :(得分:0)

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

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

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

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就可以了。