Oracle:如何使用 if 条件在存储过程中调用存储过程

Posted

技术标签:

【中文标题】Oracle:如何使用 if 条件在存储过程中调用存储过程【英文标题】:Oracle: How to call a stored procedure within a stored procedure with if-condition 【发布时间】:2019-06-17 15:27:03 【问题描述】:

我必须在带有 if 条件的过程(“A”)中调用一个过程(“B”)(在 Oracle 10g 中)。但我无法让它工作。

过程“B”从多个表中收集数据并将其写入 xml 文件。如果我无条件调用“B”,它会写入文件。但无论是否有数据,它都会写入文件(带有 xml-Header)。所以我需要 if 条件来检查数据。

代码:

CREATE OR REPLACE PROCEDURE A
AS
 l_count varchar2(3);

 CURSOR c_EXISTSDATA IS
   select count(*) into l_count from bv.history where upddate > sysdate -.015 and tabelle = 'MEDIEN' and userid != 'DATENTAUSH';

BEGIN
IF (l_count != 0)
THEN
B;
END IF;
END;
/

有了这个 if 条件,根本就没有输出 - 如果 l_count !=0 也是如此。这里有什么问题?

感谢您的帮助! 问候克里斯托夫

【问题讨论】:

首先将l_count局部变量转换为pls_integer类型。但对于其余的,没有数据我们无法知道。 声明游标不会获取任何结果。您需要实际获取它。顺便说一句,PL/SQL 中的 if 条件周围没有括号 - 它有 then 关键字。 【参考方案1】:

VARCHAR2 不是存储数字数据的好选择。我建议您使用数据类型NUMBER 定义l_count。此外,您定义了一个游标,但您从不执行它。你可以试试:

CREATE OR REPLACE PROCEDURE A
AS
  l_count NUMBER;    
BEGIN
  select count(*)
    into l_count
    from bv.history
    where upddate > sysdate - INTERVAL '20' MINUTE and
          tabelle = 'MEDIEN' and
          userid != 'DATENTAUSH';

  IF l_count != 0 THEN
    B;
  END IF;
END;

我不确定您所说的 0.015 是什么时间间隔。这相当于 21.6 分钟,所以我将其更改为(更清晰的)INTERVAL '20' MINUTE。根据需要进行调整。

我想你会发现这个效果更好。

【讨论】:

谢谢你,鲍勃 - 和其他人!我对 pl/sql 不是很熟悉(你可能已经猜到了......)。没有光标(我还没有看到树木的木材)该程序有效。 BR克里斯托夫

以上是关于Oracle:如何使用 if 条件在存储过程中调用存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 oracle 中将 select 与 if 条件一起用于不同的表,而不是编写函数或存储过程?

oracle 存储过程 if语句

在oracle中创建带参存储过程,传进去的参数可以为空么?在存储过程中要如何判断传进来的值是不是为空。

sql 存储过程如何动态拼接where后面的条件

oracle存储过程中if条件后的sql没有执行

如何从数据库表(ORACLE)中获取“IF STATEMENT”条件?