Oracle
 sql >> база данни >  >> RDS >> Oracle

NO_DATA_FOUND изключение не е хвърлено, когато се използва в SELECT INTO

Минимален пример е:

CREATE FUNCTION raise_exception RETURN INT
IS
BEGIN
  RAISE NO_DATA_FOUND;
END;
/

Ако го направите:

SELECT raise_exception
FROM   DUAL;

Ще получите един ред, съдържащ NULL стойност - Попитайте Том заявява:

и след това последва с:

Така че изключението се повдига във функцията и SQL клиентът вижда това и интерпретира това, тъй като няма данни, които са NULL стойност и "обработва" изключението.

И така

DECLARE
  variable_name VARCHAR2(50);
BEGIN
  SELECT raise_exception
  INTO   variable_name
  FROM   DUAL
END;
/

Ще успее като DUAL таблицата има един ред и изключението от функцията ще бъде обработено (тихо) и променливата в крайна сметка ще съдържа NULL стойност.

Въпреки това,

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

Изключението е, че този път се предава от функцията към PL/SQL обхват - който не обработва грешката и предава изключението на блока за обработка на изключения (който не съществува), така че след това се предава до обхвата на приложението и прекратява изпълнението на програмата.

И Попитайте Том гласи:

Сега, ако променим функцията, за да предизвикаме различно изключение:

CREATE OR REPLACE FUNCTION raise_exception RETURN INT
IS
BEGIN
  RAISE ZERO_DIVIDE;
END;
/

След това и двете:

SELECT raise_exception
FROM   DUAL;

и:

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

не знам как да се справя с изключението и да прекратя с ORA-01476 divisor is equal to zero .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Еквивалентни ли са изразът CASE и DECODE?

  2. Търсене на даден низ във всички полета на цяла схема за Oracle

  3. ORA-06508:PL/SQL:не можа да намери извикан програмен модул

  4. как мога да използвам низ за връзка заедно с jdbc url

  5. Ограничение на Hibernate + Oracle IN клауза, как да го разрешим?