1

我有这样定义的表:

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' (英语中的错误绑定变量)。我究竟做错了什么?

4

2 回答 2

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

引用的标识符必须在引用它们的任何地方引用。您似乎已经意识到,当您在触发器定义中引用表名时,它也适用于列名。

如果您使用不带引号的标识符(或带引号的大写标识符,只要它们不包含任何无效字符,那么您的生活会简单得多)。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".

于 2015-05-27T11:09:55.863 回答
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。

于 2015-05-27T13:01:47.010 回答