Я использую версию DbVisualizer Pro 9.5.6, и я запускаю следующую команду sql
для создания triggers
.
CREATE OR REPLACE TRIGGER "MYDB"."TG_T01_01" BEFORE INSERT ON T01
FOR EACH ROW
BEGIN
:NEW.FECALT_01 := SYSDATE;
:NEW.FECMOD_01 := SYSDATE;
SELECT T01Q00.NEXTVAL INTO :NEW.ID_01 FROM DUAL;
END;
/
CREATE OR REPLACE TRIGGER "MYDB"."TG_T01_02"
BEFORE UPDATE ON T01
FOR EACH ROW
BEGIN
:NEW.FECMOD_01 := SYSDATE;
END;
/...
Они представляют собой список идентичных triggers
разных таблиц BBDD. Когда я запускаю команду sql
она показывает мне эти сообщения об ошибках:
14:42:07 [CREATE - 0 строк, 0.032 сек.] Команда обработана. Никаких строк не было
14:42:07 [: NEW.USUMOD_01 - 0 строк, 0.000 секунд] [Код: 17439, SQL State: 99999] Tipo SQL no válido: sqlKind = UNINITIALIZED
14:42:07 [END - 0 строк, 0.000 секунд] [Код: 900, SQL Состояние: 42000] ORA-00900: sentencia SQL no válida
14:42:07 [ / - 0 rows, 0.000 secs] [Код: 900, SQL Состояние: 42000] ORA-00900: sentencia SQL no válida
14:42:07 [: NEW.FECMOD_01 - 0 строк, 0.000 секунд] [Код: 17439, SQL State: 99999] Tipo SQL no válido: sqlKind = UNINITIALIZED
14:42:07 [: NEW.USUALT_01 - 0 rows, 0.000 secs] [Код: 17439, SQL State: 99999] Tipo SQL no válido: sqlKind = UNINITIALIZED
14:42:07 [: NEW.USUMOD_01 - 0 строк, 0.000 секунд] [Код: 17439, SQL State: 99999] Tipo SQL no válido: sqlKind = UNINITIALIZED
14:42:07 [SELECT - 0 rows, 0.000 secs] [Код: 1008, SQL State: 72000] ORA-01008: нет переменных todas las han sido enlazadas
14:42:07 [END - 0 строк, 0,015 сек] [Код: 900, SQL Состояние: 42000] ORA-00900: sentencia SQL no válida
...
После этого trigger
создается следующим образом:
CREATE OR REPLACE TRIGGER "MYDB"."TG_T01_01" BEFORE INSERT ON T01
FOR EACH ROW
BEGIN
:NEW.FECALT_01 := SYSDATE
Примечание. trigger
, который был создан неправильно, может быть отредактирован и помещен в код, trigger
работает и код хорошо написан, поэтому я пришел к выводу, что наиболее вероятно, что SQL-интерпретатор DbVisualizer рассматривает ;
как END
.
Насколько я могу судить, это неправильно:
SELECT 01Q00.NEXTVAL INTO :NEW.ID_01 FROM DUAL;
потому что это недопустимое имя последовательности - должно быть буква как первый символ, а не номер. Вот пример:
SQL> create table t01
2 (id_01 number,
3 fecalt_01 date,
4 fecmod_01 date
5 );
Table created.
SQL> create sequence 01q00;
create sequence 01q00
*
ERROR at line 1:
ORA-02277: invalid sequence name
Если мы проигнорируем ошибку, позвольте создать триггер:
SQL> create or replace trigger tg_t01_01
2 before insert on t01
3 for each row
4 begin
5 :new.fecalt_01 := sysdate;
6 :new.fecmod_01 := sysdate;
7 select 01q00.nextval into :new.id_01 from dual;
8 end;
9 /
Warning: Trigger created with compilation errors.
SQL> show err
Errors for TRIGGER TG_T01_01:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/3 PL/SQL: SQL Statement ignored
4/15 PL/SQL: ORA-00923: FROM keyword not found where expected
Итак, давайте исправьте имя последовательности и заново создадим триггер (используя новое имя последовательности):
SQL> create sequence seq01;
Sequence created.
SQL> create or replace trigger tg_t01_01
2 before insert on t01
3 for each row
4 begin
5 :new.fecalt_01 := sysdate;
6 :new.fecmod_01 := sysdate;
7 select seq01.nextval into :new.id_01 from dual;
8 end;
9 /
Trigger created.
SQL>
Кажется, все в порядке, а?
CREATE TRIGGER - это то, что называется "сложным выражением" в DbVisualizer, поскольку оно содержит вложенные операторы. Инструкции по выполнению такого рода инструкций см. В руководстве пользователя:
http://confluence.dbvis.com/display/UG100/Executing+Complex+Statements
С наилучшими пожеланиями, Ханс
Я устанавливаю Oracle SQL Developer, и SQL работает правильно.