Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 1
Регистрация: 11.02.2015
Сообщений: 87

Не получается поставить триггер

27.08.2017, 19:59. Показов 1703. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Условие: при изменение данных таблицы Триггер должен разрешать добавление, если число компаний на момент добавления не превышает пяти.

Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE TRIGGER "OILCOMPANY_T1"
BEFORE
INSERT ON "OILCOMPANY"
FOR each ROW
WHEN (I NUMBER)
BEGIN
SELECT COUNT(*) INTO I FROM OilCompany;
IF I>5 THEN
ERROR(-20001, 'Add deny, the table has more than 5 companies!');
END IF;
END;
/
Ошибка: Trigger create was not successful for the following reason:
ORA-00920: invalid relational operator

Помогите разобраться, пожалуйста.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.08.2017, 19:59
Ответы с готовыми решениями:

Не получается переписать триггер из MySQL на PL/SQL
Для курсача изучал SQL в SoloLearn. А вот PL глянул статьи, вроде всё понятно, но основательно разбираться времени нет и поэтому...

Триггер, вызывающий процедуру, в которой выполняется select к этой таблице (откуда был вызван триггер)
есть тригерр create or replace trigger quickstart.quickstart.ACRIONS_COMMIT_TR after update on quickstart.actions for each...

Не получается повесить триггер на view
Добрый день всем. Столкнулся с проблемой, которую не могу решить и уже порядком поднадоело, требуется помощь квалифицированных...

9
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
28.08.2017, 08:59
Цитата Сообщение от daiciy Посмотреть сообщение
Помогите разобраться, пожалуйста.
Неверный синтаксис. Вместо WHEN (I NUMBER) надо написать
SQL
1
2
DECLARE
I NUMBER;
1
0 / 0 / 1
Регистрация: 11.02.2015
Сообщений: 87
28.08.2017, 14:44  [ТС]
AGK, теперь другая ошибка.
Миниатюры
Не получается поставить триггер  
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
28.08.2017, 15:28
Лучший ответ Сообщение было отмечено daiciy как решение

Решение

У Вас наверняка нет прав на служебную схему SYS. Соответственно, Вы не можете создавать в этой схеме объекты.
Попробуйте поставить имя схемы перед именем таблицы и именем триггера. Что-то вроде
SQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE TRIGGER "SCHEMA"."OILCOMPANY_T1"
BEFORE
INSERT ON "SCHEMA"."OILCOMPANY"
FOR each ROW
DECLARE
I NUMBER;
BEGIN
SELECT COUNT(*) INTO I FROM "SCHEMA".OilCompany;
IF I>5 THEN
ERROR(-20001, 'Add deny, the table has more than 5 companies!');
END IF;
END;
где "SCHEMA" - имя той схемы (пользователя), в которой Вы работаете. Ясно же, что новичок не может работать под SYS-ом и создавать всякую фигню в служебной схеме.
Может, правда, вы создали базу у себя на компе и вошли под SYS-ом. Быстро создайте пользователя, выйдете из SYS-а, войдите под пользователем и ломайте базу под ним. Меньше наломаете дров.

Добавлено через 29 минут
А может быть, у Вас тривиально нет привилегий CREATE TRIGGER или CREATE ANY TRIGGER
1
0 / 0 / 1
Регистрация: 11.02.2015
Сообщений: 87
28.08.2017, 20:23  [ТС]
AGK, может поможете ещё с одной ошибкой. Проверила уже на 50 раз в чем ошибка не могу понять.

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
CREATE OR REPLACE PACKAGE BODY PARAM AS
 
PROCEDURE INSERT_COMPANY
(ID IN NUMBER, NAME IN VARCHAR2, COUNTRY IN VARCHAR2, PRODUCTION IN NUMBER) IS
 
BEGIN
INSERT INTO OilCompany
VALUES (ID, NAME, COUNTRY, PRODUCTION);
DBMS_OUTPUT.PUT_LINE('Add data to the table OilCompany!');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('When adding data OilCompany to a table the error occurred!');
END INSERT_COMPANY;
 
