Oracle SQL - PLS-00049 - 错误的绑定变量

时间:2015-05-27 10:51:35

标签: sql oracle plsql database-trigger

我的表定义如下:

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

2 个答案:

答案 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。