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' (bad bind variable in English) が発生し続けます。私は何を間違っていますか?

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

引用された識別子は、参照されるすべての場所で引用する必要があります。トリガー定義でテーブル名を参照したときに気づいたようですが、列名にも当てはまります。

引用符で囲まれていない識別子 (または引用符で囲まれた大文字の識別子。無効な文字が含まれていない限りは同じです) を使用すると、作業がはるかに簡単になります。データベース・オブジェクト名に引用符付き識別子を使用することはお薦めしません。したがって、これは二重引用符なしで機能します。

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を使用する代わりに、コード内で etc. を参照できます"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 に答える