PROCEDURE INSERT_PIPELINE
(PID IN NUMBER, PNAME IN VARCHAR2, LENGTH IN NUMBER, ID IN NUMBER) IS
BEGIN
INSERT INTO OilPipeline
VALUES (PID, PNAME, LENGTH, ID);
DBMS_OUTPUT.PUT_LINE('Add data to the table OilPipeline!');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('When adding data OilPipeline to a table the error occurred!');
END INSERT_PIPELINE;
 
PROCEDURE CLEAR_DATA IS
BEGIN
DELETE FROM OilPipeline;
DELETE FROM OilCompany;
DBMS_OUTPUT.PUT_LINE ('From table delete all data!');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE ('When you delete an error occurred!');
END CLEAR_DATA; 
 
PROCEDURE SELECT_DATA
(MIN_SUM_LENGTH IN NUMBER) IS
CURSOR C_COMP (P_LENGTH NUMBER) IS
SELECT C.NAME FROM OilCompany C,
(SELECT ID, SUM (LENGTH) FROM OilPipeline
GROUP BY ID
HAVING SUM (LENGTH) > P_LENGTH) T
WHERE T.ID=C.ID; 
BEGIN
DBMS_OUTPUT.PUT_LINE ('The company with the total length of pipelines not less than '||MIN_SUM_LENGTH);
FOR V_COMP IN C_COMP (MIN_SUM_LENGTH) LOOP
DBMS_OUTPUT.PUT_LINE (V_COMP.NAME);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE ('When retrieving data error occurred!');
END SELECT_DATA;
END PARAM;
Выдает ошибку: ERROR at line 0: PL/SQL: Compilation unit analysis terminated
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
29.08.2017, 09:04
Цитата Сообщение от daiciy Посмотреть сообщение
в чем ошибка не могу понять
Скорее всего, у Вашего пакета нет спецификации. Прежде. чем делать тело пакета, надо сделать его спецификацию (сам пакет). Что-то типа
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE OR REPLACE PACKAGE PARAM AS
 
PROCEDURE INSERT_COMPANY
(ID IN NUMBER, NAME IN VARCHAR2, COUNTRY IN VARCHAR2, PRODUCTION IN NUMBER);
 
PROCEDURE INSERT_PIPELINE
(PID IN NUMBER, PNAME IN VARCHAR2, LENGTH IN NUMBER, ID IN NUMBER);
 
PROCEDURE CLEAR_DATA;
 
PROCEDURE SELECT_DATA(MIN_SUM_LENGTH IN NUMBER);
 
