【发布时间】:2015-08-09 09:57:14
【问题描述】:
我有这样定义的表:
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;
我不断收到错误 Error(5,7): PLS-00049: chybná vázaná proměnná 'NEW.DATUM_CAS'(英语中的绑定变量错误)。我做错了什么?
【问题讨论】:
-
使用
:new."datum_cas"是否有效? -
Quoted identifiers 会给你带来痛苦,Oracle 不推荐使用它们;除非您有真正充分的理由,否则请使用不带引号的标识符。
-
"datum_cas"是与datum_cas不同的列名,在 Oracle 手册的“SQL 的基本元素”一章中有说明:docs.oracle.com/cd/E11882_01/server.112/e41084/… -
没有理由使用
datum_cas作为带引号的标识符。好的做法是使用不带引号的标识符。见stackoverflow.com/a/30457938/3989608。 带引号的标识符 在您引用该对象时使用双引号。如果您使用双引号创建对象,则它会区分大小写,并且无论在何处引用该对象,都必须始终以相同的方式使用。 -
另外,1.避免使用
CHAR,使用VARCHAR2。 2.datum_cas是DATE数据类型,但是比较的是current_timestamp
标签: sql oracle plsql database-trigger