程序if(从表中选择计数(列))> 0然后

时间:2017-02-15 15:19:47

标签: oracle plsql

我正在尝试在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比较新,所以也许我犯了一个常见的错误。

感谢您的时间和精力。

1 个答案:

答案 0 :(得分:3)

您的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;