【问题标题】:Procedure if (select count(column) from table) > 0 then过程 if (select count(column) from table) > 0 then
【发布时间】:2017-07-04 08:19:30
【问题描述】:

我正在尝试在 Oracle PL/SQL 中创建一个过程,目前我正在努力使用以下代码:

 CREATE OR REPLACE PROCEDURE MyProcedure(
   cName number, 
   cStatus varchar2
  ) AS
  BEGIN
    declare recCount;
    BEGIN
      select count(*) 
        into recCount 
        from myTable 
      where colName=cName 
        AND colStatus=cStatus;
    END;
    If recCount = 0 Then
      do something...
    Else
      do something else...
    End if;
      COMMIT;
    END;

基本上我想计算一张表中的行数,然后检查表中是否已经有一定数量的行。目前我收到 PLS-00103 错误。

我搜索了很多解决方案,但不幸的是没有任何效果。我对 oracle sql 比较陌生,所以也许我犯了一个常见的错误。

感谢您的时间和精力。

【问题讨论】:

标签: oracle plsql


【解决方案1】:

您的syntax 中有一些问题:

  • DECLARE 在过程定义中有错误;例如,您可以使用 DECLARE 构建一个匿名块,您需要在其中声明变量 (DECLARE ... BEGIN ... END) 或在触发器定义中。
  • 你需要为变量recCount指定一个类型,变量定义在BEGIN之前
  • 你有一个不必要的BEGIN...END 块;这不是错误,但该块在这里没有用;只有在代码的特定部分添加异常处理才会有用

我什至会考虑添加一些异常处理;这里我举一个OTHERS的例子,但是你最好根据你的代码指定要处理的异常。

另外,正如 MT0 的评论中已经注意到的那样,COMMIT 不是一个好主意。

CREATE OR REPLACE PROCEDURE MyProcedure(cName NUMBER, cStatus VARCHAR2) AS
    recCount                                NUMBER;
BEGIN
    SELECT COUNT(*)
      INTO recCount
      FROM myTable
     WHERE     colName = cName
           AND colStatus = cStatus;

    IF recCount = 0
    THEN
        -- your code
    ELSE
        -- your code
    END IF;

    COMMIT;
EXCEPTION
    WHEN OTHERS THEN
         -- exception handling    
END;

如果只需要检查一行是否存在,那么无论有多少行匹配条件,都可以避免计算所有匹配的行,通过添加条件只获取一行:

SELECT COUNT(*)
  INTO recCount
  FROM myTable
 WHERE     colName = cName
       AND colStatus = cStatus
       AND rownum = 1;

您甚至可以使用它在过程中构建一个带有异常处理的块的示例(我只是将其作为示例发布,我不喜欢这种方法):

BEGIN       
    SELECT 1
      INTO recCount
      FROM myTable
     WHERE     colName = cName
           AND colStatus = cStatus
           AND rownum = 1;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        recCount := 0;
END;  

【讨论】:

  • 请添加错误解释(为了 OP 和未来访问者的利益) - 像声明变量这样的事情需要说明它的数据类型,而不仅仅是它的名称;关键字declare 用于匿名块,而不是命名过程等。了解最初尝试的问题可能与如何正确处理一样有帮助和指导。
  • ...异常处理没问题,但是when others then 不应该被初学者使用。 (实际需要的情况可能非常少,但都是“高级”的情况。)
  • 我会在查询中添加一个and rownum = 1 条件,或者将其重写为exists,因为它似乎是一个不需要完整计数的存在检查。跨度>
  • @mathguy, @William Robertson:刚刚编辑,感谢您的建议
猜你喜欢
  • 2012-04-29
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 2014-03-22
  • 2014-12-02
相关资源
最近更新 更多