如何在 Oracle PL/SQL 中处理 "more than requested number of rows"
How to handle "more than requested number of rows" in Oracle PL/SQL
如果员工工作超过 18 年,我有一个代码打印“是”,否则打印“否”。但是我得到一个错误,告诉我“精确提取 returns 多于请求的行数”。
代码如下:
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;
如何处理这个错误?
谢谢!
我想您需要 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;
如果员工工作超过 18 年,我有一个代码打印“是”,否则打印“否”。但是我得到一个错误,告诉我“精确提取 returns 多于请求的行数”。
代码如下:
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;
如何处理这个错误?
谢谢!
我想您需要 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;