在pl sql中使用boolean

时间:2012-11-26 06:57:33

标签: oracle plsql

我在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;

编辑:

我也尝试过这个:

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 帮助!

2 个答案:

答案 0 :(得分:15)

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;

如果查询返回除1行以外的任何内容,则SELECT INTO将生成错误。在这种情况下,如果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;

答案 1 :(得分:9)

或者,您可以使用Oracle函数diutil.bool_to_int将布尔值转换为整数:True - > 1,假 - > 0

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