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 绑定变量的问题的主要内容,如果未能解决你的问题,请参考以下文章

这个 PL/SQL 有啥问题?绑定变量 * 未声明

PL/SQL 绑定变量的问题

如何使用绑定变量使整个 PL/SQL 代码块动态化?

在 Oracle PL/SQL 中重用绑定变量

sqlplus pl/sql Date/Time 用户输入理解为绑定变量

Oracle ApeX (PL/SQL) - 从 JavaScript 变量中创建绑定变量