PL/SQL 绑定变量的问题
Posted
技术标签:
【中文标题】PL/SQL 绑定变量的问题【英文标题】:Issue With PL/SQL Bind Variables 【发布时间】:2014-12-02 15:44:14 【问题描述】:最近,我部署了一个 Oracle WareHouse Builder (OWB) 映射。在我现在工作的场景中,这个映射(ETL 过程)需要在事实表上发生 Update 语句后由触发器触发(使用 WriteBack 值)。
由于映射作为包部署到目标模式,因此触发器必须调用 OWB 为包创建的主过程。起初我不知道如何完成这项任务,但 SQL Developer 给了我一个提示:
所以,我将这段代码放入我的触发器中。像这样:
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;
/
当我试图编译这个触发器时,我得到了这个屏幕:
在此屏幕中,我尝试单击带有和不带有 NULL 复选框的“Aplicar”(西班牙语应用),始终得到以下输出:
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;
这一行。
【讨论】:
但是如果我这样做,我怎么能确定 ETL 会正确执行呢?我的意思是,请记住我没有编写此代码。它是由 SQL Developer 生成的。这不是 OWB 在执行 ETL 时运行的完全相同的代码吗? 我不知道你的包到底是做什么的,也不知道你为什么要在触发器中调用它。我回答了你问的具体问题。如果您需要进一步了解,请修改您的问题或发布新问题。但是,要具体。 “我怎么能确定这会正确执行?”过于宽泛,无法获得有用的答案。以上是关于PL/SQL 绑定变量的问题的主要内容,如果未能解决你的问题,请参考以下文章