END PARAM;
1
0 / 0 / 1
Регистрация: 11.02.2015
Сообщений: 87
29.08.2017, 11:10  [ТС]
Цитата Сообщение от AGK Посмотреть сообщение
нет спецификации
есть,именно так как у вас написано. Точь в точь. Скажите, а выполнять нужно всё вместе и заголовок и тело? Или можно сначала заголовок потом тело? У меня в лекциях ничего об этом не написано.
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
29.08.2017, 11:25
Цитата Сообщение от daiciy Посмотреть сообщение
выполнять нужно всё вместе и заголовок и тело?
Что значит выполнять? М.б. создать/компилировать?
Для справки: м.б. спецификация без тела, но не м.б. тела без спецификации. Соответственно...
1
0 / 0 / 1
Регистрация: 11.02.2015
Сообщений: 87
29.08.2017, 11:31  [ТС]
AGK, написала вот так:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
CREATE OR REPLACE PACKAGE BODY PARAM AS
PROCEDURE INSERT_COMPANY(ID IN NUMBER,NAME IN VARCHAR2,COUNTRY IN VARCHAR2,PRODUCTION IN NUMBER) IS
BEGIN
INSERT INTO OilCompany
VALUES (ID, NAME, COUNTRY, PRODUCTION);
DBMS_OUTPUT.PUT_LINE('Add data to the table OilCompany!');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('When adding data OilCompany to a table the error occurred!');
END INSERT_COMPANY;
PROCEDURE INSERT_PIPELINE(PID IN NUMBER, PNAME IN VARCHAR2, LENGTH IN NUMBER, ID IN NUMBER) IS
BEGIN
INSERT INTO OilPipeline
VALUES (PID, PNAME, LENGTH, ID);
DBMS_OUTPUT.PUT_LINE('Add data to the table OilPipeline!');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('When adding data OilPipeline to a table the error occurred!');
END INSERT_PIPELINE;
PROCEDURE CLEAR_DATA IS
BEGIN
DELETE FROM OilPipeline;
DELETE FROM OilCompany;
DBMS_OUTPUT.PUT_LINE('From table delete all data!');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('When you delete an error occurred!');
END CLEAR_DATA; 
PROCEDURE SELECT_DATA(MIN_SUM_LENGTH IN NUMBER) IS
CURSOR c_COMP (p_LENGTH NUMBER) IS
SELECT c.NAME FROM OilCompany c,
(SELECT ID, SUM(LENGTH) FROM OilPipeline
GROUP BY ID
HAVING SUM(LENGTH) > p_LENGTH) t
WHERE t.ID=c.ID; 
BEGIN
DBMS_OUTPUT.PUT_LINE('The company with the total length of pipelines not less than '|| MIN_SUM_LENGTH);
FOR v_COMP IN C_COMP (MIN_SUM_LENGTH) LOOP
DBMS_OUTPUT.PUT_LINE (v_COMP.NAME);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('When retrieving data error occurred!');
END SELECT_DATA;
END PARAM;
и всё заработало. Спасибо за помощь.

Добавлено через 2 минуты
Цитата Сообщение от Grossmeister Посмотреть сообщение
выполнять? М.б. создать/компилировать?
а разве есть разница? ))) суть то одна и та же. Уже разобралась, спасибо.
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
29.08.2017, 11:44
Цитата Сообщение от daiciy Посмотреть сообщение
У меня в лекциях ничего об этом не написано.
Цитата Сообщение от Grossmeister Посмотреть сообщение
м.б. спецификация без тела, но не м.б. тела без спецификации. Соответственно...
... , надо создавать пакет (спецификацию) раньше тела. А уж в одной сесии или в разных - это дела вкуса и политических убеждений.

Цитата Сообщение от Grossmeister Посмотреть сообщение
Что значит выполнять? М.б. создать/компилировать?
Лучше придерживаться стандартной терминологии, иначе Вас могут не[правильно] понять. Вы выполняете скрипт, но за этим выполнением стоит создание и компиляция пакета. Пакет надо сперва "создать", а потом "начинять" процедурами. А Вы, судя по всему, пытались вставить начинку в ещё не существующий пирог.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.08.2017, 11:44
Помогаю со студенческими работами здесь

Не получается создать триггер для перемножения полей из разных таблиц
Вобщем нужно чтобы триггер перемножал поля izdelie.cena и vid_obrabot.koeffic и записывал результат в zakaz.summa CREATE OR ALTER TRIGGER...

Не получается поставить Solaris_10
Привет всем. С Соларис работаю в первые, обязал препод по универу. В чем собственно вопрос - Не получается поставить Solaris на VmWare и...

Не получается поставить GRANTS
Ставлю привилегии GRANT SELECT (job, address), INSERT (secret, login) ON `database`.`Person` TO 'username'@'localhost' но польозавтель все...

Не получается поставить bootstrap
При попытке устаноки бутстрапа https://facebook.github.io/create-react-app/docs/adding-bootstrap через npm выводит npm install --save...

Не получается поставить letsencrypt на крон
Привет! У меня не получается поставить letsencrypt на крон авто обновление сертификата по крону, сам сертификат я сгенерил и успешно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru