【问题标题】:raise Exception inside if condition in plsql在plsql中的if条件内引发异常
【发布时间】:2022-02-21 22:32:39
【问题描述】:
declare
      cnt number; 
begin
      select count(*)
      into cnt
       FROM employee;
       IF cnt = 0 THEN
               DELETE employee;
               COMMIT;
            EXCEPTION
            WHEN others THEN
               log_error_local(k_sub_module, l_step||' '||sqlerrm);
       raise;
       END IF;
    end

出现如下语法错误.. 错误(188,13):PLS-00103:在预期以下情况之一时遇到符号“EXCEPTION”:(begin case declare else elsif end exit for goto if loop mod null pragma raise return select update while with

【问题讨论】:

  • 如果有员工,则计算,如果没有员工,则删除所有员工;因为那时您知道没有员工,那么DELETE 似乎毫无意义。你想达到什么目的?
  • 理想情况下,您的log_error_local 过程将捕获sqlerrm 本身,而不是要求开发人员将其连接到每个调用中。

标签: sql oracle plsql


【解决方案1】:

要解决您的语法问题,您可以将 IF .. THEN 语句的内容包装在 BEGIN/END 块中:

DECLARE
  cnt number; 
BEGIN
  select count(*)
  into cnt
  FROM employee;
  
  IF cnt = 0 THEN
    BEGIN
      DELETE FROM employee;
      COMMIT;
    EXCEPTION
      WHEN OTHERS THEN
        log_error_local(k_sub_module, l_step||' '||sqlerrm);
        raise;
    END;
  END IF;
END;
/

注意:DELETE 语句缺少 FROM 关键字,并且您似乎没有声明 k_sub_modulel_step 变量。

或者,由于您正在重新引发异常并且无论如何都会停止执行,因此在主块中的 IF 语句之外捕获异常:

DECLARE
  cnt number; 
BEGIN
  select count(*)
  into cnt
  FROM employee;
  
  IF cnt = 0 THEN
    DELETE FROM employee;
    COMMIT;
  END IF;
EXCEPTION
  WHEN OTHERS THEN
    log_error_local(k_sub_module, l_step||' '||sqlerrm);
    raise;
END;
/

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多