Значение входа функции PL / SQL не соответствует входному параметру функции - PullRequest
1 голос
/ 18 марта 2020

Сегодня днем ​​я создал эту функцию PL / SQL:

CREATE OR REPLACE FUNCTION CHECK_CIN_CLOSED_LINE
    (combination IN VARCHAR2 DEFAULT '') 

   RETURN BOOLEAN 

IS 
    solution BOOLEAN := false;

    cursor c1 is
        SELECT (1)
        FROM RS2QTCIN cin, RS2QTGIN gin
        WHERE cin.group_id = gin.id
        AND cin.cin_value = combination
        and cin.date_end is not null;
    my_c1 c1%rowtype;
BEGIN
   open c1;

   FETCH c1 INTO my_c1;

   IF c1%NOTFOUND THEN
        IF c1%ROWCOUNT != 0 THEN
            solution := true;
        END IF;
   END IF;

   close c1;

RETURN solution;

EXCEPTION
WHEN OTHERS THEN
   raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
END;

Проблема возникает при тестировании с помощью простого вызова. Например:

select check_cin_closed_line('1PW2+UB07') from dual;
select CHECK_CIN_CLOSED_LINE('') from dual;

Оба тестовых вызова возвращают ошибку неверного типа данных (ORA-00902 - 00902. 00000 - «неверный тип данных»). Я не понимаю причину этой ошибки, входной параметр переменная varchar2 и входное значение является значением varchar.

1 Ответ

3 голосов
/ 18 марта 2020

Логический тип данных доступен только в PL SQL, а не в SQL

Обратите внимание, что если вы прокомментируете большую часть тела функции, вы получите та же ошибка:

CREATE OR REPLACE FUNCTION check_cin_closed_line (
    combination IN VARCHAR2 DEFAULT ''
) RETURN BOOLEAN IS
    solution BOOLEAN := false;

--    cursor c1 is
--        SELECT (1)
--        FROM RS2QTCIN cin, RS2QTGIN gin
--        WHERE cin.group_id = gin.id
--        AND cin.cin_value = combination
--        and cin.date_end is not null;
--    my_c1 c1%rowtype;
BEGIN
--   open c1;
--
--   FETCH c1 INTO my_c1;
--
--   IF c1%NOTFOUND THEN
--        IF c1%ROWCOUNT != 0 THEN
--            solution := true;
--        END IF;
--   END IF;
--
--   close c1;
    RETURN solution;
EXCEPTION
    WHEN OTHERS THEN
        raise_application_error(-20001, 'An error was encountered - '
                                        || sqlcode
                                        || ' -ERROR- '
                                        || sqlerrm);
END;

Проверка:

SELECT
    check_cin_closed_line('1PW2+UB07')
FROM
    dual;


SELECT
    check_cin_closed_line('')
FROM
    dual;

enter image description here

Вы можете использовать тип данных BOOLEAN в PL SQL , но не в качестве возвращаемого типа.


Что можно сделать?

Поскольку вы можете использовать типы данных BOOLEAN в PL SQL, и вы хотите посмотрите результаты этого вызова функции, возможно, используйте анонимный блок PL SQL и используйте оператор CASE, чтобы раскрыть значение возвращаемого значения BOOLEAN:

BEGIN
    dbms_output.put_line(
        CASE
            WHEN check_cin_closed_line('1PW2+UB07') THEN
                'true'
            ELSE 'false'
        END
    );
END; 
...