如何在 Oracle PL/SQL 中处理“超过请求的行数”

Posted

技术标签:

【中文标题】如何在 Oracle PL/SQL 中处理“超过请求的行数”【英文标题】:How to handle "more than requested number of rows" in Oracle PL/SQL 【发布时间】:2021-02-08 17:31:50 【问题描述】:

如果员工工作超过 18 年,我的代码会打印“是”,否则会打印“否”。但我收到一条错误消息,提示“精确提取返回的行数超过请求的行数”。

代码如下:

DECLARE 
    currentDate NUMBER;
    hireDate NUMBER;
BEGIN
      select EXTRACT(year from sysdate) into currentDate from dual;
      select EXTRACT(year from hire_date) into hireDate from employees;
      
    IF (currentDate - hireDate) > 18 THEN
       DBMS_OUTPUT.PUT_LINE('YES');
    ELSE
       DBMS_OUTPUT.PUT_LINE('NO');
    
    END IF;

END;

我该如何处理这个错误?

谢谢!

【问题讨论】:

【参考方案1】:

我想你需要 WHERE 子句来获得特定的员工。 您可以直接在 IF 子句中使用函数 EXTRACT(year from sysdate)。 您可以处理诸如 TOO_MANY_ROWS 和 NO_DATA_FOUND 之类的异常:

DECLARE
  hireDate NUMBER;
BEGIN

  SELECT EXTRACT(year from hire_date)
    INTO hireDate
    FROM employees
   WHERE employee_id = &empId;

  IF (EXTRACT(year from sysdate) - hireDate) > 18 
  THEN
    DBMS_OUTPUT.PUT_LINE('YES');
  ELSE
    DBMS_OUTPUT.PUT_LINE('NO');
  END IF;

EXCEPTION
  WHEN NO_DATA_FOUND then
    DBMS_OUTPUT.PUT_LINE('Caught raised exception NO_DATA_FOUND');
  WHEN TOO_MANY_ROWS then
    DBMS_OUTPUT.PUT_LINE('Caught raised exception TOO_MANY_ROWS');
  WHEN OTHERS then
    RAISE_APPLICATION_ERROR(-20002, SQLERRM || ' on select employees');
END;

【讨论】:

以上是关于如何在 Oracle PL/SQL 中处理“超过请求的行数”的主要内容,如果未能解决你的问题,请参考以下文章

如何计算oracle pl/sql中数字的位数?

ORACLE PL/SQL:函数和可选参数,如何?

Oracle PL/SQL编程

Oracle --- PL/SQL

Oracle --- PL/SQL

Oracle --- PL/SQL