我的表定义如下:
create table "nakup" (
"cislo_n" INTEGER not null,
"id_zak" INTEGER not null,
"jm_pobocky" CHAR(15) not null,
"datum_cas" DATE not null
constraint CKC_DATUM_CAS_NAKUP check ("datum_cas" >= TO_DATE('1.01.1994 8:30:25', 'DD.MM.YYYY HH24:MI:SS')),
constraint PK_NAKUP primary key ("cislo_n")
我想创建一个阻止从未来插入日期的触发器,我的代码如下所示:
create or replace TRIGGER TRIGGER1
BEFORE INSERT OR UPDATE ON "nakup"
FOR EACH ROW
BEGIN
if (:new.datum_cas > current_timestamp) then
raise_application_error(-20000, 'Špatně zadané datum a čas.');
end if;
END;
我不断收到错误错误(5,7):PLS-00049:chybnávázanáprosěnná'NEW.DATUM_CAS'(英语中的错误绑定变量)。我做错了什么?
答案 0 :(得分:2)
正如Gordon Linoff建议的那样,如果用双引号括起列名,你的触发器就会编译:
create or replace TRIGGER TRIGGER1
BEFORE INSERT OR UPDATE ON "nakup"
FOR EACH ROW
BEGIN
if (:new."datum_cas" > current_timestamp) then
raise_application_error(-20000, 'Špatně zadané datum a čas.');
end if;
END;
/
Trigger TRIGGER1 compiled
Quoted identifiers必须在引用的所有地方引用。您似乎已经意识到,当您在触发器定义中引用表名时,它也适用于列名。
如果使用不带引号的标识符(或带引号的大写标识符,只要它们不包含任何无效字符,那么你的生活会更简单)。 Oracle建议不要对数据库对象名称使用带引号的标识符。所以这根本没有双引号:
create table nakup (
cislo_n INTEGER not null,
id_zak INTEGER not null,
jm_pobocky CHAR(15) not null,
datum_cas DATE not null,
constraint CKC_DATUM_CAS_NAKUP
check (datum_cas >= TO_DATE('1.01.1994 8:30:25', 'DD.MM.YYYY HH24:MI:SS')),
constraint PK_NAKUP primary key (cislo_n)
);
Table NAKUP created.
create or replace TRIGGER TRIGGER1
BEFORE INSERT OR UPDATE ON nakup
FOR EACH ROW
BEGIN
if (:new.datum_cas > current_timestamp) then
raise_application_error(-20000, 'Špatně zadané datum a čas.');
end if;
END;
/
Trigger TRIGGER1 compiled
然后,您可以在代码中引用nakup.datum_cas
等,而不必使用"nakup"."datum_cas"
。
答案 1 :(得分:0)
是...
datum_cas
列名称与datum_cas
列名称不同。
Oracle默认将列名存储为大写,如果我们使用双引号(“”),则列名存储为原样(上/下)
...示例
SQL> create table test5 (id number,"id1" number);
table created.
SQL> insert into test5 values(1,2);
1 row created.
SQL> select * from test5;
ID id1
----- ----------
1 2
id存储为ID,id1存储为id1。