Использование логического в PL/SQL

У меня есть функция в PL/SQL, которая проверяет, существует ли конкретный emp_id или нет:

CREATE OR REPLACE FUNCTION checkEmpNo(eno numeric)
RETURN boolean IS
    emp_number number;
BEGIN
    SELECT emp_id INTO emp_number
    FROM emp;
    IF eno=emp_number
    THEN
        return true;
    ELSE
        return false;
    END IF;
END checkEmpNo;

Функция успешно компилируется, но когда я пытаюсь запустить ее как:

DECLARE
    exist boolean;
BEGIN
    exist=checkEmpNo(1);
    dbms_output.put_line(exist);
END;

возвращает ошибку:

ORA-06550: line 5, column 1:
PLS-00306: wrong number or types of arguments in call to 'PUT_LINE'
ORA-06550: line 5, column 1:
PL/SQL: Statement ignored

3. BEGIN
4. exist:=checkEmpNo(1);
5. dbms_output.put_line(exist);
6. END;

EDIT:

Я также попробовал это:

DECLARE
    exist boolean:=true;
BEGIN
    if(exist=checkEmpNo(1))
    then
        dbms_output.put_line('true');
    else
        dbms_output.put_line('false');
    end if;
END;

И он возвращает ошибку: ORA-01422: exact fetch returns more than requested number of rows

Ответ 1

dbms_output.put_line не перегружается, чтобы принять логический аргумент. Вы можете сделать что-то вроде

dbms_output.put_line( case when exist = true 
                           then 'true'
                           else 'false'
                        end );

чтобы преобразовать логическое значение в строку, которую вы затем можете передать в dbms_output.

Ошибка ORA-01422 - это совершенно отдельная проблема. Функция checkEmpNo включает оператор SELECT INTO

SELECT emp_id 
  INTO emp_number
  FROM emp;

A SELECT INTO генерирует ошибку, если запрос возвращает что-либо, кроме 1 строки. В этом случае, если в таблице emp имеется несколько строк, вы получите сообщение об ошибке. Я предполагаю, что вы хотите, чтобы ваша функция сделала что-то вроде

CREATE OR REPLACE FUNCTION checkEmpNo(p_eno number)
  RETURN boolean 
IS
  l_count number;
BEGIN
  SELECT count(*)
    INTO l_count
    FROM emp
   WHERE emp_id = p_eno;

  IF( l_count = 0 )
  THEN
    RETURN false;
  ELSE
    RETURN true;
  END IF;
END checkEmpNo;

Ответ 2

В качестве альтернативы вы можете использовать функцию Oracle diutil.bool_to_int для преобразования логического значения в целое число: True → 1, False → 0.

dbms_output.put_line(diutil.bool_to_int(p_your_boolean));