2012-05-21 2 views
1

Я загружаю данные через утилиты Oracle Apex, используя таблицу данных.Значение новой переменной на триггере не меняется, на plsql

Я хочу создать триггер, который проверяет значение на таблице из загруженных данных, а затем изменяет его в зависимости от того, что он получает.

В таблице 4 колонки: идентификатор, имя, адрес электронной почты, тип

Данные для загрузки что-то вроде этого: имя, адрес электронной почты, тип

Теперь мой триггер:

create or replace TRIGGER BI_USER 
before insert ON USER    
for each row 

declare 
begin 
    if :NEW.ID is null then 
    select USERID_SEQ.nextval into :NEW.ID from dual; 
    end if; 
:NEW.TYPE := 'something else'; 
end; 

Идентификатор отлично работает, он принимает число из последовательности, но: new.type не работает, он не изменяется. Я также запускаю SQL-вставку отдельно и то же самое происходит.

EDIT: типа new.type является символом (1), я написал, как это только для тестирования пока он не меняется ... ааа Я расстраивать себя, он выдает ошибку сразу после чтения данных и никогда не запускает триггер.

То, что я пытался сделать то, что он будет иметь имя столбца TYPE, и поместить идентификатор из этой таблицы в NEW.type

Есть ли способ, чтобы изменить новый тип?

+2

Как в стороне, в 11g, я думаю, вы можете просто сделать ': NEW.id: = userid_seq.NEXTVAL;'. Не нужно выбирать. – eaolson

+0

Вы уверены, что срабатывает триггер? –

+0

@JeffreyKemp он не срабатывает, он выдает ошибку, как только он считывает данные, из-за неправильного типа – Warer

ответ

0

Попробуйте вместо этого:

select 'something else' into :NEW.TYPE from dual; 

Если этот синтаксис работал ID он должен также работать на TYPE

+0

, это не сработает, но я просто заметил, что если я использую ту же самую длину, это работает, я собираюсь редактировать чтобы указать, что тип столбца char (1) ... oh позор мне – Warer

2

Я вижу, что вы пытаетесь сделать. Вы хотите, чтобы ваша таблица приняла вставленную запись, содержащую данные, которые не соответствуют ширине одного из полей, и вы хотите использовать триггер для «исправления» данных, чтобы он соответствовал.

К сожалению, этот триггер не поможет вам, поскольку данные проверяются до запуска триггеров.

Альтернативным способом обойти это может быть использование представления вместо триггера. Представление будет иметь столбец «ТИП», который основан на строке длиной 9; вместо этого триггер преобразует это значение в CHAR (1) для вставки в базовую таблицу.

+0

, но в этом случае мне нужно вставить в представление вместо таблицы вправо?Я использую инструмент загрузки данных apex и не поддерживает загрузку по просмотрам – Warer

+0

ах - тогда вам не повезло. Вам нужно будет увеличить ширину столбца TYPE в таблице. –

Смежные вопросы