Обработка исключения 1) при определении функции Oracle 2) при вызове функции Oracle - PullRequest
0 голосов
/ 22 июня 2019

Моя функция Oracle ниже (code1) не имеет обработки исключений.Поэтому, если он вызывается (code2) с 0, появляется ошибка.

--Code 1
CREATE OR REPLACE FUNCTION TEST2
    (P1 IN VARCHAR2)
    RETURN NUMBER AS V_VALUE NUMBER;
    BEGIN
    SELECT(
        SELECT 1/TO_NUMBER(P1)
        FROM DUAL
        )
INTO V_VALUE
FROM DUAL;
RETURN V_VALUE;
END;
/

--Code2 
SELECT TEST2('0') FROM DUAL;

Пожалуйста, помогите добавить обработку исключений для каждого 1) 2) случая, как показано ниже.

case 1) когдаопределяющая функция, как изменить code1 для функции, возвращающей -1, если произошло системное исключение, включая деление на ноль?

case 2) Без добавления исключения в моей функции Oracle, как изменить code2 для результата?-1 если в функции происходит системное исключение, включая деление нуля?

Ответы [ 2 ]

1 голос
/ 22 июня 2019

@ OldProgrammer показывает, как предотвратить возникновение исключения, что является лучшим выбором. Однако, если вы хотите разрешить возникновение исключения и перехватить его в функции, которую вы можете использовать:

CREATE OR REPLACE FUNCTION TEST2(P1 IN VARCHAR2)
  RETURN NUMBER
AS
  V_VALUE  NUMBER;
BEGIN
  BEGIN
    V_VALUE := 1 / TO_NUMBER(P1);
  EXCEPTION
    WHEN OTHERS THEN
      V_VALUE := -1;
  END;

  RETURN V_VALUE;
END TEST2;

или вы можете упростить это до

CREATE OR REPLACE FUNCTION TEST2(P1 IN VARCHAR2)
  RETURN NUMBER
AS
BEGIN
  RETURN 1 / TO_NUMBER(P1);
EXCEPTION
  WHEN OTHERS THEN
    RETURN -1;
END TEST2;

Удачи.

1 голос
/ 22 июня 2019

Я думаю, вы делаете это более сложным, чем нужно.Я не скомпилировал этот код ниже, но должен привести в качестве примера.Что касается исключений, то можно обрабатывать деление на ноль, но скрывать все другие типы исключений очень и очень плохо.Кроме того, если я передам test2 (-1), то результатом будет допустимое значение -1.Вы уверены, что ваш входной параметр всегда положительный?Независимо от этого, здесь есть решение, которое проверяет параметр 0 и избегает проблемы деления.Лучшее решение - определить для начала TEST1 P1 как NUMBER и позволить вызывающей стороне отформатировать его при необходимости.Если нет, я мог бы передать что-то вроде TEST2 ('fsfd') и получить исключение.

CREATE OR REPLACE FUNCTION TEST2(P1
                       IN VARCHAR2)
    RETURN  NUMBER;
    D_Result NUMBER : = -1;

    BEGIN
    IF P1 <> 0 THEN
      D_result := 1/TO_NUMBER(P1);
    END IF;
RETURN D_Result;
END

Если вы действительно хотите выбросить ошибку деления, вы можете перехватить это так:

DECLARE
    result NUMBER;
BEGIN
    result := test2(0);
 EXCEPTION
    WHEN OTHERS THEN
      result := -1;

END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...