2014-12-02 44 views
0

最近,我部署了一个Oracle WareHouse Builder(OWB)映射。在我现在正在工作的场景中,此映射(ETL过程)需要在事实表上使用Update语句(使用WriteBack值)后由触发器启动。PL/SQL绑定变量问题

由于映射作为包部署到目标模式,触发器必须调用OWB为包创建的主要过程。起初我并没有知道如何去完成这个任务,但SQL开发人员给了我一个提示:

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 

然后我跑了SHOW errors命令,我得到这个:

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

现在我不太了解这些绑定变量。如果这是由SQL Developer生成的用于运行包的代码,那么为什么我会得到这个错误?

请帮忙!在这件事上我需要一些指导! 问候!

回答

1

变量前面的冒号表示该变量是绑定变量。这种类型的绑定变量通常用于传入和传出匿名块的值。他们不允许在程序,函数或触发器中使用。在这种情况下,您需要删除行:P_STATUS := P_STATUS;

+0

但是,如果我这样做,我怎么能确定ETL将正确执行?我的意思是,记得我没有写这个代码。它由SQL Developer生成。这是否与执行ETL时运行的完全相同的代码? – 2014-12-02 17:44:26

+0

我不知道你的软件包究竟做了什么,或者你为什么要在触发器中进行呼叫。我回答了你问的具体问题。如果您需要了解更多信息,请修改您的问题或发布新问题。但是,具体一点。 “我怎么能确定这将正确执行?”太宽泛,无法获得有用的答案。 – Allan 2014-12-02 18:14:57