Не уверен, почему принятый ответ был принят, поскольку ни он, ни прилагаемые комментарии, похоже, не решают очевидную проблему в размещенном коде.
В теле триггера мы ссылаемся на значения во вставленной строке с помощью кодового слова :NEW
. В опубликованном коде отсутствует двоеточие, когда он ссылается на столбец в предложении WHERE. Вот что нужно:
CREATE OR REPLACE TRIGGER "propuesta_casas"
BEFORE INSERT ON "PROPUESTA_TIENDA_BARRIO"
FOR EACH ROW
WHEN (new."CASASCAL" IS NULL)
BEGIN
SELECT PROPUESTA.CASAS
INTO :new."CASASCAL"
FROM PROPUESTA
WHERE PROPUESTA.IDPROPUESTA=:new.IDPROPUESTA ;
END;
/
Кстати, не забывайте использовать строчные буквы в двойных кавычках при создании объектов.
По умолчанию все имена Oracle хранятся в словаре данных в верхнем регистре, но операторы SQL не чувствительны к регистру. Таким образом, следующие два описания относятся к одному и тому же объекту:
select * from emp
/
select * from EMP
/
Однако, если мы создадим наш объект с именем в смешанном или нижнем регистре и поместим его в двойные кавычки, он будет сохранен в словаре данных с , что точно соответствует . Это означает, что мы должны использовать именно этот случай всякий раз, когда ссылаемся на объект в двойных кавычках. Так что, если мы создали таблицу со всеми строчными буквами ...
create table "emp" ...
... тогда это утверждение не будет выполнено:
select * from emp
/
Должно быть
select * from "emp"
/
Конечно, если у нас уже есть таблица с именем EMP, то первый оператор был бы успешным, если бы его просто выбрали из другой таблицы.
В случае триггеров мы обычно не называем их по имени. Но мы должны использовать регистр всякий раз, когда ищем триггер в словаре данных:
select status
from user_triggers
where trigger_name = 'propuesta_casas'
/