2014-12-02 2 views
0

Недавно я развернул отображение Oracle WareHouse Builder (OWB). В сценарии, который я сейчас работаю, это сопоставление (процесс ETL) должно запускаться с помощью триггера после того, как оператор обновления имеет место в таблице фактов (работает со значениями WriteBack).Проблема с переменными привязки PL/SQL

Поскольку отображение развертывается в целевую схему как пакет, триггер должен вызывать основную процедуру, которую создает OWB для пакета. Сначала я не знал, как выполнить эту задачу, но SQL Developer дал мне подсказку:

enter image description here

Итак, я взял этот код и поместить его в мой курок. Как это:

CREATE OR REPLACE TRIGGER RESPALDO_HISTORIAL 
AFTER UPDATE ON MONITOR_FT_TAB 
FOR EACH ROW 
DECLARE 

    P_STATUS VARCHAR2(200); 
    P_MAX_NO_OF_ERRORS VARCHAR2(200); 
    P_COMMIT_FREQUENCY VARCHAR2(200); 
    P_OPERATING_MODE VARCHAR2(200); 
    P_BULK_SIZE VARCHAR2(200); 
    P_AUDIT_LEVEL VARCHAR2(200); 
    P_PURGE_GROUP VARCHAR2(200); 
    P_JOB_AUDIT VARCHAR2(200); 

BEGIN 

    P_MAX_NO_OF_ERRORS := NULL; 
    P_COMMIT_FREQUENCY := NULL; 
    P_OPERATING_MODE := NULL; 
    P_BULK_SIZE := NULL; 
    P_AUDIT_LEVEL := NULL; 
    P_PURGE_GROUP := NULL; 
    P_JOB_AUDIT := 'TRUE'; 

    SINIESTROS_MARCADOS_MAP.MAIN(
    P_STATUS => P_STATUS, 
    P_MAX_NO_OF_ERRORS => P_MAX_NO_OF_ERRORS, 
    P_COMMIT_FREQUENCY => P_COMMIT_FREQUENCY, 
    P_OPERATING_MODE => P_OPERATING_MODE, 
    P_BULK_SIZE => P_BULK_SIZE, 
    P_AUDIT_LEVEL => P_AUDIT_LEVEL, 
    P_PURGE_GROUP => P_PURGE_GROUP, 
    P_JOB_AUDIT => P_JOB_AUDIT 
); 

    :P_STATUS := P_STATUS; 

END RESPALDO_HISTORIAL; 
/

Когда я попытался собрать этот триггер, я получил этот экран:

enter image description here

В этом окне я попытался нажав «Aplicar» (Применить на испанском языке) с и без NULL флажок, всегда получаю этот выход:

TRIGGER RESPALDO_HISTORIAL compilado 
Errors: check compiler log 

Тогда я побежал команду на ВЫСТАВКАХ ОШИБКИ, и я получил это:

33/3   PLS-00049: bad bind variable 'P_STATUS' 

Теперь я не совсем понимаю эти переменные связывания. Если это код, созданный SQL Developer для запуска пакета, то почему я получаю эту ошибку?

Пожалуйста, помогите! Мне нужны рекомендации по этому вопросу! Приветствую!

ответ

1

Двойник, предшествующий переменной, указывает, что эта переменная является переменной привязки. Связанные переменные этого типа обычно используются для передачи значений в и из анонимных блоков. Они не допускаются в процедурах, функциях или триггерах. В этом случае вам необходимо удалить строку :P_STATUS := P_STATUS;.

+0

Но если я это сделаю, как я могу быть уверен, что ETL будет работать правильно? Я имею в виду, помню, я не написал этот код. Он был создан SQL Developer. Разве это не тот же самый код OWB кода, который выполняется при выполнении ETL? –

+0

Я не знаю, что именно делает ваш пакет или почему вы вызываете его в триггер. Я ответил на конкретный вопрос, который вы задали. Если вам нужно что-то узнать, измените свой вопрос или опубликуйте новый. Но будьте конкретны. «Как я могу быть уверен, что это будет выполнено правильно?» слишком широк, чтобы получить полезный ответ. – Allan