我正在尝试创建一个触发器,但不知怎的,我得到了一个名为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;
/
请让我知道我的错误。
答案 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
就可以了。