Почему я получаю сообщение «Произошла ошибка компиляции sql / plsql».ошибка из-за точек с запятой при создании триггера? - PullRequest
2 голосов
/ 31 мая 2019

Я пытаюсь создать триггер с помощью «Oracle SQL Developer» в «Oracle 11G».Но при каждой попытке я получаю сообщение «ORA-24344: успех с ошибкой компиляции», и мой триггер частично создается с ошибками.

Моя версия Oracle SQL Developer - «3.0.04», а версия сервера - «Oracle Database 11G Release 11.2.0.4.0 (64-разрядная версия)».Каждый раз, когда я пытаюсь создать триггер, я получаю одно и то же сообщение и понимаю, что он останавливает выполнение в первой точке с запятой.Я перепробовал все написанное в здесь , похоже, что возникла та же проблема, но ни одна из них не помогла.

Например, я пытаюсь создать триггер, например:

create or replace
TRIGGER TEST_TRG 
BEFORE INSERT ON TEST_TABLE2 
REFERENCING NEW AS NEW FOR EACH ROW
DECLARE testvar number;
BEGIN 
testvar := test_sequence.nextval;
INSERT INTO TEST_TABLE(id,data) VALUES(testvar,:NEW.id);
END TEST_TRG;
/

Я получаю:

Error starting at line 0 in command:
CREATE OR REPLACE TRIGGER TEST_TRG 
BEFORE INSERT ON TEST_TABLE2 
REFERENCING NEW AS NEW FOR EACH ROW
DECLARE testvar number
Error report:
SQL Command: trıgger TEST_TRG
Failed: ORA-24344: success with compilation error
24344. 00000 -  "success with compilation error"
*Cause:    A sql/plsql compilation error occurred.
*Action:   Return OCI_SUCCESS_WITH_INFO along with the error code
Bind Variable "NEW" is NOT DECLARED
anonymous block completed

Как видите, он думает, что оператор заканчивается при первом появлении точки с запятой.Чтобы доказать свое подозрение, я выполнил еще один тест, удалив ненужный оператор DECLARE:

CREATE OR REPLACE TRIGGER TEST_TRG 
BEFORE INSERT ON TEST_TABLE2 
REFERENCING NEW AS NEW FOR EACH ROW
BEGIN 
INSERT INTO TEST_TABLE(id,data) VALUES(test_sequence.nextval,:NEW.id);
END TEST_TRG;
/

, который вызвал ту же ошибку, но в другой позиции (снова в первой точке с запятой):

Error starting at line 0 in command:
CREATE OR REPLACE TRIGGER TEST_TRG 
BEFORE INSERT ON TEST_TABLE2 
REFERENCING NEW AS NEW FOR EACH ROW
BEGIN 
INSERT INTO TEST_TABLE(id,data) VALUES(test_sequence.nextval,:NEW.id)
Error report:
SQL Command: trıgger TEST_TRG
Failed: ORA-24344: success with compilation error
24344. 00000 -  "success with compilation error"
*Cause:    A sql/plsql compilation error occurred.
*Action:   Return OCI_SUCCESS_WITH_INFO along with the error code

Error starting at line 6 in command:
END TEST_TRG
Error report:
Unknown Command

Так что вопрос очевиден.Почему я не могу создать эти триггеры и что я должен сделать для их создания?

Ответы [ 2 ]

3 голосов
/ 31 мая 2019

См. Этот пример (11.2.0.4):

Таблицы и последовательность:

SQL> create table test_table2 (id number, data varchar2(20));

Table created.

SQL> create table test_table  (id number, data varchar2(20));

Table created.

SQL> create sequence test_sequence;

Sequence created.

Trigger:

SQL> create or replace trigger test_trg
  2     before insert
  3     on test_table2
  4     for each row
  5  begin
  6     insert into test_table (id, data)
  7          values (test_sequence.nextval, :new.id);
  8  end test_trg;
  9  /

Trigger created.

Тестирование:

SQL> insert into test_table2 (id, data) values (100, 'A');

1 row created.

SQL> select * from test_table;

        ID DATA
---------- --------------------
         1 100

SQL> select * from test_table2;

        ID DATA
---------- --------------------
       100 A

SQL>

Кстати, первый триггер, чей код вы отправили, работает нормально в моей базе данных:

SQL> create or replace
  2  TRIGGER TEST_TRG
  3  BEFORE INSERT ON TEST_TABLE2
  4  REFERENCING NEW AS NEW FOR EACH ROW
  5  DECLARE testvar number;
  6  BEGIN
  7  testvar := test_sequence.nextval;
  8  INSERT INTO TEST_TABLE(id,data) VALUES(testvar,:NEW.id);
  9  END TEST_TRG;
 10  /

Trigger created.

SQL>

Второй:

SQL> CREATE OR REPLACE TRIGGER TEST_TRG
  2  BEFORE INSERT ON TEST_TABLE2
  3  REFERENCING NEW AS NEW FOR EACH ROW
  4  BEGIN
  5  INSERT INTO TEST_TABLE(id,data) VALUES(test_sequence.nextval,:NEW.id);
  6  END TEST_TRG;
  7  /

Trigger created.

SQL>

Так что, возможно, речь идет о вашей довольно старой версии SQL Developer. Я предлагаю вам обновить до последней версии (можно бесплатно загрузить в Oracle Technology Network).

0 голосов
/ 13 июня 2019

Благодаря ответу Littlefoot , хотя это не было основной причиной моей проблемы, он помог мне увидеть проблему. Я попробовал оба наших запроса и увидел, что триггер работает, если я использую строчные буквы, но не прописные.

Затем я понял, что сообщение об ошибке имеет такую ​​строку:

SQL Command: trıgger TEST_TRG

Итак, я видел, что если я использую прописные буквы, моя версия Oracle SQL Developer преобразует ее в строчные буквы. Но, как вы можете видеть, вместо использования набора символов ASCII он использует мой локальный набор символов (турецкая кодировка) и преобразует «I» в «ı», а также преобразует «İ» в «i». Поэтому в моей ОС клиент Oracle не распознает «TRIGGER» в качестве допустимого ключевого слова. Я должен использовать «триггер» или «TRİGGER».

Другим решением было изменение настройки «Региональный формат» ОС Windows с «Турецкий (Турция)» на «Английский (США)». Я проверил все остальные региональные / локализационные настройки, но работает только изменение настроек «Региональный формат». Поэтому я полагаю, что Oracle Developer проверяет эту настройку для определения клиентского набора символов.

Может также относиться к версии «Oracle SQL developer». Но политика администратора моего рабочего компьютера не позволяет мне его обновлять, поэтому я не смог попробовать.

...