Использование логического в 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));